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判断$(&quot;#id&quot;)获取的对象是否存在的方法
Sep 25 Javascript
深入理解JQuery keyUp和keyDown的区别
Dec 12 Javascript
利用JavaScript检测CPU使用率自己写的
Mar 22 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
Mar 03 Javascript
全面解析多种Bootstrap图片轮播效果
May 27 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
Aug 23 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
Jan 04 Javascript
非常实用的vue导航钩子
Mar 20 Javascript
vue+swiper实现侧滑菜单效果
Dec 28 Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 Javascript
es6数组includes()用法实例分析
Apr 18 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 12 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操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
比较详细PHP生成静态页面教程
2012/01/10 PHP
php给数组赋值的实例方法
2019/09/26 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
python爬虫要用到的库总结
2020/07/28 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
印度在线杂货店:bigbasket
2018/08/23 全球购物
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
奥巴马的演讲稿
2014/05/15 职场文书
工程材料采购方案
2014/05/18 职场文书
邀请书模板
2015/02/02 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android
JS高级程序设计之class继承重点详解
2022/07/07 Javascript