Three.js基础部分学习


Posted in Javascript onJanuary 08, 2017

一、关于使用Three.js几点理论说明

1.请参考官网地址 https://threejs.org/

2.使用three.js必备条件  <场景 A scene、相机a camera、渲染器 a renderer  三者缺一不可>

To actually be able to display anything with Three.js, we need three things: A scene, a camera, and a renderer so we can render the scene with the camera.

3.场景 A scene、相机a camera、渲染器 a renderer 三者之间的关系  <渲染器的作用就是将相机拍摄下来的图片,放到浏览器中去显示>

Three.js基础部分学习

三、案例使用Three.js绘制旋转立方体

实现效果图如下所示

Three.js基础部分学习

案例案例源码

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>用threejs构建室内模型</title>
 <style>
 #canvas-frame {
 width: 100%;
 height: 600px;
 }
 </style>
 </head>
 <body onload="threeStart()">
 <div id="canvas-frame" ></div>
 </body>
 <script type="text/javascript" src="./lib/three.js" ></script>
 <script type="text/javascript">
 var renderer, //渲染器
 width = document.getElementById('canvas-frame').clientWidth, //画布宽
 height = document.getElementById('canvas-frame').clientHeight; //画布高
 //初始化渲染器
 function initThree(){
 renderer = new THREE.WebGLRenderer({
 antialias : true
 //canvas: document.getElementById('canvas-frame')
 });
 renderer.setSize(width, height);
 renderer.setClearColor(0xFFFFFF, 1.0);
 document.getElementById('canvas-frame').appendChild(renderer.domElement);
 renderer.setClearColor(0xFFFFFF, 1.0);
 }
 //初始化场景
 var scene;
 function initScene(){
 scene = new THREE.Scene();
 }
 var camera;
 function initCamera() { //透视相机
 camera = new THREE.PerspectiveCamera(45, width/height , 1, 10000);
 camera.position.x = 50;
 camera.position.y = 150;
 camera.position.z =150;
 camera.up.x = 0;
 camera.up.y = 1; //相机朝向--相机上方为y轴
 camera.up.z = 0;
 camera.lookAt({ //相机的中心点
 x : 0,
 y : 0,
 z : 0
 });
 // camera 正交相机
 /*camera = new THREE.OrthographicCamera(-300, 300, 100, -100, 1, 10000);
 camera.position.x = 250;
 camera.position.y = 100;
 camera.position.z = 1800;
 camera.up.x = 0;
 camera.up.y = 1; //相机朝向--相机上方为y轴
 camera.up.z = 0;
 camera.lookAt({ //相机的中心点
 x : 0,
 y : 0,
 z : 0
 });*/
 }
 function initLight(){
 // light--这里使用环境光
 //var light = new THREE.DirectionalLight(0xffffff); /*方向性光源*/
 //light.position.set(600, 1000, 800);
 var light = new THREE.AmbientLight(0xffffff); //模拟漫反射光源
 light.position.set(600, 1000, 800); //使用Ambient Light时可以忽略方向和角度,只考虑光源的位置
 scene.add(light);
 }
 function initObject(){ //初始化对象
 //初始化地板
 initFloor();
 }
 function initGrid(){ //辅助网格
 var helper = new THREE.GridHelper( 1000, 50 );
 helper.setColors( 0x0000ff, 0x808080 );
 scene.add( helper );
 }
 function initFloor(){
 //创建一个立方体
 var geometry = new THREE.BoxGeometry(80, 20, 80);
 for ( var i = 0; i < geometry.faces.length; i += 2 ) {
 var hex = Math.random() * 0xffffff;
 geometry.faces[ i ].color.setHex( hex );
 geometry.faces[ i + 1 ].color.setHex( hex );
 }
 var material = new THREE.MeshBasicMaterial( { vertexColors: THREE.FaceColors} );
 //将material材料添加到几何体geometry
 var mesh = new THREE.Mesh(geometry, material);
 mesh.position = new THREE.Vector3(0,0,0);
 scene.add(mesh);
 }
 //初始化页面加载
 function threeStart(){
 //初始化渲染器
 initThree();
 //初始化场景
 initScene();
 //初始透视化相机
 initCamera();
 //初始化光源
 initLight();
 //模型对象
 initObject();
 //初始化网格辅助线
 initGrid();
 renderer.render(scene, camera);
 //实时动画
 //animation();
 }
 function animation(){
 //渲染成像
 var timer = Date.now()*0.0001;
 camera.position.x = Math.cos(timer)*100;
 camera.position.z = Math.sin(timer)*100;
 camera.lookAt(scene.position);
 renderer.render(scene, camera);
 requestAnimationFrame(animation);
 }
 </script>
