我有一个关于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参数确实我能够旋转模型.然而效果并不是我想要达到的目标http://img225.imageshack.us/i/questionau.jpg/,它改变了它的立场.是因为模型错误还是其他错误?我希望“气缸”保持在它的位置.你知道我怎么能这样做吗?
最佳答案 旋转矩阵的旋转是累积的.因此,您可以通过将模型向下旋转45度来计算旋转矩阵,然后围绕想要的轴应用旋转,然后再将模型向上旋转45度.这三个矩阵的乘积应该为您提供所需的矩阵.