使用threejs简单Web3D效果

目录

1. threejs介绍

2. thresjs的使用

3. 组件介绍

4. threejs的动画

5. 参考资料


前几天在网上看到一个threejs的实现的web 3d的动画,很炫酷,所以特地去了解了一下threejs。我们首先看下官方使用threejs实现的效果:

 

1. threejs介绍

threejs是基于原生WebGL API和着色器封装得到的3D引擎,也就是一个.js库。直接通过原生WebGL直接编写程序,会比较麻烦,所以threejs就对WebGL做了一层封装,这样方便web开端的去开发web 3d的应用。

所以WebGL是threejs的基础,简单的项目一般也用不到底层WebGL知识,不过学习WebGl有助于深入理解threejs,如果使用Three.js开发项目需要自定义着色器的时候,肯定也是要学习底层WebGL和着色器GLSL知识。

2. thresjs的使用

首先我们看下我们实现的示例效果,实现一个可以鼠标操作的圆柱体:

代码实现:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>My first three.js app</title><style>body { margin: 0; }</style>
</head>
<body>
<script src="js/three.js"></script>
<script src="js/OrbitControls.js"></script>
<script>/*** 场景对象创建*/const scene = new THREE.Scene();/*** 立方体几何对象Geometry*/const geometry = new THREE.BufferGeometry(); //创建一个Buffer类型几何体对象//类型数组创建顶点数据const vertices = new Float32Array([0, 0, 0,        //顶点1坐标50, 0, 0,       //顶点2坐标0, 100, 0,      //顶点3坐标0, 0, 10,       //顶点4坐标0, 0, 100,      //顶点5坐标50, 0, 10,      //顶点6坐标]);// 创建属性缓冲区对象const attribue = new THREE.BufferAttribute(vertices, 3); //3个为一组,表示一个顶点的xyz坐标// 设置几何体attributes属性的位置属性geometry.attributes.position = attribue;/*** 材质对象*/const material = new THREE.MeshBasicMaterial({color: 0x0000ff,            //三角面颜色side: THREE.DoubleSide      //两面可见});/*** 网格模型对象Mesh,通过几何对象和几何对象的材质构造*/const cube = new THREE.Mesh(geometry, material);scene.add( cube );/*** 辅助坐标系  参数250表示坐标系大小,可以根据场景大小去设置*/var axisHelper = new THREE.AxesHelper(250);scene.add(axisHelper);/*** 光源设置*///点光源1var point = new THREE.PointLight(0xffffff);point.position.set(400, 200, 300); //点光源位置scene.add(point); //点光源添加到场景中// 点光源2  位置和point关于原点对称var point2 = new THREE.PointLight(0xffffff);point2.position.set(-400, -200, -300); //点光源位置scene.add(point2); //点光源添加到场景中//环境光var ambient = new THREE.AmbientLight(0x444444);scene.add(ambient);/*** 相机设置* @type {PerspectiveCamera}*/var width = window.innerWidth;              //窗口宽度var height = window.innerHeight;            //窗口高度var k = width / height;                     //窗口宽高比var s = 500;                                //三维场景显示范围控制系数,系数越大,显示的范围越大//创建相机对象const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);// const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );camera.position.set(200, 300, 200);             //设置相机位置camera.lookAt(scene.position);                  //设置相机方向(指向的场景对象)// camera.position.z = 5;/*** 渲染器*//* WebGLRender */const renderer = new THREE.WebGLRenderer();renderer.setSize( window.innerWidth, window.innerHeight );renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色document.body.appendChild( renderer.domElement );/*** 手动操作* */function render(){renderer.render(scene,camera);}render()var controls = new THREE.OrbitControls(camera, renderer.domElement);controls.addEventListener('change', render);//监听鼠标、键盘事件
</script>
</body>
</html>

代码中已经添加了很详细的注释,我们主要说一下主要的构成:

  • 1. 场景(Scene)构成: 场景主要分网格模型(Mesh)和光源(Light)。网格模型主要是用来构造场景中几何体结构的,我们可是用各种几何题搭建一个整个的框架结构, 而材料则是更像web中的样式,给几何去构建颜色,透明度等。 另外一个是光源, 光源就相当于我们给上述网格模型来增加明暗程度, 当我们给他增加更强的光源时,它应该就变的更亮了。在3D结构中,不同的光照有不同的明暗阴影效果,才能显示空间立体感。 代码中我们通过创建了相应的网格模型Mesh和光源(Light),添加到Scene的对象来构建
  •  相机(Camera):相机主要为场景中的机构提供一种视角。场景已经构建为3D的模型,而3D结构是三位的立体场景,人眼直线也看不到每个面的情况,所以这里提供的Camera是提供了一个观看的视角,通过不同的相机的视角,我们可以从不同的位置,不同的视线方向去看到三维立体结构的不同方位,不同距离做产生的效果。这个就像我们实际使用相机差不多,我们要拍一个图片,就需要选择不同的位置和角度。
  • 渲染器(Render):  通过上面的场景和相机我们已经构建出了虚拟的三位立体场景,相机的位置和角度也设置好了,那么剩下就是拍照了。拍照就相当于是在二维的web平面上去展示3D的立体效果在某个视角的一个图片效果。当我们换一个视角,渲染器也不会有不同的投影效果。

参考一下文末资料的渲染过程图:

3. 组件介绍

   我们已经大概知道threejs的一个构建过程和渲染流程。通过上面的示例,整个程序的构成如下图(参考资料图片):

 在上面的示例中,我们通过上述的这些组件构建了一个threejs的3d应用, 而后续学习也主要是围绕该组件中的各个结构去展开。

4. threejs的动画

threejs中动画分为两种: 1. api提供的周期性动画,2. 基于手动操作的动画

api提供的周期动画主要是按周期,定时的去刷新或者变换某些属性,例如旋转角之类。我们可以自己使用js的定时器实现,也可借助requestAnimationFrame的实现。

基于手动操作的动画,主要是在响应用户操作的使用,根据用户操作结果,来某些属性的变换和刷新。例如上面的示例中,我们使用了一种根据实际用户操作来响应的动作,物体会根据实际拖动去旋转。上面我们使用官方示例提供的一个操作库:

https://raw.githubusercontent.com/mrdoob/three.js/dev/examples/js/controls/OrbitControls.js

5. 参考资料

官方文档: https://threejs.org

threejs中文网: Three.js教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1550165.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

几种Web3D技术的比较

1 引 言 虚拟现实(VirtualReality,简称VR)技术是一种逼真地模拟人在自然环境中的视觉、听觉、运动等行为的人机界面技术。由于虚拟现实具有实时的三维空间表现能力、提供了人机交互式的操作环境以及给人带来了身临其境的感受,它正成为继多媒体之后的又一个研究和应用的热点,开…

Web3D发展趋势以及Web3D应用场景

1&#xff0c;Web3D发展趋势 随着互联网的快速发展&#xff0c;Web3D技术也日渐成熟&#xff0c;未来发展趋势也值得关注。以下是Web3D未来发展趋势的七个方面&#xff1a; 可视化和可交互性的增强&#xff1a;Web3D可以为三维数据提供可视化和可交互性的增强&#xff0c;将极大…

Web 3D 从入门到跑路

大厂技术 坚持周更 精选好文 前情概要 作为在该领域小白的我&#xff0c;在准备该主题分享之前&#xff0c;我信心满满的去知乎查了下&#xff0c;如何学习 WebGL&#xff1f; 如何入手webGl以及three.js呢? - 知乎[1] 前端开发者应该如何学习计算机图形学相关的知识? - 知…

什么是Web3D?Web3D技术发展历程以及Web3D应用场景

当今的互联网已经迈入了第三代&#xff0c;这被称为Web3.0&#xff0c;而Web3D正是Web3.0的其中一个技术分支。Web3D是指将三维图形技术应用于Web上的技术&#xff0c;它是将3D图形和Web技术结合起来的一个分支&#xff0c;可以使用户在Web上以更真实、更直观的方式浏览和操作虚…

Web3D 从入门到跑路 · 3D 初体验

3D初体验 本文整理自老冯于 凹凸 2022 年技术分享&#xff0c;带领大家从案例、应用、技术生态出发&#xff0c;让大家了解一下 3D 在 Web 端的现状。 Hey 3D whats up&#xff0c;最近在Web圈混得怎样 在“元宇宙”概念越来越火热的背景下&#xff0c;我们准备了一系列的 3D…

20151021

题目一给定一个无序数组&#xff0c;请调整该数组&#xff0c;调整成奇数放在数组的左边&#xff0c;偶数放在数组的右边。但是奇数与奇数之间的相对顺序不变&#xff0c;偶数和偶数之间的相对顺序也不变。要求思考&#xff1a;如果额外空间复杂度必须为O(1)&#xff0c;时间复…

独家专访阿里集团副总裁贾扬清:我为什么选择加入阿里巴巴?

真正跟贾扬清近距离接触后笔者发现&#xff0c;这位被很多人称为“AI 架构大神”的 80 后青年科学家&#xff0c;更像一位温柔且平易近人的邻家“学霸”&#xff0c;虽然技能全面碾压但丝毫没有架子。加入阿里以来&#xff0c;贾扬清一直忙于了解集团覆盖范围极广的各项产品和业…

龙蜥白皮书精选:云原生混部资源隔离技术

文/云原生 SIG 01 技术方案简介 混部就是将不同类型的业务在同一台机器上混合部署起来&#xff0c;让它们共享机器上的 CPU、内存、IO 等资源&#xff0c;目的就是最大限度地提高资源利用率&#xff0c;从而降低采购和运营等成本。 混部通常是将不同优先级的任务混合在一起&a…

