来自方向向量的旋转矩阵

时间:2015-12-15 16:22:16

标签: matlab matrix graphics

我正在阅读“实时渲染”一书中的Billboarding部分,作者解释说,为了将四边形(即广告牌)旋转到某个方向,旋转矩阵将

M = (r, u, n)

其中run是计算(标准化)的方向向量。

从书中: enter image description here

我已经了解到,为了旋转内容,必须使用包含大量脏sin()cos()计算的矩阵。为什么这个M矩阵使用普通方向向量?

2 个答案:

答案 0 :(得分:3)

只有在想要从角度表示转换为矢量表示时才使用正弦和余弦。但我们首先分析是什么使矩阵成为旋转矩阵。

旋转矩阵是正常的并且具有行列式+1。这意味着它们的列向量具有单位长度并且它们彼此垂直。正交矩阵的一个很好的特性是你可以通过转置它们来反转它们。但这只是一个很好的功能。

如果我们有2D旋转矩阵

M = /  cos a   sin a \
    \ -sin a   cos a /

,我们看到情况就是这样。第一列向量是(cos a, -sin a)。根据毕达哥拉斯定理,我们得到该向量具有单位长度。此外,它垂直于第二列向量(它们的点积为零)。

到目前为止,这么好。该矩阵是旋转矩阵。但我们可以解释列向量吗?的确,我们可以。第一列向量是向量(1, 0)的图像(即右向量)。第二列向量是向量(0, 1)的图像(即向上向量)。

所以你看到使用正弦和余弦只是另一种计算方向向量的方法。这样做会自动确保它们具有单位长度并且它们彼此正交。但这只是一种方式。您还可以使用叉积或任何其他方案计算方向向量。关键点是满足旋转矩阵属性。

答案 1 :(得分:2)

如果您的转换是角度,则需要那些脏的三角函数。但是,如果您知道笛卡尔单位向量的图像,则可以轻松构造矩阵。

如果DELIMITER // CREATE FUNCTION add_digits ( number INTEGER ) RETURNS INTEGER BEGIN DECLARE my_sum INTEGER; SET my_sum = 0; SET number = ABS(number); WHILE (number > 0) DO SET my_sum = my_sum + (number MOD 10); SET number = number DIV 10; END WHILE; RETURN my_sum; END // DELIMITER ; 的图片为[1; 0; 0]r[0; 1; 0]u[0; 0; 1],则矩阵的效果将为是

n

如果你的矩阵是M * [1; 0; 0] == 1*r + 0*u +0*n == r M * [0; 1; 0] == 0*r + 1*u +0*n == u M * [0; 0; 1] == 0*r + 0*u +1*n == n ,那么这正是你需要的转换。

请注意,这通常会给你一个仿射变换,如果你的向量是正交的,它只会是一个严格的旋转。