Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
3d 三维几何图形:将一对点变换为平行于另一对点对齐_3d_Geometry_Transform_Direct3d - Fatal编程技术网

3d 三维几何图形:将一对点变换为平行于另一对点对齐

3d 三维几何图形:将一对点变换为平行于另一对点对齐,3d,geometry,transform,direct3d,3d,Geometry,Transform,Direct3d,我有一条线,实际上是一个立方体,从x1,y1,z1到x2,y2,z2。我想旋转它,使它沿着从x3,y3,z3到x4,y4,z4的另一条线对齐。目前,我正在使用Math::Atan2以及Matrix::RotateYawPitchRoll。有更好的方法吗 编辑:我想我把这篇文章写得很糟糕。我实际上在寻找的是两个向量的旋转矩阵。是的,你可以这样做,根本不需要考虑角度 由于您有一个立方体,假设您拾取一个角点,然后将从该角点向外辐射的3条边定义为向量f0、f1、f2,这些是相对于您拾取的角点的方向向量。

我有一条线,实际上是一个立方体,从x1,y1,z1到x2,y2,z2。我想旋转它,使它沿着从x3,y3,z3到x4,y4,z4的另一条线对齐。目前,我正在使用Math::Atan2以及Matrix::RotateYawPitchRoll。有更好的方法吗


编辑:我想我把这篇文章写得很糟糕。我实际上在寻找的是两个向量的旋转矩阵。

是的,你可以这样做,根本不需要考虑角度

由于您有一个立方体,假设您拾取一个角点,然后将从该角点向外辐射的3条边定义为向量f0、f1、f2,这些是相对于您拾取的角点的方向向量。将它们归一化,并将它们作为列写入矩阵F中

(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)
现在对要旋转的立方体的向量t0,t1,t2做同样的事情,称之为矩阵T

现在矩阵R=T*InverseF是从第一个立方体的方向旋转到第二个立方体的方向的矩阵,因为逆F映射例如f0到1 0',然后T映射1 0'到t0

如果您想知道为什么会这样,请考虑坐标系基向量:如果您想将X、Y和Z轴旋转到新的坐标系,那么旋转矩阵的列正是您希望映射到的向量1 0 0',0 1 0'和0 0 1'。T*InverseF有效地将立方体从其原始方向旋转到轴对齐,然后旋转到所需的方向

对不起,上面是左边的列向量和变换,OpenGL风格。我似乎记得Direct3D是右边的行向量和变换,但如何切换应该是显而易见的


它也同样适用于带有平移组件的4x4矩阵。

是的,您可以这样做,而无需考虑角度

由于您有一个立方体,假设您拾取一个角点,然后将从该角点向外辐射的3条边定义为向量f0、f1、f2,这些是相对于您拾取的角点的方向向量。将它们归一化,并将它们作为列写入矩阵F中

(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)
现在对要旋转的立方体的向量t0,t1,t2做同样的事情,称之为矩阵T

现在矩阵R=T*InverseF是从第一个立方体的方向旋转到第二个立方体的方向的矩阵,因为逆F映射例如f0到1 0',然后T映射1 0'到t0

如果您想知道为什么会这样,请考虑坐标系基向量:如果您想将X、Y和Z轴旋转到新的坐标系,那么旋转矩阵的列正是您希望映射到的向量1 0 0',0 1 0'和0 0 1'。T*InverseF有效地将立方体从其原始方向旋转到轴对齐,然后旋转到所需的方向

对不起,上面是左边的列向量和变换,OpenGL风格。我似乎记得Direct3D是右边的行向量和变换,但如何切换应该是显而易见的


它也同样适用于带有平移组件的4x4矩阵。

您可能需要添加如何实际插值矩阵。源矩阵和目标矩阵在您的答案中都很好,但是计算逆矩阵是没有意义的。四元数将为您提供最短的旋转路径,因此在两个矩阵上取旋转的3x3矩阵,转换为四元数并对其进行lerp。对翻译和重新组合进行单独的lerp。谷歌四元数-矩阵和反向转换和四元数lerp


编辑:来自正向和向上向量的旋转矩阵是微不足道的。缺少的列是其他两个向量的叉积。别忘了规范化列

您可能需要添加如何实际插值矩阵。源矩阵和目标矩阵在您的答案中都很好,但是计算逆矩阵是没有意义的。四元数将为您提供最短的旋转路径,因此在两个矩阵上取旋转的3x3矩阵,转换为四元数并对其进行lerp。对翻译和重新组合进行单独的lerp。谷歌四元数-矩阵和反向转换和四元数lerp


编辑:来自正向和向上向量的旋转矩阵是微不足道的。缺少的列是其他两个向量的叉积。别忘了规范化列

实际上它也不是一个立方体。工字钢。但这应该会有所帮助。谢谢,好的。关键是你需要定义一个局部坐标系。。。如果你只有直线,旋转是不明确的。谢谢,蒂姆。我不明白为什么这不适用于直线。实际上它也不是立方体。工字钢。但这应该会有所帮助。谢谢,好的。关键是你需要定义一个局部坐标系。。。如果你只有直线,旋转是不明确的。谢谢,蒂姆。我不明白为什么这不适用于生产线。