【问题标题】:Rotation matrix from direction vectors来自方向向量的旋转矩阵
【发布时间】:2015-12-16 00:32:48
【问题描述】:

我正在阅读 Real-Time Rendering 一书中的广告牌部分,作者解释说,为了将四边形(即广告牌)旋转到某个方向,旋转矩阵将是

M = (r, u, n)

其中run 是计算(归一化)的方向向量。

从书中:

我了解到,为了旋转东西,必须使用包含大量脏 sin()cos() 计算的矩阵。这个M 矩阵怎么会使用纯方向向量?

【问题讨论】:

  • 请注意,您的问题与编程无关:)
  • 嘘!我正在阅读你的答案
  • 如果我可以提供另一种选择,请考虑使用轴角表示来旋转物体。它经常用于机器人技术:*.com/questions/32485772/…

标签: matlab matrix graphics


【解决方案1】:

正弦和余弦仅在您想从角度表示转换为矢量表示时使用。但是我们先来分析一下是什么让矩阵成为旋转矩阵。

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

如果我们有二维旋转矩阵

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

,我们看到确实如此。第一个列向量是(cos a, -sin a)。从勾股定理,我们得到这个向量有单位长度。此外,它垂直于第二列向量(它们的点积为零)。

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

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

【讨论】:

  • 列向量是否总是分别为(1,0,0)(0,1,0)(0,0,1)的图像?
  • 另外,如果一个矩阵是正交的并且不是单位矩阵,那么它一定是一个旋转矩阵?
  • @Pilpel 你的第一个问题是。不给你的第二个。首先,矩阵也必须是正交的normal。其次,它必须有行列式+1。它也可能有行列式 -1(也包括反射)。但如果满足这些要求,那么可以。它必须是一个旋转矩阵。请注意,单位矩阵也是一个旋转矩阵(角度为零)。
  • @Pilpel 请注意,正交矩阵的数学定义意味着它的行/列是正交的。只是术语问题,但可能会造成混淆。
  • @Pilpel 确实如此。正交矩阵具有M*M^T=I 属性,其中^T 是转置矩阵,I 是单位矩阵。这些是(复杂)酉矩阵的特殊情况,其中M*M^+=I 其中^+ 表示矩阵的伴随(共轭转置)。正如 Nico 所说,正交矩阵的行列式是 +1 或 -1;前者是适当的旋转,后者是反射。
【解决方案2】:

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

如果[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

如果您的矩阵是M=[r u n],这正是您需要的转换。

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

【讨论】:

  • 你能解释一下“形象”的概念吗?我不熟悉这个词。我也不太明白你的计算段落。
  • @Pilpel 我的意思是image,因为f(x)x 的图像,如果你的函数是f(x)=M*x,你的矩阵M 和列向量x。如果您熟悉如何将矩阵乘以行向量:对[1; 0; 0] 执行M 将返回M 的第一列,[0; 1; 0] 将给出M 的第二列,@987654340 @ 将给出M 的第三列。这就是我在上面试图解释的,抱歉没有成功。换句话说:矩阵的列告诉你它将笛卡尔单位向量转换成什么。