【three.js】创建一个场景

来源:互联网 发布:淘宝百度云盘会员出租 编辑:程序博客网 时间:2024/05/17 21:33

本节的目的是介绍three.js。我们将从创建一个场景以及场景内的一个旋转的立方体开始。在本文最后将会给出相应的例子。

什么是Three.js

如果你阅读本文,将会大概了解什么是Three.js,它将为你做什么。

Three.js是一个简单的WebGL的类库(主要用于在浏览器展现3D图像)。若在一个基础的WebGL之上构造一个立方体,程序员将会写数百行的js代码和着色代码(CSS?),而在Three.js下,则仅仅需要一个函数。

开始之前

在你使用Three.js之前,你需要一个地方去显示它。将下面写出的HTML代码复制到你本机中的文件内,并将three.min.js拷贝到你电脑里的相应位置,并用浏览器打开该文件

<html><head><title>My first three.js app</title><style>body{ margin:0}canvas { width:100%; height:100% }</style></head><body><script src="three.min.js"></script><script>//do someting.</script></body><code class=" prettyprint"><span class="tag"></span></code>
接下来,所有的代码将会写在script标签中。

创建一个场景

若要用Three.js真正能够显示模型,需要三个对象:场景(scene)相机(camera)渲染器(renderer)。我们将利用渲染器将场景渲染至相机。

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中,会有几种不同的相机,我们在之后的章节对其进行讨论。目前,我们先使用PrespectiveCamera。

第一个属性是视野(field of view)

第二个属性是纵横比(aspect ratio)。通常来说,纵横比是宽度除以高度,也可以通过定义来实现宽屏等其他效果。

第三个和第四个属性分别是近距离(near)和远距离(far)剪切面。这两个参数描述的是当物体距离相机超过规定的远距离或过分接近相机超过规定的近距离时,物体将不会被渲染。目前来说先不用担心这一方面的问题,等之后需要优化的时候再说。

THREE.PerspectiveCamera(field_of_view, aspect_ratio,near,far);

下一个对象是渲染器。我们这里使用WebGLRenderer()。当用户的浏览器过老,不支持WebGL时,它会给出相应的错误原因提示。

在初始化渲染器时,我们需要设置渲染长宽,

最后,我们将渲染器元素添加到我们的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

第三,我们需要一个Mesh(找不到合适的翻译,大概意思是连接关系之类),mesh是一种承载几何物体并将材质赋予该物体的对象,我们可以将它放置在场景中,并能够自由移动。

当在默认情况下,我们调用scene.add()方法,物体将会放置到场景的(0,0,0)位置。这样会导致物体与摄像机重叠,为了避免这样的事情,我们将相机移动几个单元。

渲染场景

如果你将上述代码拷贝到HTML中去,并不会显示什么东西,原因就在于你还没有渲染。所以,我们需要调用渲染循环(render loop)

function render(){requestAnimationFrame(render);renderer.render(scene, camera);}render();

这样就会建立一个每秒60次的循环渲染(60fps)。采用requestAnimationFrame的方式较之使用setInterval的方式更具优点。当用户选择其他页面标签时,渲染将会暂停。

让方块动起来

在renderer.render上添加代码:

cube.relation.x += 0.1;cube.relation.y += 0.1;

该程序段将会在每一帧执行一次,作用是让方块能够旋转起来。


最后

<html><head><title>My first Three.js app</title><style>body { margin : 0; }canvas { width : 100%; height : 100% }</style></head><body><script src="three.min.js"></script><script>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);var geometry = new THREE.BoxGeometry(1, 1, 1);var meterial = new THREE.MeshBasicMeterial( { color : 0x00FF00 } );var cube = new  THREE.Mesh(geometry, meterial);scen.add(cube);camera.position.z = 5;var render = function(){requestAnimationFrame(render);cube.rotation.x += 0.1;cube.rotation.y += 0.1;renderer.render(scene, camera);}render();</script></body></html>


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一年级孩子做题不认真怎么办 纹身之后喝酒啦怎么办 股票爆仓散户怎么办 小学一年级孩子马虎怎么办 一年级孩子考试马虎怎么办 数学题会还做错怎么办 小孩学习不认真怎么办 又呆又笨怎么办 孩子做数学题马虎怎么办 起泛怎么办小偏方 儿童过敏起疙瘩怎么办 小孩身上起范怎么办 小孩数学很粗心怎么办 小孩数学考试粗心怎么办 孩子太粗心了怎么办 害怕和别人交流怎么办 三岁宝宝挑食怎么办 眼睛有吃马虎怎么办 一年级的孩子粗心怎么办 做考卷很粗心怎么办 孩子叛逆不听他怎么办 学生上课爱动怎么办 孩子不粗心仔细怎么办 脚痒的无法无天怎么办 站的太久脚肿了怎么办 孩子做题粗心大意怎么办 孩子做作业粗心大意怎么办 初中生没有学习兴趣怎么办 孩子没有学习兴趣怎么办 小孩没有学习兴趣怎么办 小孩左手关节肿痛怎么办 我上课老是走神怎么办 孩子听课效率低怎么办 孩子上课不会听课怎么办 怀孕了腿肿怎么办 孕后期手脚肿怎么办 中考成绩太差怎么办 小孩子调皮捣蛋不听话怎么办 小孩总是拧脖子怎么办 腿骨折后脚肿怎么办 睫毛掉眼睛里怎么办