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代码
Apr 23 Javascript
利用javascript实现一些常用软件的下载导航
Aug 03 Javascript
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
Apr 02 Javascript
arguments对象验证函数的参数是否合法
Jun 26 Javascript
JavaScript前端开发之实现二进制读写操作
Nov 04 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
Mar 03 Javascript
Vue三层嵌套路由的示例代码
May 05 Javascript
element ui table 增加筛选的方法示例
Nov 02 Javascript
JavaScript实现alert弹框效果
Nov 19 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迭代器的内部执行过程详解
2013/11/12 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
PHP的Socket网络编程入门指引
2015/08/11 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
PHP7变量处理机制修改
2021/03/09 PHP
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
vue观察模式浅析
2018/09/25 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
用Python实现协同过滤的教程
2015/04/08 Python
快速了解python leveldb
2018/01/18 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
如何使用Python调整图像大小
2020/09/26 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
家长给小学生的评语
2014/01/30 职场文书
大学毕业自我评价
2014/02/02 职场文书
生死抉择观后感
2015/06/09 职场文书
Java数组详细介绍及相关工具类
2022/04/14 Java/Android