[计算机图形学04]Unity中的仿射变换和透视变换

模型变换

首先我们可以看一下在Unity中如何用脚本旋转一个GameObject,其中一个可行的办法就是如下。

void Awake() 
{ 
    cube1 = GameObject.CreatePrimitive(PrimitiveType.Cube); 
    cube1.transform.position = new Vector3(0.75f, 0.0f, 0.0f); 
    cube1.transform.Rotate(90.0f, 0.0f, 0.0f, Space.Self); 
    cube1.GetComponent().material.color = Color.red; 
    cube1.name = "Self"; 
    cube2 = GameObject.CreatePrimitive(PrimitiveType.Cube); 
    cube2.transform.position = new Vector3(-0.75f, 0.0f, 0.0f); 
    cube2.transform.Rotate(90.0f, 0.0f, 0.0f, Space.World); 
    cube2.GetComponent().material.color = Color.green; 
    cube2.name = "World"; 
} 
void Update() 
{ 
    cube1.transform.Rotate(xAngle, yAngle, zAngle, Space.Self); 
    cube2.transform.Rotate(xAngle, yAngle, zAngle, Space.World); 
}

其中用到的函数就是Rotate,它的原型如下:

public void Rotate(Vector3 eulers, Space relativeTo = Space.Self);
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
The implementation of this method applies a rotation of zAngle degrees around the z axis, xAngle degrees around the x axis, and yAngle degrees around the y axis ( in that order).

根据这个函数的描述,我们可以知道,Unity实现这个函数是通过先绕z轴旋转,然后绕x轴旋转,最后绕y轴旋转。也就是:

$$ P'= M_{rotateY}M_{rotateX}M_{rotateZ}P $$

从模型空间转换到世界空间需要考虑Transform的继承结构。若不考虑父节点,依循先缩放、在旋转、最后平移的原则,模型空间的某点应当以如下方式换算:也就是:

$$ P'= M_{translate}M_{rotateY}M_{rotateX}M_{rotateZ}M_{scale}P $$

如果Transform仍有父亲,则继续按照如上原则计算,直至抵达世界空间。

观察变换

观察变换需要定义摄像机。通常,摄像机有三个参数,即EyeLookAt和Up。 Eye指摄像机在世界空间中位置的坐标;LookAt指摄像机在世界空间观察的位置的坐标;Up则指在世界空间中,近似于摄像机朝上的方向分量,通常定义为世界坐标系的y轴。给定这三个参数即可定义观察空间,观察空间的原点位于Eye处。这个空间可以用以下表示:

$$ \{U,V,N\} $$

分别对应x,y,z坐标轴。在观察空间中,摄像机位于原点位置且指向-N,即摄像机的观察方向,也称为朝前方向(forward)为-N

$$ N= \frac{Eye-LookAt}{\mid\mid Eye-LookAt \mid\mid} $$

$$ U = \frac{Up \times N}{\mid\mid Up \times N\mid\mid} $$

$$ V = N \times U $$

观察矩阵及其推导过程

你可能感兴趣的:(图形学)