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 相关文章推荐
Jquery替换已存在于element上的event的方法
Mar 09 Javascript
jQuery基本过滤选择器使用介绍
Apr 18 Javascript
在百度知道团队中快速审批新成员的js脚本
Feb 02 Javascript
原生Js实现简易烟花爆炸效果的方法
Mar 20 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
Oct 16 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
jquery easyUI中ajax异步校验用户名
Aug 19 Javascript
Javascript中判断一个值是否为undefined的方法详解
Sep 28 Javascript
JavaScript队列、优先队列与循环队列
Nov 14 Javascript
vue2中的keep-alive使用总结及注意事项
Dec 21 Javascript
学习使用ExpressJS 4.0中的新Router的用法
Nov 06 Javascript
微信小程序实用代码段(收藏版)
Dec 17 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边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
php的扩展写法总结
2019/05/14 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
jquery异步循环获取功能实现代码
2010/09/19 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python中的True,False条件判断实例分析
2015/01/12 Python
python内置数据类型之列表操作
2018/11/12 Python
使用python绘制二维图形示例
2019/11/22 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
Linux文件系统类型
2012/09/16 面试题
家佳咖啡店创业计划书
2013/12/27 职场文书
销售行政专员职责
2014/01/03 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
产品包装策划方案
2014/05/18 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
军训结束新闻稿
2015/07/17 职场文书
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
mysql 获取时间方式
2022/03/20 MySQL