私はこの敵のクラスを持っています、そして私はそれをしたいです
1) 特定の場所にスポーン Vector3 pos
2) 自分のプレイヤーの位置に向きを変える
3) 前進する
このコードは現在、指定された場所 (pos) に表示され、ターゲット (targetShip) に面するように回転しようとします。このオフセットが原因で、ターゲットに正しく向くことができません。
値を変換に割り当てるコードを削除するか、pos を正規化すると、モデルが原点に表示され、回転して正しくターゲットに向かいます。
翻訳に関するコメントアウトコードのいずれかを使用して移動しようとすると、別の場所で開始されているように見え、決して見つけることができません。
ただし、回転に関連するコードを削除し、翻訳に関連するコードのコメントを外すと、前に進むことができます。
コツは、すべて一緒に行うことです。
class Enemy : BasicModel
{
Matrix rotation = Matrix.Identity;
Matrix translation = Matrix.Identity;
public Vector3 pos, up, right, targetShip,dir;
public Enemy(Model m, Vector3 pos)
: base(m)
{
up = Vector3.Up;
//sets the position to the Vector3 as it's spawn point.
translation = Matrix.CreateTranslation(pos);
}
public override void Update()
{
//Glo is a global class, where I store the player world.
targetShip = Glo.world.Translation;
targetShip.Normalize();
pos = transform.Translation;
rotation = RotateToFace(targetShip, pos, Vector3.Up);
//Attempt at moving the model forward. Causes it to go out of view
//translation *= Matrix.CreateTranslation(this.GetWorld().Backward);
//translation *= Matrix.CreateTranslation(pos);
}
public override Matrix GetWorld()
{
return rotation * world * translation ;
}
/*Params: O = Our target
* P = Our position
* U = up.
*
* Code from some site I googled up.
*/
Matrix RotateToFace(Vector3 O, Vector3 P, Vector3 U)
{
//The direction we're facing.
Vector3 D = (O - P);
//Our relative Right.
Vector3 Right = Vector3.Cross(U, D);
Vector3.Normalize(ref Right, out Right);
//Our back
Vector3 Backwards = Vector3.Cross(Right, U);
Vector3.Normalize(ref Backwards, out Backwards);
//Our relative up
Vector3 Up = Vector3.Cross(Backwards, Right);
//Make a matrix out of all of these.
Matrix rot = new Matrix(Right.X, Right.Y, Right.Z, 0, Up.X, Up.Y, Up.Z, 0, Backwards.X, Backwards.Y, Backwards.Z, 0, 0, 0, 0, 1);
return rot;
}
}
}
----
やってみた
anathonlineの方法、そしてこれが私が今持っているものです うまくいきません。モデルがどこにも表示されません。
public override void Update()
{
targetShip = Glo.world.Translation;
targetShip.Normalize();
//Translate it to the origin
translation = Matrix.Identity;
//Orient it
rot = RotateToFace(targetShip, translation.Translation, Vector3.Up);
//Move it back to where it was originally;
translation = Matrix.CreateTranslation(offset);
//Calculate the front of the object
Vector3 front = Vector3.Forward * translation.Translation;
//normalize it
Vector3.Normalize(ref front, out front);
//multiply it
front *= 2;
//translate the object
translation *= Matrix.CreateTranslation(front);
}
public override Matrix GetWorld()
{
return world * rot * translation;
}
----
2 回目の改訂: まだ機能しない
public override void Update()
{
targetShip = Glo.world.Translation;
targetShip.Normalize();
translation = Matrix.CreateLookAt(offset, targetShip, Vector3.Up);
var amountToMove = 0.2f;
var finalPos = Vector3.Lerp(targetShip, offset, amountToMove);
rot = translation * Matrix.CreateTranslation(finalPos);
}
public override Matrix GetWorld()
{
return world * rot * translation ;
}