照相机又分为正交投影照相机与透视投影照相机

举个简单的例子来说明正交投影与透视投影照相机的区别。使用透视投影照相机获得的结果是类似人眼在真实世界中看到的有“近大远小”的效果(如下图中的(a));

而使用正交投影照相机获得的结果就像我们在数学几何学课上老师教我们画的效果,对于在三维空间内平行的线,投影到二维空间中也一定是平行的(如下图中的(b))。

(a)透视投影,(b)正交投影

那么,你的程序需要正交投影还是透视投影的照相机呢?

一般说来,对于制图、建模软件通常使用正交投影,这样不会因为投影而改变物体比例;而对于其他大多数应用,通常使用透视投影,因为这更接近人眼的观察效果。当然,照相机的选择并没有对错之分,你可以更具应用的特性,选择一个效果更佳的照相机。

正交投影照相机(Orthographic Camera)设置起来较为直观,它的构造函数是:

THREE.OrthographicCamera(left, right, top, bottom, near, far)

这六个参数分别代表正交投影照相机拍摄到的空间的六个面的位置,这六个面围成一个长方体,我们称其为视景体(Frustum)。只有在视景体内部(下图中的灰色部分)的物体才可能显示在屏幕上,而视景体外的物体会在显示之前被裁减掉。

为了保持照相机的横竖比例,需要保证(right - left)(top - bottom)的比例与Canvas宽度与高度的比例一致。

nearfar都是指到照相机位置在深度平面的位置,而照相机不应该拍摄到其后方的物体,因此这两个值应该均为正值。为了保证场景中的物体不会因为太近或太远而被照相机忽略,一般near的值设置得较小,far的值设置得较大,具体值视场景中物体的位置等决定。

实例说明


下面,我们通过一个具体的例子来解释正交投影照相机的设置。

基本设置

设置照相机:

var camera = new THREE.OrthographicCamera(-2, 2, 1.5, -1.5, 1, 10);
camera.position.set(0, 0, 5);
scene.add(camera);

在原点处创建一个边长为1的正方体,为了和透视效果做对比,这里我们使用wireframe而不是实心的材质,以便看到正方体后方的边:

var cube = new THREE.Mesh(new THREE.CubeGeometry(1, 1, 1),
new THREE.MeshBasicMaterial({
color: 0xff0000,
wireframe: true
})
);
scene.add(cube);
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<script type="text/javascript" src="libs/three.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(); // camera
// canvas size is 400x300
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))通过lookAt函数指定它看着原点方向,这样我们就能过仰望正方体了;
//注意,lookAt函数接受的是一个THREE.Vector3的实例,因此千万别写成camera.lookAt(0, 0, 0),否则非但不能得到理想的效果,而且不会报错,使你很难找到问题所在。
scene.add(camera); // a cube in the scene
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>
</head> <body onload="init()">
<canvas id="mainCanvas" width="400px" height="300px" ></canvas>
</body>
</html>
 

得到的效果是:

我们看到正交投影的结果是一个正方形,后面的边与前面完全重合了,这也就是正交投影与透视投影的区别所在。

长宽比例

这里,我们的Canvas宽度是400px,高度是300px,照相机水平方向距离4,垂直方向距离3,因此长宽比例保持不变。为了试验长宽比例变化时的效果,我们将照相机水平方向的距离减小为2

var camera = new THREE.OrthographicCamera(-1, 1, 1.5, -1.5, 1, 10);

得到的结果是水平方向被拉长了:

[+]查看原图

照相机位置

接下来,我们来看看照相机位置对渲染结果的影响。在之前的例子中,我们将照相机设置在(0, 0, 5)位置,而由于照相机默认是面向z轴负方向放置的,所以能看到在原点处的正方体。现在,如果我们将照相机向右移动1个单位:

var camera = new THREE.OrthographicCamera(-2, 2, 1.5, -1.5, 1, 10);
camera.position.set(1, 0, 5);

得到的效果是物体看上去向左移动了:

[+]查看原图

仔细想一下的话,这也不难理解。就好比你人往右站了,看起来物体就相对往左移动了。

那么,正交投影照相机在设置时,是否需要保证leftright是相反数呢?如果不是,那么会产生什么效果呢?下面,我们将原本的参数(-2, 2, 1.5, -1.5, 1, 10)改为(-1, 3, 1.5, -1.5, 1, 10),即,将视景体设置得更靠右:

var camera = new THREE.OrthographicCamera(-1, 3, 1.5, -1.5, 1, 10);
camera.position.set(0, 0, 5);

得到的结果是:

[+]查看原图

细心的读者已经发现,这与之前向右移动照相机得到的效果是等价的。

换个角度看世界

到现在为止,我们使用照相机都是沿z轴负方向观察的,因此看到的都是一个正方形。现在,我们想尝试一下仰望这个正方体。我们已经学会设置照相机的位置,不妨将其设置在(4, -3, 5)处:

camera.position.set(4, -3, 5);

但是现在照相机沿z轴负方向观察的,因此观察不到正方体,只看到一片黑。我们可以通过lookAt函数指定它看着原点方向:

camera.lookAt(new THREE.Vector3(0, 0, 0));

这样我们就能过仰望正方体啦:

[+]查看原图

不过一定要注意,lookAt函数接受的是一个THREE.Vector3的实例,因此千万别写成camera.lookAt(0, 0, 0),否则非但不能得到理想的效果,而且不会报错,使你很难找到问题所在。

  <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Three框架</title>
<script src="libs/Three.js"></script>
<style type="text/css">
div#canvas-frame {
border: none;
cursor: pointer;
width: 100%;
height: 600px;
background-color: #EEEEEE;
} </style>
<script>
var renderer;
function initThree() {
width = document.getElementById('canvas-frame').clientWidth;
height = document.getElementById('canvas-frame').clientHeight;
renderer = new THREE.WebGLRenderer({
antialias : true
});
renderer.setSize(width, height);
document.getElementById('canvas-frame').appendChild(renderer.domElement);
renderer.setClearColor(0xFFFFFF, 1.0);
} var camera;
function initCamera() {
camera = new THREE.PerspectiveCamera(45, width / height, 1, 10000);
//camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, 10, 1000 );
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 600;
camera.up.x = 0;
camera.up.y = 1;
camera.up.z = 0;
camera.lookAt({
x : 0,
y : 0,
z : 0
});
} var scene;
function initScene() {
scene = new THREE.Scene();
} var light;
function initLight() {
light = new THREE.AmbientLight(0xFF0000);
light.position.set(100, 100, 200);
scene.add(light); light = new THREE.PointLight(0x00FF00);
light.position.set(0, 0,300);
scene.add(light);
} var cube;
function initObject() {
var geometry = new THREE.CylinderGeometry( 70,100,200);
var material = new THREE.MeshLambertMaterial( { color:0xFFFFFF} );
var mesh = new THREE.Mesh( geometry,material);
mesh.position = new THREE.Vector3(0,0,0);
scene.add(mesh);
} function threeStart() {
initThree();
initCamera();
initScene();
initLight();
initObject();
animation(); }
function animation()
{
changeFov();
renderer.render(scene, camera);
requestAnimationFrame(animation);
} function setCameraFov(fov)
{
camera.fov = fov;
camera.updateProjectionMatrix();
} function changeFov()
{
var txtFov = document.getElementById("txtFov").value;
var val = parseFloat(txtFov);
setCameraFov(val);
}
</script>
</head> <body onload="threeStart();">
<div id="canvas-frame"></div>
<div>
Fov:<input type="text" value="45" id="txtFov"/>(0到180的值)
</div>
</body>
</html>

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABFsAAAIPCAIAAAAjDUaEAAAgAElEQVR4nO3dd5TuVX3v8R2R3gUpIlWRXlR6HXoHEZAu0nuRYk3caGLUGIMxStQQMZYYW9RoNNbBihVU7AVUVLBETW7x/nP93j+2v+fuc2bmmWdmnmfafr0WfyRHOMy4xrXOZ8183zsFAABAq9JCfwAAAAALxiICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAgFEaH48X5XhxjpfmeHmOV+R4ZY6/y3F7jtfluCPHnTnelOMtOd6W4x053p3jvTnen+ODOT6c4yM5PprjYzk+nuMTOcZz3JXjkzk+lePTOT6T47M5Ppfj7hyfz/GFHF/M8aUcX8lxT457c3w1x9dyfD3HfTm+keObOb6V49s5vpPjuzm+l+P7OX6Q44c57s/x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kePjOT6W4yM5/iPHB3N8IMf7crwnx7tzvDPH23O8Lcdbc7w5xxtzvCHHHTlen+O1OW7P8eocr8pxW45X5Hh5jpfleEmOF+f48xwvzAv89TwwiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7FmYR3ffgHy65/eHn3XGfv1r+65LbH77vwT8syFcgAAAUC7OI3nr3H577D19fkH81i8fz7rjvLZ/7v6P4nVMa1Rf2xN952n/XSn/D6D42AABmwSJiwUy6iPoPhjS1wX+TuRjdIrKUAAAWhEXEgpm4iGa0Cvr8zSNaF5P+toMsogUfcgAATKXfnyn7/NFtjiwiYsIimmpvDL5Der844D/S58t70rky6f8i+v/PZKbfUzKKAADm2Qz+cDbEP6tNtoh+P379pukldw/rX8HiN+0immrh1P/vpP/3VGNmqt9kkN9n0r9/2v+NWEQAAIvcQH84G/qf0iYuot/f+5J9U7KImlIvommXQ5+vxon/0SDfIxrw9+//69P+nlN9K6nP912NIgCA+TR/i6j+I+CERfTAnadcfvkFFlFbZrGIJt0VvS+teV5Eg3zMgwy5AX8dAIBRGLTrNe1/tNIfTCf+U30W0UPvOfPMtz1090ssorbM7ntEk/7KLBbRVH//XJZS/w9p0hU3yMcJAMDozOZ7RDP9o+FEKyyi349ff+ht90ZYRK0Z4iJa6VcGXEQxRUFhqt9zqj0z8d/b5//o//H0+XUAAEZh4RfRvbcd8+y7fx8WUXsWfBEN5XtE/f+9vkcEALDIzSZ7Ne0fDaf9I93/X0QP3HnK5R/6bURYRO2ZdVlhqmkxo0U00+Uz7ULr/1n4HhEAwOK0wIvoobedsvKfbU9520MDfuwscf3r26P+HtH8L6JBvkdkDgEAzLMhL6L+/1TvP5r0hVbfI2rNrN8j6vOLg//90w77qX5xRh/STL9HZBEBAMyzfn+m7H/qMNXfYBExoJUWUUwxGwb5Ipx27Uz6d/b/Mu7/m4xiEZlDAADzb2H+BDbpIqI1ExdRTLcKBtwko5gW035PaaqPZ1qT/v4AAMwPi4gFM+kimta0y2FBpkWfb2TN80cCAMCMWEQsmNktIgAAGCKLiAVjEQEAsOAsIhaMRQQAwIJbmEV034N/uOT2h5//j9/wV8t/XXL7w/c9+IcF+QoEAIBiwc6+73vwD2+9219N/2UOAQCw4ISwAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANplEQEAAO2yiAAAgHZZRAAAQLssIgAAoF0WEQAA0C6LCAAAaJdFBAAAtMsiAgAA2mURAQAA7bKIAACAdllEAABAuywiAACgXRYRAADQLosIAABol0UEAAC0yyICAADaZREBAADtsogAAIB2WUQAAEC7LCIAAKBdFhEAANAuiwgAAGiXRQQAALTLIgIAANr1/wAk0fniXihjoQAAAABJRU5ErkJggg==" alt="" />