</html>

一.场景 场景就是一个三维空间。 用 [Scene] 类声明一个叫 [scene] 的对象。

二.关于上述案例中PerspectiveCamera透视相机注意点说明

  1. 照相机默认的观察方向是指向z轴负方向(就是朝向屏幕),所以当变化坐标以后,就要将照相机指向原点,才能观察到物体。

  2.利用 lookAt 方法来设置相机的视野中心「lookAt()」的参数是一个属性包含中心坐标「x」「y」「z」的对象。

  3.案例中使用透视相机(从视点开始越近的物体越大、远处的物体绘制的较小的一种方式、和日常生活中我们看物体的方式是一致的。)

  4.设置相机的上方向为正方向y轴 camera.up.x = 0; camera.up.y = 1; //相机朝向--相机上方为y轴camera.up.z = 0;

camera.up.x = 0;
camera.up.y = 1; //相机朝向--相机上方为y轴
camera.up.z = 0;

三.关于透视相机相关参数说明

new THREE.PerspectiveCamera(fov, aspect , near,far)  透视相机

  视野角:fov 这里视野角(有的地方叫拍摄距离)越大,场景中的物体越小,视野角越小,场景中的物体越大

  纵横比:aspect

  相机离视体积最近的距离:near

  相机离视体积最远的距离:far

Three.js基础部分学习

Three.js基础部分学习

上述案例动画原理  相机围绕y轴旋转,并且保持场景中的物体一直再相机的视野中,实时将相机拍摄下来的图片,放到浏览器中去显示

function animation(){
 //相机围绕y轴旋转,并且保持场景中的物体一直再相机的视野中
 //实时渲染成像
 var timer = Date.now()*0.0001;
 camera.position.x = Math.cos(timer)*100;
 camera.position.z = Math.sin(timer)*100;
 camera.lookAt(scene.position);
 renderer.render(scene, camera);
 requestAnimationFrame(animation);
}

四.渲染器  三维空间里的物体映射到二维平面的过程被称为三维渲染。 一般来说我们都把进行渲染的操作叫做渲染器。

【参考资料】 

   http://www.hewebgl.com/article/getarticle/50

   http://www.xyhtml5.com/threejs-star-moving-particles.html

   https://read.douban.com/reader/ebook/7412854/

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
JSON扫盲帖 JSON.as类教程
Feb 16 Javascript
javascipt基础内容--需要注意的细节
Apr 10 Javascript
javascript判断机器是否联网的2种方法
Aug 09 Javascript
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
Jul 18 Javascript
JS判断是否360安全浏览器极速内核的方法
Jan 29 Javascript
JScript中的条件注释详解
Apr 24 Javascript
详解JavaScript中Date.UTC()方法的使用
Jun 12 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
Jan 28 Javascript
vuex 使用文档小结篇
Jan 11 Javascript
angularJS1 url中携带参数的获取方法
Oct 09 Javascript
ZK中使用JS读取客户端txt文件内容问题
Nov 07 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
Jan 08 #Javascript
jQuery实现页面滚动时智能浮动定位
Jan 08 #Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
Jan 08 #Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
Jan 08 #Javascript
jQuery实现文字自动横移
Jan 08 #Javascript
div实现自适应高度的textarea实现angular双向绑定
Jan 08 #Javascript
JavaScript中日常收集常见的10种错误(推荐)
Jan 08 #Javascript
You might like
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
图解javascript作用域链
2019/05/27 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
Python实现将xml导入至excel
2015/11/20 Python
Python贪心算法实例小结
2018/04/22 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
python实现经纬度采样的示例代码
2020/12/10 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
什么是Rollback Segment
2013/04/22 面试题
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
外贸业务员求职自荐信分享
2013/09/21 职场文书
元旦联欢会感言
2014/03/04 职场文书
宣传标语大全
2014/07/01 职场文书
个人投资合作协议书
2014/10/12 职场文书
2015年女工委工作总结
2015/07/27 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
asyncio异步编程之Task对象详解
2022/03/13 Python