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和jquery判断浏览器版本等信息
Jul 04 Javascript
js时钟翻牌效果实现代码分享
Jul 31 Javascript
举例讲解如何判断JavaScript中对象的类型
Apr 22 Javascript
使用Curl命令查看请求响应时间方法
Nov 04 Javascript
js 定位到某个锚点的方法
Nov 19 Javascript
js图片轮播手动切换特效
Jan 12 Javascript
微信小程序“摇一摇”的实例代码
Jul 20 Javascript
Kindeditor单独调用多图上传实例
Jul 31 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
Aug 17 Javascript
浅谈Node Inspector 代理实现
Oct 19 Javascript
基于layui table返回的值的多级嵌套的解决方法
Sep 19 Javascript
微信小程序自定义tabBar的踩坑实践记录
Nov 06 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
提取HTML标签
2006/10/09 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
javascript 函数速查表
2010/02/07 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
vue登录注册及token验证实现代码
2017/12/14 Javascript
Angular2中监听数据更新的方法
2018/08/31 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
Python中数字以及算数运算符的相关使用
2015/10/12 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
django如何自己创建一个中间件
2019/07/24 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
详解Python设计模式之策略模式
2020/06/15 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
《莫高窟》教学反思
2014/02/25 职场文书
主要领导对照检查材料
2014/08/26 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android