最新文章

  1. 支付宝支付-APP支付服务端详解
  2. scrollview 图片放大 捏合 瓦片地图 相关注意事项
  3. 路由器DHCP 动态主机配置
  4. 用Dictionary代替if
  5. bzoj3620 似乎在梦中见过的样子
  6. POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】
  7. JQuery中html()方法的注意事项
  8. draw lines on ColumnChart
  9. JS倒计时器一只,顺便复习javascript时间相关函数
  10. CodeForces 652D Nested Segments
  11. 本地创建Duplicate数据库
  12. 填坑:在 SegmentFault 开发单页应用之图片引用的问题探索
  13. linux 下 mysql 常用命令
  14. 新安装 Ubuntu 系统设置root用户密码!谨此纪念自己踩过的坑!
  15. 【转】jQuery 的 ajax 方法,返回结果 readyState=4 并且 status=200 时,还进 error 方法
  16. mySql---剖析InnoDB索引原理
  17. Gradle修改Maven仓库地址
  18. HDU 1166 敌兵布阵(线段树 or 二叉索引树)
  19. 最新版本的Struts2+Spring4+Hibernate4三大框架整合(截止2014-10-15,提供源码下载)
  20. python 类变量 在多线程下的共享与释放问题-乾颐堂

热门文章

  1. weblogic重置用户名密码。
  2. 求sqrt()底层效率问题(二分/牛顿迭代)
  3. http协议之request
  4. javascript - DOM对象控制HTML元素详解
  5. execl一个工作薄中有几个个工作表,将这几个个工作表分别保存到不同execl文件中
  6. asmlinkage
  7. jQuery ajax同步的替换方法,使用 $.Deferred()对象
  8. Gmail 账号找回办法
  9. T-SQL 常用语句
  10. PHP数组合并的常见问题