0

ゲーム内にいくつかのメッシュを持つオブジェクトがあり、いずれかのメッシュをいずれかの方向に回転させようとすると、ローカル軸ではなく、ワールド軸を中心にのみ回転します。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ですVector3RotationMatrixTransformは両方ともMatrix.Identityコンストラクターでに設定されます。

問題は、たとえばY軸を中心に回転しようとすると、「静止」した状態で円を描くように回転する必要があることです。しかし、彼は回転しながら動き回っています。

4

2 に答える 2

1

これがあなたが望むものであるかどうかは完全にはわかりません。ここでは、いくつかのメッシュと位置がメインオブジェクトの位置と方向からオフセットされたオブジェクトがあり、親に対してローカル軸を中心に子オブジェクトを回転させたいと想定しています。

Matrix.CreateTranslation(-Parent.Position) *                  //Move mesh back...
Matric.CreateTranslation(-Mesh.PositionOffset) *              //...to object space

Matrix.CreateFromAxisAngle(Mesh.LocalAxis, AngleToRotateBy) * //Now rotate around your axis
Matrix.CreateTranslation(Mesh.PositionOffset) *               //Move the mesh...
Matrix.CreateTranslation(Parent.Position);                    //...back to world space

もちろん、通常、メッシュをオブジェクト空間からワールド空間に1つのステップで変換する変換行列を格納し、その逆も格納します。また、メッシュは常にオブジェクト座標に保存し、レンダリングのためにワールド座標にのみ移動します。これは物事を少し単純化するでしょう:

Matrix.CreateFromAxisAngle(Mesh.LocalAxis, AngleToRotateBy) * //We're already in object space, so just rotate
ObjectToWorldTransform *
Matrix.CreateTranslation(Parent.Position);

例のMesh.Transformをこれに設定するだけで、すべて設定できると思います。

これがあなたが探していたものであることを願っています!

于 2012-11-18T20:45:08.410 に答える
1

問題は、モデルを.FBXとしてエクスポートしたときに、ピボットポイントがモデルの中心になかったことです。したがって、回転しながらモデルを移動させます。

于 2012-11-21T19:11:11.720 に答える