windows10系统装cad2007提示缺少NET组件

2019独角兽企业重金招聘Python工程师标准>>> 打开控制面板-->找到 程序 选择 启用或关闭windows功能 打开.NET Framework3.5(默认它是关闭的)&#xff0c;然后确定 这时windows会提示要更新下载&#xff0c;确认即可&#xff0c;等待下载完成再重新运行CAD2007安…

AUTOCAD2007安装过程中遇到的问题以及解决方法

1.卸载CAD2007时提示“错误1316&#xff0c;指定的账户已存在 WINR打开注册表 点击HKEY_LOCAL_MACHINE->SOFTWARE->Classes->installer->products->7D2F 将7D2F开头的整个文件删除&#xff0c;即可安装。 CAD2007执行上述操作后重新安装时会部分会提示错误130…

lisp倒入excel数据画图_如何将EXCEL中的数据导入CAD2007画图

展开全部 bai 1、打开Excel&#xff0c;输入数据du。 zhi2、复制B列的数据。打开CAD&#xff0c;输入dao“内pl”,回车。容然后在命令行直接“CtrlV”可以以这些点直接生成一条多段线。 3、其实CAD是可以读取从Excel在复制过去的内容的。那么我们就可以把所有可以在命令行输入…

CAD二次开发--CAD2007(.Net3.5环境)等低版本CAD二次开发在VS中无法捕获断点调试解决办法(CAD二次开发无法断点调试解决办法)

目录 1.说明 2.解决办法 1.说明 在进行CAD二次开发的时候如果想进行断点调试,众所周知,在VS环境里设置断点后直接启动类库项目就好了,只需要在启动项属性里设置下“启动外部程序”就可以了,设置成cad安装目录中的acad.exe。 这样当程序运行到断点处就会自动捕获!!!!…

w ndows7和CAD哪款兼容,win7与cad2008不兼容,cad2007和win7不兼容

CDA是一款非常好的制图软件&#xff0c;如果是需要制图的朋友都知道cad对与制图的重要性&#xff0c;最近有朋友在win7系统中安装cad2007的时候发现无法安装&#xff0c;开始的时候是提示缺少.net framework 2.0 runtime&#xff0c;后来在网上查阅了资料之后发现需要先安装net…

linux常会用到的命令

查看gpu上运行的进程&#xff1a; nvidia-smi 查看进程的完整信息 ps -f -p 进程号 搜索含有指定字符的进程信息&#xff0c;如radar ps -ef|grep radar 复制文件时排除某个文件夹&#xff0c;如从源路径中排除data rsync -av --excludedata/ 源路径 目标路径查看磁盘占用…

期权分仓开户资金是否安全?具体保障措施有哪些?

网上关于期权分仓系统的真假一直都没有定论&#xff0c;两方人的争论也让很多没有接触过期权分仓系统的人摸不着头脑&#xff0c;那么期权分仓靠谱吗&#xff1f;资金在里面安全吗&#xff1f;下文为大家科普期权分仓开户资金是否安全?具体保障措施有哪些&#xff1f; 一、期权…

SQL Server 执行报错: “minus“ 附近有语法错误。

sql server 执行带 minus 的语句一直报错&#xff0c;如下图&#xff1a; 找了好久才知道minus是Oracle里面的语法&#xff0c;SQL server 应用 EXCEPT。

华硕笔记本返厂维修流程_笔记本不能更换显卡为何又叫独立显卡?

首先&#xff0c;笔记本的显卡不是不能更换&#xff0c;只是换起来比较麻烦。因为是和主板焊在一起的&#xff0c;用专业工具是可以更换的。 其次是独立显卡是区别于核心显卡(集成在CPU内部&#xff0c;显存使用系统内存)的&#xff0c;也就是有独立的显卡核心和显存等配件。而…

dell笔记本显卡报错43解决方法

dell笔记本显卡报错43解决方法 方法一方法二 方法一 使用笔记本自带的supportAssist 选择第二项中的我想检查硬件的特定部分找到报错的显卡 选择视频压力测试 途中电脑卡住或者是蓝屏等待重启再次运行,如果软件无法打开提示重启且重启后无效果可以在应用与功能中找到suppor…

macbook linux 双显卡,网友支招:苹果笔记本也能双显卡切换

泡泡网笔记本频道7月8日 最近在浏览泡泡的时候看到有一篇介绍双显卡笔记本的文章&#xff0c;作为苹果的粉丝——大家知道的&#xff0c;我满心欢喜的点击进入这篇文章&#xff0c;期望MacBook Pro能够在以强悍的性能&#xff0c;优雅的界面&#xff0c;便捷的切换。将那些阿猫…