计算物体在 3D 空间中的旋转,其中输入为 3D 空间中的 2 个点

Calculating rotation of object in 3D where input is 2 points in 3D space

提问人:BoxBishop 提问时间:4/8/2023 更新时间:4/8/2023 访问量:102

问:

我在 3D 图形中的初学者任务中遇到了问题 - 我有一个对象(为简单起见,假设它是一个圆柱体/线),圆柱体设置在它的局部点 0,0,0,0 并且总长度为 1(0,5 向前,0,5 向后,0,5 半径)。这样我就可以随心所欲地应用平移/旋转。

以下是Blender中的简化参考:Non-rotated or moved or scaled object

我想通过在 3D 空间中传递 2 个点来旋转这个对象 - 假设 P1=(0,0,0),P2=(10,10,10)(可能是向上向量?),我的对象通过这个点。

这是粗略的预期结果 - 想要计算欧拉角或四元数旋转来实现它:Expected result - an object between P1=0,0,0 and P2=10,10,10

下面的代码在我自己的引擎中运行良好,但如果任何点具有 Z(我使用 X,Y,Z,其中 Z = 向上/向下)位置 !=0,它就会出现问题。

        public static Rotation RotationSpanningBetween2Points(VertexPosition vertexStart, VertexPosition vertexEnd)
        {
            double dx = vertexEnd.position.X - vertexStart.position.X;
            double dy = vertexEnd.position.Y - vertexStart.position.Y;
            double dz = vertexEnd.position.Z - vertexStart.position.Z;


            return new Rotation(
                    RadToDeg(Math.Atan2(dz, dy)),
                    RadToDeg(Math.Atan2(dz, dx)),
                    RadToDeg(Math.Atan2(dx, dy)));
        }

解决方案似乎有些简单,但它逃脱了我。

C# 数学 图形 3D

评论

0赞 jdweng 4/8/2023
旋转时,对象必须沿线。当 z 偏移量时,对象不在线。您首先需要移动 z 位置,使其在线上,然后旋转。
0赞 BoxBishop 4/9/2023
@jdweng好吧,所以移动 z 位置是指不移动对象,但它是自己的 Z 轴?所以我用 X 和 Y 旋转它,那么我应该以某种方式按原始 Z 轴旋转它?我应该如何计算?
0赞 jdweng 4/9/2023
在对象中画一条垂直线,然后找到垂直线和线相交的位置。

答: 暂无答案