three.js中文文档学习之创建场景


Posted in Javascript onNovember 20, 2017

什么是Three.js?

如果你正在读这篇文章,你可能对Three.js有一定的了解,那我们来简单地介绍下Three.js是什么.
Three.js是一个库,使得WebGL的3D效果在浏览器中运用很容易。而在原始的WebGL中一个简单的立方体会变成数百Javascript和着色器代码的行,而一个Three.js只需要一点点代码.

本节目标是为 three.js 做简介。我们从使用旋转立方体来搭建场景开始。如果遇到困难需要帮助,页面底部有可参考的源码。

一个场景至少需要的三种类型组件

  • 相机/决定哪些东西将在屏幕上渲染
  • 光源/他们会对材质如何显示,以及生成阴影时材质如何使用产生影响
  • 物体/他们是在相机透视图里主要的渲染队形:方块、球体等

开始前

在计算机中保存如下 HTML 代码,并在 js 目录下包含 three.js,然后在浏览器中打开

<html>
 <head>
 <meta charset=utf-8>
 <title>My first three.js app</title>
 <style>
  body { margin: 0; }
  canvas { width: 100%; height: 100% }
 </style>
 </head>
 <body>
 <script src="js/three.js"></script>
 <script>
  // Our Javascript will go here.
 </script>
 </body>
</html>

接下来的代码都会下载 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 为 <font color="#FF1493">false</font> ,如果 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。所有材质接受并应用一个包含所有属性的对象。为简单起见,我们仅仅提供一个颜色属性: 绿色 —— <font color="#00ff00">0x00ff00</font> 。和 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 应用。很简单,但总得突破。

完整代码参考如下。琢磨一下并深刻理解其工作机理

<html>
 <head>
 <title>My first three.js app</title>
 <style>
  body { margin: 0; }
  canvas { width: 100%; height: 100% }
 </style>
 </head>
 <body>
 <script src="js/three.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 material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
  var cube = new THREE.Mesh( geometry, material );
  scene.add( cube );

  camera.position.z = 5;

  var animate = function () {
  requestAnimationFrame( animate );

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

  renderer.render(scene, camera);
  };

  animate();
 </script>
 </body>
</html>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
User Scripts: Video Download by User Scripts
May 14 Javascript
将文本输入框内容加入表中的js代码
Aug 18 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
js+css绘制颜色动态变化的圈中圈效果
Jan 27 Javascript
jquery zTree异步加载简单实例讲解
Feb 25 Javascript
微信小程序利用co处理异步流程的方法教程
May 20 Javascript
详解Webpack DLL用法以及功能
Jul 11 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
Mar 26 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
Element el-button 按钮组件的使用详解
Feb 01 Javascript
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
Vue 中批量下载文件并打包的示例代码
Nov 20 #Javascript
VueJs 搭建Axios接口请求工具
Nov 20 #Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 #Javascript
详解vue+css3做交互特效的方法
Nov 20 #Javascript
解读ES6中class关键字
Nov 20 #Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
Nov 20 #Javascript
Node.js 中使用 async 函数的方法
Nov 20 #Javascript
You might like
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
php中错误处理操作实例分析
2019/08/23 PHP
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
利用Python学习RabbitMQ消息队列
2015/11/30 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
python 获取url中的参数列表实例
2018/12/18 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
python编写俄罗斯方块
2020/03/13 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
参观接待方案
2014/03/17 职场文书
教师党员公开承诺书
2014/03/25 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
法学院毕业生求职信
2014/06/25 职场文书
十岁生日答谢词
2015/01/05 职场文书
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL