Three.js学习之正交投影照相机


Posted in Javascript onAugust 01, 2016

前言

Three.js是一个3Djs库,webGL开源框架中比较优秀的一个。除了webGL以外,Three.js还提供了基于Canvas、SVG标签的渲染器,调试建议使用Chrome或者Firefox。

1.照相机

图形学中的照相机定义了三维空间到二维屏幕的投影方式。

针对投影方式照相机分为正交投影照相机和透视投影照相机。

2.两种相机的区别与适用范围

正交投影:

 Three.js学习之正交投影照相机

透视投影:

 Three.js学习之正交投影照相机

正交投影就像数学课上画的;而透视投影有一个基本点,就是远处的物体比近处的物体小,远大近小。

对于制图、建模软件通常使用正交投影;而对于其他大多数应用,通常使用透视投影。

3.正交投影照相机

正交投影照相机的构造函数:

Three.OrthographicCamera(left,right,top,bottom,near,far)

六个参数分别代表正交投影照相机拍摄到的六个面的位置。

其中,near表示近平面与相机中心点的垂直距离far表示远平面与相机中心点的垂直距离

 Three.js学习之正交投影照相机

若要保持照相机的横纵比例,(right-left)(top-bottom)的比例需与canvas的宽高比例一致。

由图可见near与far的值应为正值,且far>near。如果最后两个值是(0,0),也就是near和far值相同了,视景体深度没有了,整个视景体都被压成个平面了,就会显示不正确。

4.正交投影照相机实例

源码:

<!DOCTYPE html>

<html>

  <head>

   <meta charset="UTF-8">

<title>3.js测试二</title>  

  </head>

  <body onload="init()">

    <canvas id="mainCanvas" width="400px" height="300px" ></canvas>

    <script type="text/javascript" src="js/three.min.js"></script>

    <script type="text/javascript">

      function init() {

        var renderer = new THREE.WebGLRenderer({

          canvas: document.getElementById('mainCanvas')

        });

        renderer.setClearColor(0x000000);

        var scene = new THREE.Scene();

        // 设置照相机

        var camera = new THREE.OrthographicCamera(-2, 2, 1.5, -1.5, 1, 10);

        camera.position.set(0, 0, 5);

        //camera.lookAt(new THREE.Vector3(0, 0, 0));

        scene.add(camera);

        // 创建立方体

        var cube = new THREE.Mesh(new THREE.CubeGeometry(1, 1, 1),

            new THREE.MeshBasicMaterial({

              color: 0xff0000,

              wireframe: true

            })

        );

        scene.add(cube);

        // render

        renderer.render(scene, camera);

      }

    </script>

  </body>

</html>

其中,THREE.MeshBasicMaterial(基础网格材质)的wireframe属性如果为true,则将材质渲染成线框。

可以看到当前位置后面的边会与前面的完全重合:

 Three.js学习之正交投影照相机

4.1 改变视景体长宽比例

这里canvas的宽高比为4:3,照相机的水平距离为4,垂直距离为3,因此长宽比例保持不变(1:1)。

若将照相机的水平距离减小为2,

var camera = new THREE.OrthographicCamera(-1,1,1.5,-1.5,1,10);

物体会被拉长:

 Three.js学习之正交投影照相机

照相机的视野范围变窄了,导致正方体在视野范围内的横向比例增加了,因此表现为正方体变宽了。

4.2 改变相机位置

例子中的相机位置是(0,0,5),由于照相机默认是面向z轴负方向放置的,所以能看到原点处的正方体。

将照相机的位置向右移动1个单位:

var camera = new THREE.OrthographicCamera(-2,2,1.5,-1.5,1,10);

camera.position.set(1,0,5);

照相机面对着物体,所以照相机右移,所照的物体向左移:

 Three.js学习之正交投影照相机

4.3 改变视景体位置

将视景体设置的更靠右:

var camera = new THREE.OrthographicCamera(-1,3,1.5,-1.5,1,10);

camera.position.set(1,0,5);

和右移照相机一样。

 Three.js学习之正交投影照相机

4.4 改变照相机角度

camera.position.set(4,-3,5);

camera.lookAt(new THREE.Vector3(0, 0, 0));

但是现在照相机沿z轴负方向观察的,因此观察不到正方体,只看到一片黑。我们可以通过lookAt函数指定它看着原点方向:

camera.lookAt(new THREE.Vector3(0, 0, 0));

注意,lookAt函数接受的是一个THREE.Vector3的实例,不要写成camera.lookAt(0, 0, 0)

好了,以上就是Three.js学习之正交投影照相机的全部内容,希望给大家学习Three.js有所帮助,小编陆续还会更新关于Three.js的文章,请大家继续关注三水点靠木。

Javascript 相关文章推荐
JS宝典学习笔记(下)
Jan 10 Javascript
javascript 控制弹出窗口
Apr 10 Javascript
jquery遍历input取得input的name
Apr 27 Javascript
深入分析JSONP跨域的原理
Dec 10 Javascript
JavaScript中使用Callback控制流程介绍
Mar 16 Javascript
input输入框鼠标焦点提示信息
Mar 17 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
Nov 09 Javascript
如何实现星星评价(jquery.raty.js插件)
Dec 21 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
Jul 30 Javascript
JavaScript原生实现观察者模式的示例
Dec 15 Javascript
详解vue-cli项目中怎么使用mock数据
May 29 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
Aug 01 #Javascript
JQuery之proxy实现绑定代理方法
Aug 01 #Javascript
AngularJS入门教程之ng-checked 指令详解
Aug 01 #Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
Aug 01 #Javascript
Javascript OOP之面向对象
Jul 31 #Javascript
JavaScript的字符串方法汇总
Jul 31 #Javascript
javascript 数组的正态分布排序的问题
Jul 31 #Javascript
You might like
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
轮播的简单实现方法
2016/07/28 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
django 常用orm操作详解
2017/09/13 Python
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
Python3.4解释器用法简单示例
2019/03/22 Python
Python tkinter三种布局实例详解
2020/01/06 Python
python zip()函数的使用示例
2020/09/23 Python
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
大学生求职信
2014/06/17 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
2014年资料员工作总结
2014/11/18 职场文书
承诺书范本
2015/01/21 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis