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中判断函数是new还是()调用的区别说明
Apr 07 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
Mar 26 Javascript
VsCode插件整理(小结)
Sep 14 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
Feb 01 Javascript
vue使用自定义icon图标的方法
May 14 Javascript
微信小程序云开发如何使用云函数生成二维码
May 18 Javascript
vuejs移动端实现div拖拽移动
Jul 25 Javascript
vue请求服务器数据后绑定不上的解决方法
Oct 30 Javascript
js实现踩五彩块游戏
Feb 08 Javascript
Vue.js仿Select下拉框效果
Feb 18 Javascript
基于VUE实现判断设备是PC还是移动端
Jul 03 Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 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
2006/10/09 PHP
用php来检测proxy
2006/10/09 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
Python中__new__与__init__方法的区别详解
2015/05/04 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
业务副厂长岗位职责
2014/01/03 职场文书
渔夫的故事教学反思
2014/02/14 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python