在3D中从变换矩阵计算“上向量”

6
我最近在处理3D项目时遇到了奇怪的问题。大家都知道计算LookAt向量的算法,但是从变换矩阵中计算"up"向量并不容易(或者我可能错过了一些东西)。
问题如下:
对于恒等旋转矩阵和旋转矩阵,其"up"向量为(0, 1, 0),但不包含缩放和平移。如果矩阵包含平移和旋转(例如由多个其他矩阵相乘产生的矩阵),这种方法将无效,因为向量会被平移和缩放。
我的问题是如何从单个变换矩阵中获取此"up"向量,假定向量(0, 1, 0)对应于恒等旋转矩阵。

1
不存在“恒等旋转矩阵”这样的东西。根据定义,恒等矩阵在特定基础下不改变向量。 - Janie
1
我不明白你的问题。你是想要世界坐标系的“上”还是本地坐标系的“上”?你能否通过一些示例矩阵来解释一下你正在做什么? - Nosredna
世界坐标系中的矩阵Y轴向量(即上方向)可以通过描述方式或直接从矩阵中提取获得。如果您在应用更多矩阵后仍未找到所需结果,则说明您需要的不是上方向,而是其他方向。在这种情况下,请更详细地说明并添加图像。参见https://dev59.com/QYLba4cB1Zd3GeqPck_c#25216549。 - Spektre
5个回答

9
实际上,翻译确实会影响到它。比如说,在这个例子中,变换矩阵没有进行任何缩放或旋转,但是将其在Z方向上平移了2个单位。那么当你对(0,1,0)进行变换时,你得到的是(0,1,2),然后对其进行归一化处理得到的是(0,1/sqrt(5), 2/sqrt(5))。
你需要做的是取(0,1,0)的变换和(0,0,0)的变换之间的差异,然后对结果向量进行归一化处理。在上面的例子中,你应该取(0,1,2)减去(0,0,2)(即零向量的变换)得到所需的(0,1,0)。

(例如讨论逆矩阵) - Janie

5

将矩阵应用于上向量的两个端点——(0,0,0)和(0,1,0)。计算这两个点之间的向量,然后将其缩放以获得单位向量。这样就可以解决平移问题。


2

只需将向上的向量(0,1,0)与变换矩阵相乘并进行归一化,您就可以得到新计算出的向上向量。


除非转换中没有平移,否则此解决方案无法使用。请参考Alex319的具体示例。 - Richard Dunlap
1
他提到了旋转,但没有提到平移。显然,他必须计算出平移矩阵的逆矩阵。由于平移矩阵与连接的旋转矩阵相乘结果不变,因此逆矩阵可以在任何时候应用。 - Janie

0

我知道这是一个旧帖子,但我觉得有必要指出这一点,以便其他遇到此问题的人能够看到。

在线性代数中,我们被教导将矩阵视为一组基向量,每个向量代表空间中描述相对位置的方向。

任何矩阵的基向量(描述基本方向的向量)可以直接从相关矩阵列中读取。 简单地说,您的第一列是“x ++”向量,第二列是“y ++”向量,第三列是“z ++”向量。如果您正在使用3D的4x4矩阵,则这些列的最后一个元素和最后一列与原点的平移有关。在这种情况下,可以简单地忽略这些向量的每个最后一个元素和任何这样矩阵的最后一列。

示例:让我们考虑表示绕y轴旋转90度的矩阵。
[0, 0, -1]
[0, 1, 0]
[1, 0, 0]

上向量可以从第三列中明显提取出来,因为矩阵正在对y轴应用90度旋转,所以上向量现在指向x轴向下(如向量所示)。您可以获取基向量以获得正的基本方向,并将它们取反将给您相反的对应项。

一旦您有一个矩阵可以从中提取方向,就不需要进行非平凡计算。


抱歉,我现在才回顾这个答案并发现我的错误。基向量的方向(列或行)取决于您如何将上向量表示为向量或向量的矩阵对偶。如果值被编码为行或列,则基向量位于行上。因此,最好通过将单位向量乘以矩阵来获取与向量和矩阵乘法关系相关的基向量。 - SteamyThePunk

0

我不是矩阵计算方面的专家,但我认为这只是一个简单的问题,需要计算乘积矩阵的上向量,并将结果向量归一化为单位向量。翻译不应该对其产生影响,而缩放可以通过归一化轻松解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接