这是我的两分钱。希望对您有所帮助。
如果我理解正确,您想旋转 3D 坐标系,然后将其正交投影到给定的 2D 平面(2D 平面是相对于原始的、未旋转的 3D 坐标系统定义的)。
“旋转和投影3D坐标系”是“旋转三个3D基向量并将它们正交投影到一个2D平面上,因此它们相对于平面的 2D 基成为 2D 向量”。让原始的 3D 向量是未初始化的,而生成的 2D 向量是初始化的。令 {e1, e2, e3} = {e1..3} 为 3D 正交基(已给定),并且 {e1', e2'} = {e1..2'} 是 2D 正交基(我们必须定义)。本质上,我们需要找到 PR * v = v' 这样的运算符 PR。
虽然我们可以谈论很多关于线性代数、运算符和矩阵表示的内容,但这篇文章太长了。这么说就够了:
- 对于 3D 旋转和 3D->2D 投影算子,都有实数矩阵表示(线性变换;2D 是 3D)。
- 这是两个随之应用的变换,即PR * v = P * R * v = v',所以我们需要找到旋转矩阵R和投影矩阵P。显然,在我们使用 R 旋转 v 之后,我们可以使用 P 投影结果向量 vR。
- 你已经有了旋转矩阵R,所以我们认为它是一个给定的3x3矩阵。因此,为简单起见,我们将讨论投影向量 vR = R * v。
- 投影矩阵 P 是一个 2x3 矩阵,其中第 i 列是第 i 列的投影3D 基础向量 ei 到 {e1..2'} 基础上。
让我们找到P投影矩阵比如一个3D向量vR线性变换成2D向量v' 在具有正交基 {e1..2'} 的 2D 平面上。
2D 平面可以很容易地由垂直于它的向量定义。例如,从 OP 中的数字来看,我们的 2D 平面(纸的平面)似乎具有法线单位向量 n = 1/sqrt(3) em> * ( 1, 1, 1 )。我们需要在这个n定义的2D平面中找到一个2D基。由于位于我们的 2D 平面中的任何两个线性独立向量都将形成这样的基,因此这里有无数个这样的基。从问题的几何学出发,为了简单起见,让我们强加两个附加条件:首先,基应该是正交的;其次,应该在视觉上吸引人(尽管这有点主观条件)。很容易看出,通过设置 e1' = ( 1, 0 )' = x'-axis (horizontal, positive方向从左到右)和 e2' = ( 0, 1 )' = y'-轴(垂直,从下到上的正方向)。
现在让我们在 {e1..3} 3D 2D 基础上找到这个 {e1', e2'} em>基础。
- 让我们在原始基础上将 e1' 和 e2' 分别表示为 e1" 和 e2"。注意到在我们的例子中 e1" 没有 e3-component (z-component),并使用事实n dot e1" = 0,我们得到 e1' = ( 1, 0 )' -> e1" = ( -1/sqrt(2) , 1/sqrt(2), 0 ) 在{e1..3}基础上。这里,dot表示点-产品。
- 然后 e2" = n cross e1" = ( -1/sqrt(6), -1/sqrt(6), 2/sqrt(6) ) .这里,cross 表示叉积。
2x3 投影矩阵 P 用于由 n = 1/sqrt(3) 定义的 2D 平面 * ( 1, 1, 1 ) 然后由下式给出:
( -1/sqrt(2) 1/sqrt(2) 0 )
( -1/sqrt(6) -1/sqrt(6) 2/sqrt(6) )
第一列、第二列和第三列被转换为 {e1..3} 3D 基础到我们的 2D 基础 {e1 ..2'},即 3D 基础上的 e1 = ( 1, 0, 0 ) 具有坐标 ( -1/sqrt(2) , -1/sqrt(6) ) 在我们的 2D 基础上,依此类推。
为了验证结果,我们可以检查几个明显的案例:
-
n 与我们的 2D 平面正交,所以应该没有投影。事实上,P * n = P * ( 1, 1, 1 ) = 0。
-
e1、e2和e3应该转化为它们在{e1..2'}中的表示,即对应P 矩阵中的列。实际上,P * e1 = P * ( 1, 0 ,0 ) = ( -1/sqrt(2), -1/sqrt(6) ) 等等。
解决问题。我们现在为任意选择的 2D 平面构建了一个从 3D 到 2D 的投影矩阵 P。我们现在可以将之前由旋转矩阵 R 旋转的任何向量投影到这个平面上。例如,旋转原始基础 {R * e1, R * e2, R * e3}。此外,我们可以乘给定 P 和 R 得到一个旋转-投影变换矩阵 em> PR = P * R.
附: C++ 实现留作家庭作业;)。