计算机图形学实现直线的平移旋转和缩放java_计算机图形中变换的相关性

这是对Foundation of 3D Computer Graphics第5章的翻译,本章讲解了点和矢量变换中相对于坐标系的关联性,包含辅助帧变换、左侧规则(left of rule)和多重变换的解读等内容。本书内容仍在不断的学习中,因此本文内容会不断的改进。若有任何建议,请不吝赐教ninetymiles@icloud.com。

注:文章中相关内容归原作者所有,翻译内容仅供学习参考。
另:Github项目CGLearning中拥有相关翻译的完整资料、内容整理、课程项目实现。

关联(Respect)

4.1 帧的重要性(The Frame Is Important)

在计算机图形学中我们同时跟踪多种不同的帧(frames)。例如,我们针对场景中每个物体都会拥有一个不同的帧。我们如何使用和组织这些帧的详细说明在第5章中会被讲述。因为存在这许多帧,当运用矩阵定义变换时,我们需要尤其小心。

假如我们指定一个点和一个变换矩阵(transformation matrix),这并不能完全明确出实际的变换。我们还要确定出我们正在使用什么帧(frame)。这里有一个展示这种情况的简单例子。假设我们开始于点

equation?tex=%5Ctilde%7Bp%7D 以及一个矩阵

equation?tex=+%5Clarge%7B+S+%3D++%5Cbegin%7Bbmatrix%7D+2+%26+0+%26+0+%26+0+%5C%5C+0+%26+1+%26+0+%26+0+%5C%5C+0+%26+0+%26+1+%26+0+%5C%5C++0+%26+0+%26+0+%26+1+%5Cend%7Bbmatrix%7D+%7D+%5C%5C

现在我们要指定帧

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 。借助这个帧,点可以借助某种恰当的坐标矢量(coordinate vector)表示为
equation?tex=%5Ctilde%7Bp%7D%3D%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et%5Cmathbf%7Bc%7D 。如果我们使用这个矩阵去变换这个点,就如在第3章中所讲述的,我们获得
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et%5Cmathbf%7Bc%7D+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtS%5Cmathbf%7Bc%7D 。在这种情形中,矩阵的效用是从原点(origin)通过一个值为2的伸缩因子(scale factor)变换点,沿着
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 第一个轴(
equation?tex=x 轴)的方向。

假设我们挑选另外某个帧

equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et ,同时假设这个帧关联于原来的帧,通过矩阵方程式
equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et+%3D+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtA 。我们可以在新帧中表达最初的点,借助一个新的坐标系
equation?tex=%5Ctilde%7Bp%7D%3D%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et%5Cmathbf%7Bc%7D+%3D+%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et%5Cmathbf%7Bd%7D ,此处
equation?tex=%5Cmathbf%7Bd%7D%3DA%5E%7B-1%7D%5Cmathbf%7Bc%7D

现在,如果我们关联于

equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et 使用矩阵S去执行在点上的变换,我们获得
equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et%5Cmathbf%7Bd%7D+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5EtS%5Cmathbf%7Bd%7D 。在这种情形中,我们伸缩了相同的点
equation?tex=%5Ctilde%7Bp%7D ,但是这次我们已经从
equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et 的原点(origin)且在其第一个轴(
equation?tex=x 轴)的方向上伸缩(移动)了这个点。这是一个不一样的变换(参考图示
equation?tex=%5Ctext%7BFigure+4.1%7D )。图示
equation?tex=%5Ctext%7BFigure+4.2%7D 展示了在帧上旋转变换的相同依赖性,借助于一个固定的旋转矩阵R。

961636b69660f4b30eef40a9c8abc4b8.png

Figure 4.1: 伸缩矩阵(scaling matrix)

equation?tex=S 被用来关联于两个不同的帧(frame)以伸缩点
equation?tex=%5Ctilde%7Bp%7D 。这导致了两种不同的答案。

0f9e4220644f9389e0573e9b0e22db8e.png

Figure 4.2: 旋转矩阵(rotation matrix)R被用来关联于两个不同的帧(frame)以旋转点

equation?tex=%5Ctilde%7Bp%7D 。这也导致两种不同的答案。

这里需要注意的重要事项是,表达式中点被关联于直接出现在变换矩阵左侧的帧(frame)被这个矩阵变换(本例中为非均匀缩放)。因此我们称呼这个为左侧规则(left of rule)。我们读表达式

equation?tex=%5Ctilde%7Bp%7D%3D%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et%5Cmathbf%7Bc%7D+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtS%5Cmathbf%7Bc%7D+%5C%5C

