这是我的两分钱。希望能帮助到你。
如果我理解正确,您想旋转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在具有正交基{e1..2'}的2D平面上线性变换为2D向量v'。
二维平面可以很容易地由垂直于它的向量定义。例如,从 OP 中的数字来看,我们的2D平面(纸的平面)似乎具有法线单位向量n = 1/sqrt(3) * ( 1, 1, 1 )。我们需要在这个n定义的2D平面中找到一个2D基。因为任何两个线性独立的向量位于我们的2D平面将形成这样的基础,这里有无数这样的基础。从问题的几何学出发,为了简单起见,让我们强加两个附加条件:首先,基应该是正交的;其次,应该在视觉上吸引人(尽管这有点主观条件)。很容易看出,通过设置e1' = ( 1, 0 )' = x'轴(水平,从左到右的正方向)和e2' = ( 0, 1 )' = y' -轴(垂直,从下到上的正方向)。
现在让我们在{e1..3} 3D基中找到这个{e1', e2'} 2D基。
- 让我们在原始基础中将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}基础上。这里,点表示点积。
- 然后e2" = n交叉e1" = ( -1/sqrt(6), -1/sqrt(6), 2/sqrt(6) )。这里,cross表示叉积。
由n = 1/sqrt(3) * ( 1, 1, 1 )定义的2D平面的2x3投影矩阵P由下式给出:
( -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相乘以获得旋转投影变换矩阵PR = P * R。
PS C++ 实现留作家庭作业;)。