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 相关文章推荐
Javascript表格翻页效果的具体实现
Oct 05 Javascript
禁用Tab键JS代码兼容Firefox和IE
Apr 18 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
Aug 13 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
May 17 Javascript
第一次接触Bootstrap框架
Oct 24 Javascript
canvas时钟效果
Feb 16 Javascript
整理关于Bootstrap导航的慕课笔记
Mar 29 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
Oct 09 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
Feb 04 Javascript
Bootstrap 中data-[*] 属性的整理
Mar 13 Javascript
layui 实现table翻页滚动条位置保持不变的例子
Sep 05 Javascript
Vue中keep-alive的两种应用方式
Jul 15 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实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
php使用PDO获取结果集的方法
2017/02/16 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
php中yii框架实例用法
2020/12/22 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
ajax请求乱码的解决方法(中文乱码)
2014/04/10 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
jQuery插件scroll实现无缝滚动效果
2015/04/27 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
深入解答关于Python的11道基本面试题
2017/04/01 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Python协程的用法和例子详解
2017/09/09 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
python 多进程队列数据处理详解
2019/12/23 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
工作表扬信的范文
2014/01/10 职场文书
《春笋》教学反思
2014/04/15 职场文书
企业宣传策划方案
2014/05/29 职场文书
授权委托书
2014/09/17 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书