2022-10-31 通过lookAt矩阵的推导理解坐标

2022-10-31  本文已影响0人  MrSwilder

一、坐标变换和基变换

:基的概念源于线性代数,一般指向量空间的基,基就是坐标轴的单位向量
坐标:在线性代数中,坐标的全称为:向量关于基的坐标。

1.1、坐标变换与左乘

1.1.1 坐标变换

1.1.2 左乘

如果一个矩阵总是以固定的坐标系运动,我们便可以用一个坐标系下面的“描述”来描述这样一个变化。

注意,在每一个旋转矩阵里面这个“描述”都是会基于一个基座标系,例如:


image.png

上述矩阵描述的是,整个矩阵绕着z轴旋转

现有两个矩阵:


image.png
image.png

其中,A是一个绕着Z轴的旋转矩阵,B是一个平移变化的矩阵。我们可以注意到,这个矩阵里面的“数字”依然是围绕着一个基坐标描述的(在这里我们不妨把它称作是“大地坐标”),也就是以大地为基座标。


image.png
如果我们每次采取的变化,都是围绕着基座标的话,我们便可以用“左乘”,利用他们的变化性质进行变化:比如说,我们想要先进行一次旋转变化A,然后再进行一次平移变化B,我们应该怎么做呢?

我们可以利用的性质是:我们在进行坐标系的变化过程中,总是采用的是左乘的方法,所以我们可以推知,我们想要变化的向量总是会先“接触”其左边的变化矩阵,所以在及坐标系下面,我们采用的变化就是 的矩阵描述总变换

1.2 基变换与右乘

1.2.1 基变换

1.2.2 右乘

要是我们想先进行一次旋转变换然后再根据这个旋转变化后的新坐标系,再做一次平移变换我们应该怎么做呢?

这时候我们就会发现,单纯地用左乘的方法似乎达不到效果了。因为在第一个变化生效的时候,第二个变化的基座标系已经发生了改变,它是基于第二的坐标系再变化。所以我们在这里引用了一个右乘的概念,

可以这样理解,如果我们以大地为基座标,尽管平移变换是在旋转变化之后发生的,但是平移变换还是要受旋转变换的影响的(注意此时我们的视角是在“大地”)。

但是,如果我们把目光放在了旋转这个新的坐标下面,我们能关注到的,就是 这个平移矩阵仅仅做了一个平移的变换。因为此时,我们把旋转矩阵作为基矩阵。

但是,我们所需要的答案是把大地作为基矩阵下的答案,所以还是得把旋转矩阵在大地坐标下面描述出来。

这个计算顺序的变化,就是我们所引入的“右乘”概念。*

1.3、总结:

【简单理解】:

二、LookAt矩阵推导

lookAt函数的矩阵形式为

/**
 * Multiply the viewing matrix from the right.
 * @param eyeX, eyeY, eyeZ The position of the eye point.
 * @param centerX, centerY, centerZ The position of the reference point.
 * @param upX, upY, upZ The direction of the up vector.
 * @return this
 */
Matrix4.prototype.lookAt = function (
    eyeX,
    eyeY,
    eyeZ,
    centerX,
    centerY,
    centerZ,
    upX,
    upY,
    upZ
) 

其中眼睛位置为eye,上方向为up,目标点为center,则视图空间三个基u,v,w为

image.png

2.1 从点变换角度

设世界坐标为(x,y,z),相机空间坐标为(x1,y1,z1),变换矩阵为View
\left( \begin{array}{c} x1\\ y1\\ z1\\ \end{array} \right) =View*\left( \begin{array}{c} x\\ y\\ z\\ \end{array} \right)

此时对应点并不好找,u,v,w在世界坐标中的位置并不好找

2.2 从基变换角度

点从世界空间变换到相机空间等价于相机空间坐标轴(即基)变换到世界空间,可分为两步 ,平移到原点(T)和绕原点旋转到与世界空间基底重合(R)
即View=RT
首先平移矩阵
T=\left[ \begin{matrix} 1& 0& 0& -eye.x\\ 0& 1& 0& -eye.y\\ 0& 0& 1& -eye.z\\ 0& 0& 0& 1\\ \end{matrix} \right]

旋转矩阵
此时基底从u,v,w变为(1,0,0),(0,1,0),(0,0,1)此时对应关系并不好写,但是取逆变换就比较好写,即
R^{-1}=\left[ \begin{matrix} a& b& c& 0\\ d& e& f& 0\\ g& h& i& 0\\ j& k& l& 1\\ \end{matrix} \right] \times \left[ \begin{matrix} 1& 0& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] =\left[ \begin{matrix} u.x& v.x& w.x& 0\\ u.v& v.y& w.y& 0\\ u.w& v.z& w.z& 0\\ 0& 0& 0& 1\\ \end{matrix} \right]
则R
R=\left[ \begin{matrix} u.x& v.x& w.x& 0\\ u.v& v.y& w.y& 0\\ u.w& v.z& w.z& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] ^{-1}=\left[ \begin{matrix} u.x& v.x& w.x& 0\\ u.v& v.y& w.y& 0\\ u.w& v.z& w.z& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] ^T=\left[ \begin{matrix} u.x& u.y& u.z& 0\\ v.x& v.y& v.z& 0\\ w.x& w.y& w.z& 0\\ 0& 0& 0& 1\\ \end{matrix} \right]

View=R*T=\left[ \begin{matrix} u.x& u.y& u.z& 0\\ v.x& v.y& v.z& 0\\ w.x& w.y& w.z& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] *\left[ \begin{matrix} 1& 0& 0& -eye.x\\ 0& 1& 0& -eye.y\\ 0& 0& 1& -eye.z\\ 0& 0& 0& 1\\ \end{matrix} \right] =\left[ \begin{matrix} u.x& u.y& u.z& -u*eye.x\\ v.x& v.y& v.z& -v*eye.y\\ w.x& w.y& w.z& -w*eye.z\\ 0& 0& 0& 1\\ \end{matrix} \right]

上一篇 下一篇

猜你喜欢

热点阅读