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:sugggestion.js
Sep 02 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
Sep 10 Javascript
分享一个插件实现水珠自动下落效果
Jun 01 Javascript
JavaScript面向对象编写购物车功能
Aug 19 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
Sep 21 Javascript
AngularJs上传前预览图片的实例代码
Jan 20 Javascript
Bootstrap表格使用方法详解
Feb 17 Javascript
Javascript 链式作用域详细介绍
Feb 23 Javascript
vue2中的keep-alive使用总结及注意事项
Dec 21 Javascript
基于Vue和Element-Ui搭建项目的方法
Sep 06 Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 Javascript
利用原生JS实现欢乐水果机小游戏
Apr 23 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
javascript 函数使用说明
2010/04/07 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
python实现拓扑排序的基本教程
2018/03/11 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
Python中的整除和取模实例
2020/06/03 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
静态成员和非静态成员的区别
2012/05/12 面试题
汉语专业应届生求职信
2013/10/01 职场文书
自荐信写法介绍
2014/01/25 职场文书
宣传活动总结范文
2014/07/01 职场文书