3D Camera一点介绍

来源:互联网 发布:d3.js demo显示 编辑:程序博客网 时间:2024/04/19 07:20
原文链接:http://www.badlogicgames.com/wordpress/?p=1550

(原)Camera in libgdx - tonmyWu - tonmyWu
 
Camera是通过在3D空间中的位置定义的, 方向由指向特定方位的单位向量组成。想象一个箭头从你的头顶指向天空,这个就是指向上的方向向量。同样的,把你的头指向左边和右边。你能想象出方向的改变吗? 方向向量(direction vector)能够让我们告诉OpenGL 如何设置Camera的方位。而位置向量(position vector)则定义了Camera 在3D世界中的位置。

位置和方位只是Camera其中的一部分。Camera 另个一重要的属性就是视锥(view frustum)。在上面的图片中,可以看到一个椎体在视点(图中眼睛的位置)被截去了顶端,这个就是视椎。所有在这个截头锥体(frustum)里面的东西都会被显示在屏幕上。这个截头锥体被6个切面(clipping planes)所定义,分别为:near, far, left, right, top and bottom。在上面的图片中的所看到截头锥体只是整个椎体的一侧。对于近切面它有一个特殊的作用:你可以把它想象成一个Camera 生成图画的表面(surface),这个把3D空间转换为2D平面过程,称为投影(projection)。

正交投影(Orthographic projection) 通常被用于2D图形。不管物体距离Camera有多远,在屏幕都会被显示成一样的大小。
而透视投影(Perspective projection)是真实世界中的投影:距离我们眼睛越远的物体,看起来会越小。

这种有趣的现象,在我们Camera属性中,其实就是改变视椎的形状。在透视投影中,视椎就像上面图片中的一样;而在正交投影中,视锥其实是一个盒子。真正的投影过程其实非常简单:对于物体上的每个点,我们画一条线连接至Camera的位置,并计算出哪里触碰到视锥的近切面。下面的图片展示了两种投影的原理:

                            透视投影                                                                正交投影
(原)Camera in libgdx - tonmyWu - tonmyWu
(绿色的部分就是看到的投影后的物体)

你可以看出在透视投影中,物体在投影后缩小了,而在正交投影中物体的尺寸并没有改变,你知道这是为什么吗? 没错,造成这种差异的就是视锥的形状!在OpenGL里不管你用的是SpriteBatch还是绘制一些字体,你永远都是在3D的世界中。技巧就在于,当你使用正交相机(orthographic camera)时,你就假装Z-axis并不存在。下面是一个在3D空间中的2DSprite:

 (原)Camera in libgdx - tonmyWu - tonmyWu
  
所以请忘记2D 与 3D 的区别吧。其实它们没有区别。当你通过SpirteBatch绘制图形,并且没有设置任何的矩阵(matrices)时,那么你的2D 视锥就像下面的图片所示的那样:

 (原)Camera in libgdx - tonmyWu - tonmyWu
 
就是一个简单的盒子!我们所有的Sprite都忽略了z-axis,只在X/Y平面上移动,从而产生好像在2D空间中的错觉。


透视相机(perspective camera)使用两个属性来定义自身的投影: 视野(the field of view) 和 宽高比(aspect ratio)。
视野其实是一个定义 视锥应该开多大的角度,如下右图:
(原)Camera in libgdx - tonmyWu - tonmyWu

而宽高比就是视窗(viewport)的宽度和高度的比值。 视窗就是Camera渲染图像的矩形区域(如上左图)。所以如果的屏幕分辨率为480*320 pixels,那么你的宽高比就是 480/320。
 
对于正交相机(orthographic camera)的投影仅仅就是由视窗的尺寸所决定,就像之前的图片所表示那样(看上去像个盒子那张)。

0 0
原创粉丝点击