摘要:创建场景标签本节目标是为做简介。我们从使用旋转立方体来搭建场景开始。我们现在创建了场景,摄像机和渲染器。我们需要来创建立方体。这会导致摄像机和立方体内部重叠。这会创建一个让渲染器每秒绘制一帧的循环。结果恭喜你现在创建好了第一个应用。
1.创建场景
标签: three.js
本节目标是为 three.js 做简介。我们从使用旋转立方体来搭建场景开始。如果遇到困难需要帮助,页面底部有可参考的源码。
开始前在计算机中保存如下 HTML 代码,并在 js 目录下包含 three.js,然后在浏览器中打开
My first three.js app
接下来的代码都会下载 script 标签中
创建示例场景为了利用three.js来进行展示,我们需要三种元素:场景,摄像机,渲染器,以便来渲染摄像机中的场景。
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement );
让我们花点时间来解释发生了什么。我们现在创建了场景,摄像机和渲染器。
在 three.js 中有几种摄像机。我们暂时用的是 PerspectiveCamera (透视摄像机)
它的第一个属性是视图角(FOV),它 是能看见的视图范围,其值表示角度大小。
第二个属性是宽高比。大多数情况你想要使用被高除过之后的宽度,不然会发生像在宽屏电视上放旧电影的情况 —— 图像看起来被压扁了。
后面两个属性是近景面和远景面。只会渲染这两个面之间的区域。目前你不必关心这些,使用这些参数能提高性能。
接下来谈谈渲染器。这便是神奇之处。除了我们这里用的 WebGLRenderer 外, three.js 还提供一些渲染器用在不支持 WebGL 的老旧浏览器上。
除了创建渲染器实例,我们也需要设置应用渲染的尺寸。推荐使用填充整个应用的宽高 —— 本例中是浏览器窗口的宽高。对于性能优先的应用,你能使用 setSize 来设置更小的值,比如 window.innerHeight/2, window.innerWidth/2,会渲染一半的尺寸。
如果你想低分辨率地渲染整个尺寸,你可以设置 setSize 的第三个参数 — uodateStyle 为 false,如果 canvas 元素宽高都为 100%,则会以 1/2 分辨率渲染应用。
再尔,我们需要在 HTML 中添加被渲染的元素。渲染器通过 canvas 来给我们展示场景。
“都很好,但之前说的立方体呢” 让我们现在添加。
var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); var cube = new THREE.Mesh( geometry, material ); scene.add( cube ); camera.position.z = 5;
我们需要 BoxGeometry来创建立方体。这个对象包含立方体所有的点(顶点)和填充(面)。我们以后会讨论。
除了几何体外,我们还需要材质为其上色。three.js 提供了一些材质,但我们暂且使用 MeshBasicMaterial。所有材质接受并应用一个包含所有属性的对象。为简单起见,我们仅仅提供一个颜色属性: 绿色 —— 0x00ff00。和 CSS 和 PS 里的一样采用十六进制的颜色。
我们需要的第三个要素是 Mesh。 mesh 是一个将材质应用到几何体上的对象,然后我们能将其放入场景中,并自由移动。
当我们调用 scene.add(),我们添加的会默认显示在坐标(0,0,0,)处。这会导致摄像机和立方体内部重叠。为了避免这点,我们简单地把摄像机往外移一点。
渲染场景如果你在 HTML 文件中复制了如上代码,屏幕不会显示东西。因为我们还没渲染场景。所以我们需要调用渲染器或者动画循环。
function animate() { requestAnimationFrame( animate ); renderer.render( scene, camera ); } animate();
这会创建一个让渲染器每秒绘制一帧的循环。如果你对网页游戏编程不了解,你可能会说“为什么不 写setInterval 函数呢?”事实上,我们可以,但是 requestAnimationFrame 好处更多。最重要的好处是当浏览器切换到另一个标签页时,requestAnimationFrame 会暂停渲染,因此不会浪费宝贵的处理能力和电池寿命。
让立方体动起来如果你插入了我们刚刚创建的代码,你应该会看见一个绿色的立方体。让它旋转起来不至于单调。
在animate 函数中的 renderer.render 上添加如下代码:
cube.rotation.x += 0.01; cube.rotation.y += 0.01;
它会按帧运行(每秒60帧),并赋予立方体优雅的动画。基本上,应用运行时,你想移动或改变任何元素,必须通过动画循环。你当然在此处能调用其他函数,以免animate函数上百行代码结尾。
结果恭喜!你现在创建好了第一个 three.js 应用。很简单,但总得突破。
完整代码参考如下。琢磨一下并深刻理解其工作机理
My first three.js app
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/89500.html
摘要:对于自身不能发光的物体,需要给场景添加光源从而达到可视的效果。中渲染阴影的开销比较大,所以默认物体是没有阴影的,需要单独开启。主要用于检测动画运行时的帧数,可以显示表示每秒多少帧和每帧多少毫秒,越大越好,但太大会影响性能,一般为左右。 一、WebGL 与 three.js WebGL(Web Graphics Library)是一种3D绘图协议,它允许把JavaScript和OpenG...
摘要:在文末,我会附上一个可加载的模型方便学习中文艺术字渲染用原生可以很容易地绘制文字,但是原生提供的文字效果美化功能十分有限。 showImg(https://segmentfault.com/img/bVWYnb?w=900&h=385); WebGL 可以说是 HTML5 技术生态链中最为令人振奋的标准之一,它把 Web 带入了 3D 的时代。 初识 WebGL 先通过几个使用 Web...
摘要:而是一款框架,由于其易用性被广泛应用。如果要学习,抛弃那些复杂的原生接口从这款框架入手是一个不错的选择。需要相机,演员这里是地球,场景,导演。最后拍好了戏交给渲染器来制片,发布。状态也在不停的更新。 WebGL入门demo three.js入门 开场白 哇哦,绘制气球耶,在网页上?对啊!厉害了!3D效果图也能在网页上绘制出来啊,这么好玩的事情,赶紧来看看! 这里是属于WebGL的应用,...
摘要:上帝觉得缺少了些生气,便用泥巴捏了一个小人儿,不叫亚当,她叫小芳。接下来预先恭喜你,你可以成为这网页世界的一个小上帝。使用可以向场景中发射光线。在下述案例中,从摄像机的位置向场景中鼠标的点击位置发射光线。 先得摆出几个关键词:场景、灯光、模型、材质、贴图与纹理、相机、渲染器。然后我开始装模作样地解释: 上帝说,要有场景!于是就有了场景,场景去纳这万事万物。 上帝说,要有光!于是就有了光...
摘要:上帝觉得缺少了些生气,便用泥巴捏了一个小人儿,不叫亚当,她叫小芳。接下来预先恭喜你,你可以成为这网页世界的一个小上帝。使用可以向场景中发射光线。在下述案例中,从摄像机的位置向场景中鼠标的点击位置发射光线。 先得摆出几个关键词:场景、灯光、模型、材质、贴图与纹理、相机、渲染器。然后我开始装模作样地解释: 上帝说,要有场景!于是就有了场景,场景去纳这万事万物。 上帝说,要有光!于是就有了光...
阅读 1179·2021-11-24 11:16
阅读 3412·2021-11-15 11:38
阅读 1888·2021-10-20 13:47
阅读 530·2021-09-29 09:35
阅读 2165·2021-09-22 15:17
阅读 991·2021-09-07 09:59
阅读 3353·2019-08-30 13:21
阅读 2885·2019-08-30 12:47