threejs文档翻译:一.创建场景

Posted 玛德致

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了threejs文档翻译:一.创建场景相关的知识,希望对你有一定的参考价值。

原文地址: https://threejs.org/docs/inde...。

我也是初学,记录一下自己的学习过程,有不对的地方请多多指教,谢谢!

这一节是对threejs一个简短的介绍,我们从搭建一个旋转立方体的场景开始。如果被卡住或者有疑问的话,页面底部有可运行的例子供参考。

在开始之前

在使用threejs之前,要生成使用它的环境,保存下面的代码为html文件,然后引入threejs脚本,最后在浏览器中打开该html

<!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> // Our javascript will go here. </script> 

    </body>

</html>

这样就可以了,之后我们的代码就放在空的script标签中。

创建一个场景

要通过threejs真正的创建东西来展示,我们需要三个元素:场景,相机和渲染器。这样我们就可以用相机来渲染场景。

const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); 

const renderer = new THREE.WebGLRenderer();

renderer.setSize( window.innerWidth, window.innerHeight );

document.body.appendChild( renderer.domElement );

先解释一下我们在做什么。我们创建了场景(scene),渲染器(renderer)和相机(camera)。

threejs有几种不同的相机,这里我们使用的是透视相机(PerspectiveCamera)。

第一个属性是视野(field of view)。FOV在任意时刻都是场景的延伸,单位为度。

    第二个就是纵横比(aspect ratio)。要善于使用到宽度/高度数据,不然会得到在宽屏电视上播放老电影一样被压扁的效果。

    接下来两个属性是远近剪切面(near, far)。即一个物体超过远剪切面或者近于近剪切面是无法展示的。现在不用担心,但是之后会有一些场景需要配置值来使展示变得更好。

    接下来是渲染器。这是魔法开始的地方,除了WebGLRenderder之外,threejs还提供了一些参数和回调来兼容不支持WebGL的一些老浏览器。

    为了创建一个渲染的实例,在渲染应用的时候我们也需要设置尺寸。用一个设置好宽高的区域来填充应用是个很好的主意,在本例中是浏览器的宽高。对于性能密集型应用来说,也可以给setSize函数传小一点的的参数值,比如window.innerWidth/2,window.innerHeight/2,这样就可以让应用只有一半的大小。

    最后但同样重要的是,我们在html中添加了渲染元素,最后由<canvas>来展示我们的场景。

    “很不错,但是立方体呢”,我们马上加上。

const geometry = new THREE.BoxGeometry();

const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );

const cube = new THREE.Mesh( geometry, material );

scene.add( cube ); 

camera.position.z = 5;

    为了添加这个立方体,我们需要盒子模型(BoxGeometry)。这是 一个包含着立方体所由点(顶点)和填充(面)的对象。我们以后再扩展更多。

    除了模型,我们也需要填充物料的颜色。threejs自带了一些物料,我们这次就用MeshBasicMaterial,所有的物料都自带一个可以作用其自身的对象配置参数,为了保持例子简单,我们这里就只传了颜色的参数,这里的颜色和css或者ps中的工作原理相同。

第三样用上的东西是网格(Mesh)。网格是一个对象,取一个几何体,然后把物料应用在上面,可以在场景里自由的添加和移除。

    默认情况下,我们使用scene.add(),参数会被添加到坐标中,这会导致立方体和场景互相嵌套,为了避免这种情况,我们将相机位移了一点。

渲染一个场景

  如果你复制了上面的代码并运行,会发现什么都没有。这是因为其实我们什么都没有渲染,所以我们需要渲染/动画循环。

function animate() { 

 requestAnimationFrame( animate ); 

 renderer.render( scene, camera );

}

animate();

    这会循环刷新并渲染场景(典型的场景中是1s60次),如果你是第一次在浏览器中写动画,你可能会问为什么不用setinterval,虽然可以,但是requestAnimationFrame有很多优点,最重要的一点是它会在用户导航到其他页面的时候停止,从而不浪费宝贵的处理能力和电池寿命。

使立方体动起来

    如果你插入了立方体的代码,你就能看到一个绿色的盒子,让我们把它旋转起来。

    在animate函数中,renderer.render的正上方添加以下代码:

cube.rotation.x += 0.01;

cube.rotation.y += 0.01;

这会在每一帧中被执行(一般来说是1s60次),给立方体一个不错的旋转动画。基本上,在应用运行期间,你想移动或改变任何东西都得通过动画来实现,当然可以用这里调用其他函数,这样就用在一个animation函数中写几百行代码了。

结果

祝贺你,现在已经完成了第一个threejs应用,简单,但是得从这个开始学习。

完整代码如下所示,运行一下以便更好的理解。

demo地址:https://github.com/wanzizi/three_test/blob/master/demo/index.html

下一篇:threejs文档翻译:二.画线

以上是关于threejs文档翻译:一.创建场景的主要内容,如果未能解决你的问题,请参考以下文章

threejs文档翻译:三.创建文本

网页3D效果库Three.js初窥

threejs学习笔记

threejs学习笔记-01

用这种方法,你也可以创建threejs场景

Threejs 创建一个虚拟城市三维场景