Stig-Rune Skansgård の返信 (デンマーク語のhi5の場合) のおかげで、古い角度の計算を修正し、すべての場合に機能するようになりました。訪問者はそれを利用できます。これは、非常に大きな Ship クラスのスニペット + 角度を計算するヘルパー メソッドです。
public static float CalculateAngleFromVectors(Vector3 v1, Vector3 v2) {
float x = 0;
float X = v2.X - v1.X,
Z = v2.Z - v1.Z;
if (Z == 0) {
x = (X < 0 ? 90 : 270);
} else if (X == 0) {
x = (Z < 0 ? 180 : -180);
} else {
float temp = MathHelper.ToDegrees((float)Math.Atan(X / Z));
if (X < 0) {
x = (Z < 0 ? Math.Abs(temp) : 180 - Math.Abs(temp));
} else {
x = (Z < 0 ? 360 - Math.Abs(temp) : Math.Abs(temp) + 180);
}
}
return x;
}
このメソッドは、(標準の 0 度の開始点から) 船を回転させるためのフロート角度 (度単位) を取得します。
それを使用するには、クラスで次のような更新/アニメーション メソッドを作成するだけです。
float desiredRotation = 0, currentRotation = 0, totalElapsed = 0, timePerFrame = 0.05f;
if (desiredRotation != 0) {
totalElapsed += elapsed;
if (totalElapsed > timePerFrame) {
if (isRotationComplete()) {
rotX += MathHelper.ToRadians(desiredRotation);
currentRotation = desiredRotation = 0;
} else if (desiredRotation > currentRotation) {
currentRotation += shipTurnSpeed;
} else if (desiredRotation < currentRotation) {
currentRotation -= shipTurnSpeed;
}
totalElapsed -= timePerFrame;
}
}
編集:および完了チェック:
private bool isRotationComplete() {
bool b = false;
if (desiredRotation > currentRotation && currentRotation + shipTurnSpeed > desiredRotation) {
b = true;
} else if (desiredRotation < currentRotation && currentRotation - shipTurnSpeed < desiredRotation) {
b = true;
}
return b;
}
基本的に、これが行うことは、DesiredRotation が 0 より大きいかどうかを常にチェックすることです。0 より大きい場合は、プレイヤーが回転するコマンド (または AI) を与えたことを意味します。回転コマンドが最後に与えられてから回転し、回転が完了すると 0 に設定されます..別の変数を使用して回転を表示する Rotations マトリックスが必要です..私のものは次のとおりです。
public float rotX { get; set; }
public float rotY { get; set; }
public Vector3 position { get; set; }
public Matrix Transform {
get {
return (Matrix.Identity *
Matrix.CreateScale(scale) *
Matrix.CreateRotationY(MathHelper.Pi) *
Rotation *
Matrix.CreateTranslation(position));
}
}
public float ShipCurRotation { get { return (rotX + MathHelper.ToRadians(currentRotation)); } }
public Matrix Rotation { get { return (Matrix.CreateRotationY(ShipCurRotation) * Matrix.CreateRotationX(rotY)); } }
rotX 変数は、回転が完了するとアニメーションで設定され、初期化でも設定されます。最初のコード スニペットが生成する回転角度を使用する方法は次のとおりです。
public void MoveToPosition(Vector3 pos) {
desiredRotation = (CalculateAngleFromVectors(position, pos) - MathHelper.ToDegrees(rotX));
isMoving = true;
}
.. これにより、スムーズにカスタマイズ可能な回転、変換、および移動の設定が行われます..c の XZ 平面では、Y 軸は UP であり、常に 0 です..
物事をさらに良くするための提案、変更、またはアイデアがある場合は、これについて自由にコメントしてください..私は常に改善を求めています..返信をありがとう、そしてこれが多くの新しい開発者に役立つことを願っています。ウェブから..
PS。回転は、アニメーションと回転速度をバイパスして、即時回転のために rotX に直接適用できます。
よろしくMatriXz