2011-07-19 24 views
0

私は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); 

答えて

0

それは、私は数学のこの種をやったので、しばらくしているが、私は3番目のパラメータは、単に1

編集があるだろうと推測しているだろう:それを修飾する、私はこれをしなかった最後の時間それはXNAではなくManaged DirectXと呼ばれていました。

関連する問題