XNA中的旋转

4

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

http://img843.imageshack.us/i/question1.jpg/

用于绘制的代码:

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参数,我确实能够旋转模型。然而,效果并不是我想要的(链接),它改变了位置。这是因为有缺陷的模型还是其他错误?我希望“圆柱体”保持在原位。你知道我该怎么做吗?


你有没有考虑给你的答案点赞或者标记一个为被采纳的答案?我看到你是新来的,所以要记住,点赞是推动这个网站发展的关键... - Pedery
2个回答

1

使用旋转矩阵进行旋转是累积的。因此,您可以通过将模型向下旋转45度来计算旋转矩阵,然后在所需轴周围应用旋转,最后再将模型向上旋转45度。这三个矩阵的乘积应该给出您想要的矩阵。


我尝试了你的解决方案并更新了我的第一个帖子。非常感谢你的反馈,因为它让我离预期的结果更近了一步。 - Konrad
你的移动是以模型的中心点为枢轴进行的。自然而然,你的代码无法“猜测”你只是想围绕圆柱体的轴旋转复合模型,而不是整个边界。我不是XNA专家,所以我不知道如何设置模型的旋转中心。可选地,你可以通过计算整个模型的边界、仅圆柱体的边界和旋转角度来自行计算它。在这种情况下,你需要进行一系列的变换和平移。 - Pedery

1

另一个选择是使用四元数来生成旋转矩阵。四元数基本上是一个轴和绕其旋转的角度。在这种情况下,这可能更容易操作?


有趣的概念 :) http://zh.wikipedia.org/wiki/%E5%9B%9B%E5%85%83%E6%95%B0_%E5%92%8C_%E7%A9%BA%E9%97%B4%E6%97%8B%E8%BD%AC - Pedery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接