私は2つのオブジェクト(ターゲットとプレーヤー)を持ち、どちらもポジション(ベクトル3)と回転(クォータニオン)を持っています。私はターゲットを回転させ、プレイヤーに直面して欲しい。ターゲットが何かを撃つとき、プレイヤーはすぐに撃つべきです。クォータニオンをベクトルに完全に回転させる
私はプレーヤーにslerpingの例をたくさん見てきましたが、私はインクリメンタルローテーションを望んでいません。まあ、私はslerpを100%にすることができればいいと思います。それは実際に働いた。 FYI
- イム他のものの多くを行うには位置と回転を使用することができ、それはすべて私が把握カントこの最後のピースを除いて素晴らしい作品。
EDIT
コードサンプルが対象のクラス、位置=目標位置で実行すると、アバターはプレイヤーを=。
Slerpに値1を使用することは機能しません。このコードは以下のようにいくつか回転しますが、ターゲットのスケールが上がったときにプレイヤーが近づくと、何かが消えてしまうと思います。
var A = new Vector3(Position.X, Position.Y, Position.Z);
var B = new Vector3(GameState.Avatar.Position.X, GameState.Avatar.Position.Y, GameState.Avatar.Position.Z);
A.Normalize();
B.Normalize();
var angle = Math.Acos(Vector3.Dot(A, B));
var axis = Vector3.Normalize(Vector3.Cross(A, B));
var rotOnAngle = new Quaternion(axis, (float)angle);
var newRot = Quaternion.Slerp(Quaternion.Identity, rotOnAngle, 1f);
Rotation = newRot;
Cannon.Shoot(Position, Rotation, this);
私はこれを試してみましたが、どちらもうまくいきません...ターゲットは回転しますが、プレーヤには向きません。しかし、少なくともスケーリングの問題は解消されます。
Quaternion q = new Quaternion();
var pos = Vector3.Normalize(Position);
var pos2 = Vector3.Normalize(GameState.Avatar.Position);%
var a = Vector3.Cross(Position, GameState.Avatar.Position);
q.X = a.X; q.Y = a.Y; q.Z = a.Z;
q.W = (float)Math.Sqrt(((int)Position.Length()^2) * ((int)GameState.Avatar.Position.Length()^2)) + Vector3.Dot(Position, GameState.Avatar.Position);
q.Normalize();
Rotation = q;
Cannon.Shoot(Position, Rotation, this);