ゲーム内にいくつかのメッシュを持つオブジェクトがあり、いずれかのメッシュをいずれかの方向に回転させようとすると、ローカル軸ではなく、ワールド軸を中心にのみ回転します。rotation = Matrix.Identity
クラスコンストラクターにがあります。すべてのメッシュには、このクラスがアタッチされています。次に、このクラスにはメソッドも含まれます。
...
public Matrix Transform{ get; set; }
public void Rotate(Vector3 newRot)
{
rotation = Matrix.Identity;
rotation *= Matrix.CreateFromAxisAngle(rotation.Up, MathHelper.ToRadians(newRot.X));
rotation *= Matrix.CreateFromAxisAngle(rotation.Right, MathHelper.ToRadians(newRot.Y));
rotation *= Matrix.CreateFromAxisAngle(rotation.Forward, MathHelper.ToRadians(newRot.Z));
CreateMatrix();
}
private void CreateMatrix()
{
Transform = Matrix.CreateScale(scale) * rotation * Matrix.CreateTranslation(Position);
}
...
そして今、Draw()メソッド:
foreach (MeshProperties mesh in model.meshes)
{
foreach (BasicEffect effect in mesh.Mesh.Effects)//Where Mesh is a ModelMesh that this class contains information about
{
effect.View = cam.view;
effect.Projection = cam.projection;
effect.World = mesh.Transform;
effect.EnableDefaultLighting();
}
mesh.Mesh.Draw();
}
編集:
私はどこかで失敗したか、あなたの技術が機能しないのではないかと心配しています、これは私がしたことです。オブジェクト全体(親)を移動するたびに、Vector3 Position;
その新しい値に設定します。また、すべてのMeshPropertiesVector3 Position;
をその値に設定します。そして、CreateMatrix()
MeshPropertiesの内部で私はそうしました:
...
Transform = RotationMatrix * Matrix.CreateScale(x, y, z) * RotationMatrix * Matrix.CreateTranslation(Position) * Matrix.CreateTranslation(Parent.Position);
...
どこ:
public void Rotate(Vector3 newRot)
{
Rotation = newRot;
RotationMatrix = Matrix.CreateFromAxisAngle(Transform.Up, MathHelper.ToRadians(Rotation.X)) *
Matrix.CreateFromAxisAngle(Transform.Forward, MathHelper.ToRadians(Rotation.Z)) *
Matrix.CreateFromAxisAngle(Transform.Right, MathHelper.ToRadians(Rotation.Y));
}
そしてRotation
ですVector3
。
RotationMatrix
とTransform
は両方ともMatrix.Identity
コンストラクターでに設定されます。
問題は、たとえばY軸を中心に回転しようとすると、「静止」した状態で円を描くように回転する必要があることです。しかし、彼は回転しながら動き回っています。