我刚刚在3D项目中遇到了奇怪的问题。每个人都知道计算LookAt向量的算法,但是从变换矩阵计算“向上”向量并不是那么容易(或者至少也许我简单地错过了一些东西)。
问题在于:
“向上”向量是(0,1,0)用于同一性旋转矩阵并用矩阵旋转,但不进行缩放或平移。如果你有简单的旋转矩阵程序很容易(乘法矢量和矩阵)。但是如果矩阵也包含平移和旋转(例如,它是通过乘以其他几个矩阵产生的),这将无法工作,因为矢量将被翻译和缩放。
我的问题是如何从单个变换矩阵得到这个“向上”向量,假设向量(0,1,0)对应于身份旋转矩阵。
答案 0 :(得分:6)
翻译确实会影响它。假设在该示例中,变换矩阵没有进行任何缩放或旋转,但确实在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,0,2是零向量的变换)得到(0,1,0)所需的。
答案 1 :(得分:3)
简单地将向上矢量(0,1,0)与变换相乘,并进行归一化。你将以这种方式获得新的计算向量。
答案 2 :(得分:3)
将矩阵应用于向上矢量的两个端点 - (0,0,0)和(0,1,0)。计算这两个点之间的向量,然后对其进行缩放以获得单位向量。这应该照顾翻译问题。
答案 3 :(得分:0)
我不是矩阵计算的专家,但它让我感到很简单,就是计算乘法矩阵的向上矢量并将得到的矢量归一化为单位矢量。翻译不应该影响它,缩放很容易通过规范化来消除。
答案 4 :(得分:0)
我知道这是一个老线程,但我觉得有必要向其他任何绊倒这个问题的人指出这一点。
在线性代数中,我们被教导将矩阵视为基础向量的集合,每个向量表示可用于描述原点相对位置的空间方向。
任何矩阵的基矢量(描述基本方向的矢量)都可以直接从相关的矩阵列中读取。 简单地说,你的第一列是你的" x ++"矢量,你的第二个是" y ++"向量,第三个是" z ++"向量。如果您在3d中使用4x4矩阵,则这些列的最后一个元素和最后一列与原点的转换有关。在这种情况下,为简单起见,可以忽略这些向量中的每一个的最后一个元素和任何这样的矩阵的最后一列。
示例:让我们考虑一个表示围绕y轴旋转90度的矩阵
[0,0,-1]
[0,1,0]
[1,0,0]
向上矢量可以从第三列明确地提取为(-1,0,0),因为矩阵围绕y轴应用90度旋转,向上矢量现在指向x轴(作为矢量)说),你可以获得基本向量来获得积极的基本方向,而否定它们会给你相反的对手。
一旦你有一个矩阵从中提取方向,就不需要进行非平凡的计算。