首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的三维坐标变换

C#中的三维坐标变换
EN

Stack Overflow用户
提问于 2022-11-30 12:23:07
回答 2查看 54关注 0票数 0

的目标是什么?:,我想知道一个点在旋转三维物体(长方体)后的新坐标,围绕着另一边的锚点(x,y& z)。

我所做的:,我尝试用以下函数计算位置。由于Autodesk Inventor,我不得不将doubles转换为floats。注意:Vector是从origin /anchorpoint到指定点的区别。

代码语言:javascript
复制
Vector3 coordinateTransformation(Vector3 vector, float r_x, float r_y, float r_z, Vector3 origin)
        {
            vector.X = vector.X;  //Just for demonstration
            vector.Y = vector.Y * Convert.ToSingle(Math.Cos(DegreesToRadians(r_x))) - vector.Z * Convert.ToSingle(Math.Sin(DegreesToRadians(r_x)));
            vector.Z = vector.Y * Convert.ToSingle(Math.Sin(DegreesToRadians(r_x))) + vector.Z * Convert.ToSingle(Math.Cos(DegreesToRadians(r_x)));
            
            vector.X = vector.X * Convert.ToSingle(Math.Cos(DegreesToRadians(r_y))) + vector.Z * Convert.ToSingle(Math.Sin(DegreesToRadians(r_y)));
            vector.Y = vector.Y;  //Just for demonstration
            vector.Z = vector.Z * Convert.ToSingle(Math.Cos(DegreesToRadians(r_y))) - vector.X * Convert.ToSingle(Math.Sin(DegreesToRadians(r_y)));
            
            vector.X = vector.X * Convert.ToSingle(Math.Cos(DegreesToRadians(r_z))) - vector.Y * Convert.ToSingle(Math.Sin(DegreesToRadians(r_z)));
            vector.Y = vector.X * Convert.ToSingle(Math.Sin(DegreesToRadians(r_z))) + vector.Y * Convert.ToSingle(Math.Cos(DegreesToRadians(r_z)));
            vector.Z = vector.Z;  //Just for demonstration

            vector.X = Math.Abs(vector.X) + origin.X;
            vector.Y = Math.Abs(vector.Y) + origin.Y;
            vector.Z = Math.Abs(vector.Z) + origin.Z;
            
            return vector;
        }

不知何故,物体没有被放置在正确的位置。

下一步:我在互联网上找到了一个做正确转换的网站。如果我手动将vector设置到网站上的计算点,其他一切都可以正常工作。,所以我必须在代码中得到完全相同的计算结果.

如果您需要更多的信息,请随时评论!

编辑: 1 :我想把2个物体(例如长方体)放在Inventor中的装配组中。每个对象都是一个锚点(原点),而另一侧则是一个连接点,它被描述为锚点与连接点本身之间的增量。首先,将一个对象放置在原点坐标上,然后围绕着锚点(度)旋转。此后,对象1的连接点坐标发生了变化。在下一步中,我希望将对象2及其原点放置在对象1的连接点上,而对象2与对象1具有相同的旋转。2 : Inventor使用右手坐标系。

EN

回答 2

Stack Overflow用户

发布于 2022-11-30 13:50:53

不要乱搞矢量和角度的手。对向量函数使用一些库,并使用矩阵进行转换。例如,System.Numerics或Math.Net.Numerics。

假设您有一个欧拉角开始,您可以使用CreateFromYawPitchRoll创建您的旋转矩阵。如果你想围绕一个特定的点旋转,你只需从你的所有点减去你的旋转中心,应用旋转并将点移回。这一切都可以通过仅仅乘以转换矩阵来实现:

代码语言:javascript
复制
var totalTransform = Matrix4x4.CreateTranslation(-rotationCenter) *
                    Matrix4x4.CreateFromYawPitchRoll(yawInRadians, pitchInRadians, rollInRadians) *
                    Matrix4x4.CreateTranslation(rotationCenter);

要应用结果转换,只需调用Vector3.Transform生成一个新的转换向量。

如果你对线性代数有一些介绍的话,这一切都会容易一些。做一些事情也很常见,比如以错误的顺序应用转换,有时,在正确之前,只尝试一些不同的事情是最简单的。我也要指出,轮调是很难理解的。我倾向于喜欢四元数,而不是eutler角度,不是因为数学更容易理解,而是因为有像CreateFromAxisAngle这样的方法,我可以理解。

票数 1
EN

Stack Overflow用户

发布于 2022-12-01 00:09:20

当您手动将旋转应用到向量时,您需要一次更新所有组件(X、Y和Z),如下所示。

代码语言:javascript
复制
Vector3 coordinateTransformation(Vector3 vector, float r_x, float r_y, float r_z, Vector3 origin)
{

    // In the rotation around X axis below, `Y relies on Z` and `Z relies on Y`. So both must be updated simultaneously. 
    vector = new Vector3(
        vector.X,
        vector.Y * Convert.ToSingle(Math.Cos(DegreesToRadians(r_x))) - vector.Z * Convert.ToSingle(Math.Sin(DegreesToRadians(r_x))),
        vector.Y * Convert.ToSingle(Math.Sin(DegreesToRadians(r_x))) + vector.Z * Convert.ToSingle(Math.Cos(DegreesToRadians(r_x)))
    );

    vector = new Vector3(
        vector.X * Convert.ToSingle(Math.Cos(DegreesToRadians(r_y))) + vector.Z * Convert.ToSingle(Math.Sin(DegreesToRadians(r_y))),
        vector.Y,
        vector.Z * Convert.ToSingle(Math.Cos(DegreesToRadians(r_y))) - vector.X * Convert.ToSingle(Math.Sin(DegreesToRadians(r_y)))
    );

    vector = new Vector3(
        vector.X * Convert.ToSingle(Math.Cos(DegreesToRadians(r_z))) - vector.Y * Convert.ToSingle(Math.Sin(DegreesToRadians(r_z))),
        vector.X * Convert.ToSingle(Math.Sin(DegreesToRadians(r_z))) + vector.Y * Convert.ToSingle(Math.Cos(DegreesToRadians(r_z))),
        vector.Z
    );

    vector.X = Math.Abs(vector.X) + origin.X;
    vector.Y = Math.Abs(vector.Y) + origin.Y;
    vector.Z = Math.Abs(vector.Z) + origin.Z;

    return vector;
}

附录: Matrix4x4的使用

正如@JonasH所建议的,如果存在可靠的库,那么使用可靠的库是个好主意。

由于行向量是在.NET世界中使用的(虽然您的实现是基于列向量),所以X->Y->Z旋转可以用简单的矩阵乘法来编写,如下所示。

代码语言:javascript
复制
Vector3 coordinateTransformation(Vector3 vector, float r_x, float r_y, float r_z, Vector3 origin)
{

    var mat = Matrix4x4.CreateRotationX(DegreesToRadians(r_x))
        * Matrix4x4.CreateRotationY(DegreesToRadians(r_y))
        * Matrix4x4.CreateRotationZ(DegreesToRadians(r_z));

    vector = Vector3.Transform(vector, mat);
    
    vector.X = Math.Abs(vector.X) + origin.X;
    vector.Y = Math.Abs(vector.Y) + origin.Y;
    vector.Z = Math.Abs(vector.Z) + origin.Z;

    return vector;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74627729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档