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 相关文章推荐
Track Image Loading效果代码分析
Aug 13 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
Jan 13 Javascript
jQuery实现复选框批量选择与反选的方法
Jun 17 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
jQuery调用Webservice传递json数组的方法
Aug 06 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
Dec 07 Javascript
jQuery实现CheckBox全选、全不选功能
Jan 11 Javascript
关于在mongoose中填充外键的方法详解
Aug 14 Javascript
jQuery读取本地的json文件(实例讲解)
Oct 31 jQuery
vue实现某元素吸顶或固定位置显示(监听滚动事件)
Dec 13 Javascript
js事件触发操作实例分析
Jun 21 Javascript
使用layui实现树形结构的方法
Sep 20 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提取字符串中网站url地址的方法
2014/12/03 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
JS关键字变色实现思路及代码
2013/02/21 Javascript
js函数排序的实例代码
2013/07/01 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
Vue2.0 多 Tab切换组件的封装实例
2017/07/28 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
浅谈Python peewee 使用经验
2017/10/20 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
PyQt5实现拖放功能
2018/04/25 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
尼克松手表官网:Nixon手表
2019/03/17 全球购物
消防安全管理制度
2014/02/01 职场文书
产品质量保证书
2014/04/29 职场文书
二年级学生期末评语
2014/12/26 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技