为”(点)

equation?tex=%5Ctilde%7Bp%7D 关联于
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 被(矩阵)
equation?tex=S 变换“。

我们读表达式

equation?tex=+%5Ctilde%7Bp%7D%3D%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5EtA%5E%7B-1%7D%5Cmathbf%7Bc%7D+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5EtSA%5E%7B-1%7D%5Cmathbf%7Bc%7D++%5C%5C

为“(点)

equation?tex=%5Ctilde%7Bp%7D 关联于
equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et 被(矩阵)
equation?tex=S 变换”。

我们可以应用相同的推理到帧(frame)本身的变换上。我们读表达式

equation?tex=+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtS++%5C%5C

为“

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 关联于
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 被(矩阵)
equation?tex=S 变换”。

我们读表达式

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5EtSA%5E%7B-1%7D+%5C%5C

为“

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 关联于
equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et 被(矩阵)
equation?tex=S 变换”。

4.1.1 借助辅助帧(auxiliary frame)变换

很多时候当我们希望借助某种用矩阵M表达的特殊方式变换一个帧

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et ,变换关联于某种辅助帧
equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et 。例如,我们可能正在借助某种帧(frame)建模行星地球,现在我们希望地球同时围绕太阳所在的帧(frame)旋转。

这很容易实现,只要我们知道关联

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et
equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et 的矩阵。例如,我们已知这种关系

equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et+%3D+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtA+%5C%5C

那么被变换的帧(frame)可以被表达为

equation?tex=%5Clarge%7B+%5Cquad+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et+++%5C%3B%5Cqquad%5Cquad%5Cqquad+%5Cquad+%284.1%29+%5C%5C++%3D+%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5EtA%5E%7B-1%7D+%5Cqquad%5Cquad%5Cquad+%284.2%29+%5C%5C+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5EtMA%5E%7B-1%7D++%5C%3B%5C%3B%5Cqquad+%284.3%29+%5C%5C+%3D+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtAMA%5E%7B-1%7D+%5Cqquad+%284.4%29+%7D+%5C%5C

第一行中,我们借助帧(frame)

equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et 重写
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 。第二行中我们用“左侧规则(left of rule)“变换帧系统(frame system);我们借助矩阵M关联于帧
equation?tex=%5Cvec%7B%5Cmathbf%7Ba%7D%7D%5Et 进行变换。最后一行中,我们只是重写了表达式从而移除辅助帧(auxiliary frame)。

4.2 多重变换(Multiple Transformations)

我们可以使用这种“左侧”规则解读多重变换序列。再次,回想一下,通常,矩阵乘法不可交换。在下列的2D例子中,让

equation?tex=R 为一个旋转矩阵,
equation?tex=T 为一个平移矩阵,这里平移矩阵具有在第一个轴上平移矢量的效用,而旋转矩阵拥有围绕帧的原点旋转
equation?tex=%5Ctheta 度的效果。(参考图示
equation?tex=%5Ctext%7BFigure+4.3%7D )。

我们现在解读下列的变换

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtTR+%5C%5C

我们通过将变换切分为两个步骤来解读

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtT+%3D+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%27%5Et+%5C%5C

这个步骤被解读为:

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 关联于
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 被矩阵T变换,同时我们称呼结果帧为
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%27%5Et

在第二步中,

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtT+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtTR+%5C%5C

或者等价地,

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%27%5Et+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%27%5EtR++%5C%5C

这个步骤被解读为:

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%27%5Et+ 关联于
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%27%5Et 被矩阵R变换。

我们也可以用另一种方式解读被合成的变换(composed transformations)。这通常通过以其它次序应用旋转和平移变换来完成。第一步中

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtR+%3D+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5E%7B_ot%7D+%5C%5C

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 关联于
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 被矩阵R变换,同时我们称呼结果帧为
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5E%7B_ot%7D 。第二步中

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtR+%5CRightarrow+%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5EtTR+%5C%5C

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5E%7B_ot%7D 关联于
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 被矩阵
equation?tex=T 变换。

这些只是对两个最后完全相同的合成变换的不同解释。1)先关联于

equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 平移然后关联于中间帧(intermediate frame)旋转。2)先关联于
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 旋转再关联于最初帧
equation?tex=%5Cvec%7B%5Cmathbf%7Bf%7D%7D%5Et 平移。

这些类型的解释经常被总结如下:如果我们阅读变换从左侧到右侧,那么每个变换关联于新生成的“本地”帧(frame)被完成。如果我们阅读变换从右侧到左侧,那么每个变换关联于最初的“全局”帧(frame)被完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值