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 相关文章推荐
jquery中防刷IP流量软件影响统计的一点对策
Jul 10 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
Dec 12 Javascript
ASP.NET中AJAX 调用实例代码
May 03 Javascript
JS的replace方法介绍
Oct 20 Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
Sep 15 Javascript
js操作浏览器的参数方法
Jan 21 Javascript
JS实现点击循环切换显示内容的方法
Oct 19 Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 jQuery
node.js中fs文件系统模块的使用方法实例详解
Feb 13 Javascript
extjs4图表绘制之折线图实现方法分析
Mar 06 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
Nov 09 jQuery
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封装的多文件上传类实例与用法详解
2017/02/07 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
javascript 打印页面代码
2009/03/24 Javascript
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
2015/03/13 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
Vue动画事件详解及过渡动画实例
2019/02/09 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
微信小程序以7天为周期连续签到7天功能效果的示例代码
2020/08/20 Javascript
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
2018/12/18 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
python实现126邮箱发送邮件
2020/05/20 Python
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
优秀的自荐信要注意哪些
2014/01/03 职场文书
《望庐山瀑布》教学反思
2014/04/22 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
趣味运动会策划方案
2014/06/02 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
建房合同协议书
2016/03/21 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
Go语言 详解net的tcp服务
2022/04/14 Golang
Vue操作Storage本地化存储
2022/04/29 Vue.js
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android