C# XNA中的旋转

C# XNA中的旋转,c#,3d,xna,rotation,C#,3d,Xna,Rotation,我有一个关于XNA中模型旋转的问题。问题是-我应该怎么做(应该更改哪些值以及如何更改)以这种方式旋转绿色模型(红色箭头): 用于绘制的代码: DrawModel(elementD, new Vector3(-1, 0.5f, 0.55f), 0,-90,0); private void DrawModel(Model model, Vector3 position, float rotXInDeg, float rotYInDeg, float rotZInDeg) {

我有一个关于XNA中模型旋转的问题。问题是-我应该怎么做(应该更改哪些值以及如何更改)以这种方式旋转绿色模型(红色箭头):

用于绘制的代码:

DrawModel(elementD, new Vector3(-1, 0.5f, 0.55f), 0,-90,0);

private void DrawModel(Model model, Vector3 position, float rotXInDeg, float rotYInDeg, float rotZInDeg)
    {
        float rotX = (float)(rotXInDeg * Math.PI / 180);
        float rotY = (float)(rotYInDeg * Math.PI / 180);
        float rotZ = (float)(rotZInDeg * Math.PI / 180);

        Matrix worldMatrix = Matrix.CreateScale(0.5f, 0.5f, 0.5f) * Matrix.CreateRotationY(rotY) *Matrix.CreateRotationX(rotX)*Matrix.CreateRotationZ(rotZ)* Matrix.CreateTranslation(position);
        Matrix[] xwingTransforms = new Matrix[model.Bones.Count];
        model.CopyAbsoluteBoneTransformsTo(xwingTransforms);
        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();

                effect.View = cam.viewMatrix;
                effect.Projection = cam.projectionMatrix;
                effect.World = (xwingTransforms[mesh.ParentBone.Index] * worldMatrix);
            }
            mesh.Draw();
        }

    }

因此,我尝试通过稍微更改代码来应用您的解决方案:

Matrix worldMatrix = Matrix.CreateScale(0.5f, 0.5f, 0.5f) * Matrix.CreateRotationY(rotY) * Matrix.CreateRotationX(rotX)  * Matrix.CreateTranslation(position)
                * Matrix.CreateRotationX((float)(45 * Math.PI / 180)) * Matrix.CreateRotationZ(rotZ) * Matrix.CreateRotationX((float)(-45 * Math.PI / 180)); 

通过改变rotZ参数,我确实能够旋转模型。但是效果不是我想要的,它改变了它的位置。是因为模型有问题还是其他错误?我希望“圆筒”保持在它的位置。你知道怎么做吗?

旋转矩阵的旋转是累加的。因此,您可能可以通过“向下”旋转模型45度来计算旋转矩阵,然后围绕所需轴应用旋转,然后再次“向上”旋转模型45度。这三个矩阵的乘积应为您提供所需的矩阵。

另一个选项是使用四元数生成旋转矩阵。四元数基本上是一个轴和围绕它的一个旋转体。在这种情况下,哪一个更容易操作?

我尝试了你的解决方案,并更新了我的第一篇帖子。非常感谢您的反馈,因为它使我离预期结果更近了一点。您的转变来自模型的轴心。当然,您的代码无法“猜测”您只是想绕圆柱体的轴而不是整个边界旋转复合模型。我不是XNA专家,所以我不知道如何设置模型的旋转中心。或者,您可以根据整个模型的边界、仅圆柱体的边界和旋转角度自行计算。在这种情况下,您必须进行一系列转换和翻译。有趣的概念:)您是否考虑过对您的答案进行投票或将其中一个标记为已接受?我看到你是新来的,所以记住投票是这个网站的驱动力。。。