【threejs学习随记(二)】——up属性与lookAt方法解析
来源:互联网 发布:excel删除重复数据的行 编辑:程序博客网 时间:2024/05/21 21:50
up属性
camera的up属性其实是继承基类Object3D,定义了三维空间中向上的方向。官方文档中原话是:
This is used by the lookAt method, for example, to determine the orientation of the result.
Default is Object3D.DefaultUp - that is, ( 0, 1, 0 )
怎么理解呢?直白翻译就是:供lookAt方法使用,决定结果(渲染)的方向。默认是(0,1,0)方向。而threejs中默认的3D坐标系如下图,:
z轴正方向指向屏幕外,x,y平面在屏幕上。坐标原点(0,0,0)默认为场景中心。照相机就是在这个坐标系中定义的。因此up方向默认是(0,1,0)则很好理解,表示y轴向上。所以改变相机的up属性值相当于改变3D坐标系的方向。
- 设定3D坐标系的向上方向为x轴,代码如下:
camera.up = new THREE.Vector3( 1, 0, 0 );
相机所处坐标系的如下图所示:
- 设定3D坐标系的向上方向为z轴,代码如下:
camera.up = new THREE.Vector3( 0, 0, 1 );
相机所处坐标系的如下图所示:
可见,up属性的改变将直接影响相机所处3维空间的位置。
2. lookAt方法
lookAt是camera的一个方法,目的是让camera的镜头看向三维空间中指定的位置。其调用形式如:lookAt(target)——其中target参数是一个具体Vector3对象,代表了三维空间的某点。
上面已经提到,camera的up属性是服务于lookAt方法的,因为lookAt指向的坐标必须依赖于目前的坐标系。换句话说,当更改相机的up属性,即改变了空间的向上方向后,程序中所有Vector3对象的坐标必须以改变后的坐标系为参考的,lookAt方法传入的Vector3对象也同理。且相机同样默认看向新3维空间的-z方向。
3. 举例说明
可能还有盆友看到这里很晕,没关系,看了下面的demo应该就明白了。
示例:
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>Three框架</title> <script src="three.js" data-ke-src="js/Three.js"></script> <style type="text/css"> div#canvas-frame { border: none; cursor: pointer; width: 100%; height: 600px; background-color: #EEEEEE; } </style> <script> var renderer; function initThree() { width = document.getElementById('canvas-frame').clientWidth; height = document.getElementById('canvas-frame').clientHeight; renderer = new THREE.WebGLRenderer({ antialias : true }); renderer.setSize(width, height); document.getElementById('canvas-frame').appendChild(renderer.domElement); } var camera; function initCamera() { camera = new THREE.PerspectiveCamera(45, width / height, 1, 10000); camera.position.x = 0; camera.position.y = 1000; camera.position.z = 0; camera.up = new THREE.Vector3( 0, 0, 1 ); camera.lookAt({ x : 0, y : 1, z : 0 }); } var scene; function initScene() { scene = new THREE.Scene(); } var light; function initLight() { light = new THREE.DirectionalLight(0xFF0000, 1.0, 0); light.position.set(100, 100, 200); scene.add(light); } var cube; function initObject() { var geometry = new THREE.Geometry(); var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors} ); var color1 = new THREE.Color( 0x000000 ), color2 = new THREE.Color( 0xffffff ); // 线的材质可以由2点的颜色决定 var p1 = new THREE.Vector3( -100, 0, 100 ); var p2 = new THREE.Vector3( 100, 0, -100 ); geometry.vertices.push(p1); geometry.vertices.push(p2); geometry.colors.push( color1, color2 ); var line = new THREE.Line( geometry, material ); scene.add(line); } function render() { renderer.clear(); renderer.render(scene, camera); requestAnimationFrame(render); } function threeStart() { initThree(); initCamera(); initScene(); initLight(); initObject(); render(); } </script></head><body onload="threeStart();"><div id="canvas-frame"></div></body></html>
demo效果如下:
对照我上面画的空间向上方向为z轴的坐标系,就很容易理解效果为啥是这样了。可以自己随意调整下lookAt指向的坐标,来看下不同渲染效果,方便加深对lookAt方法的理解。
- 【threejs学习随记(二)】——up属性与lookAt方法解析
- threejs学习随记(一)
- 【threejs学习随记(三)】3D模型导入问题
- 我的threejs学习笔记(五)——点光源属性控制
- 学习随记(二)
- JavaScript学习随记——属性类型
- 我的threejs学习笔记(二)——dat.gui使用
- JavaScript学习随记——数组二
- Objective-C学习笔记(二十五)——属性与方法的继承学习
- JavaScript学习随记——常见全局对象属性及方法
- ocp学习随记(二)
- 我的threejs学习笔记(七)——spotLight
- 内核随记(二)——内核抢占与中断返回
- Transform.LookAt解析
- 内核随记(二)——内核抢占与中断返回(转)
- 学习DatabaseConnectionPool--数据库连接池(随记二)
- hadoop学习随记 二
- Spring IOC原理源码解析(@Autowired原理详解 :标识属性与方法)(二 )
- 1042 数字0-9的数量(数位DP)
- 因式分解
- python爬虫系列之爬取百度文库(三)
- palindrome-number
- STL 内存管理
- 【threejs学习随记(二)】——up属性与lookAt方法解析
- Linux驱动之eeprom,I2C,SPI
- webrtc 网络原理
- 在实例中区别转发与重定向--可以自己复制粘贴看看效果
- Spring Security OAuth2#resource_ids
- 多继承
- 抽象
- Servlet
- Python树形打印目录结构