我正在阅读“实时渲染”一书中的Billboarding部分,作者解释说,为了将四边形(即广告牌)旋转到某个方向,旋转矩阵将
M = (r, u, n)
其中r
,u
,n
是计算(标准化)的方向向量。
我已经了解到,为了旋转内容,必须使用包含大量脏sin()
和cos()
计算的矩阵。为什么这个M
矩阵使用普通方向向量?
答案 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
,那么这正是你需要的转换。
请注意,这通常会给你一个仿射变换,如果你的向量是正交的,它只会是一个严格的旋转。