ユーザーが球の表面を動き回れるようにするメカニズムをコーディングしています。球上の位置は現在、theta
およびとして保存されますphi
。ここでtheta
は、現在の位置のz軸とxz投影の間の角度(つまりy軸を中心とした回転)でphi
、y軸から位置までの角度です。私はそれを不十分に説明しましたが、本質的にはtheta = yaw
、phi = pitch
Vector3 position = new Vector3(0,0,1);
position.X = (float)Math.Sin(phi) * (float)Math.Sin(theta);
position.Y = (float)Math.Sin(phi) * (float)Math.Cos(theta);
position.Z = (float)Math.Cos(phi);
position *= r;
これは正確だと思いますが、間違っているかもしれません。半径のあるワールド空間の原点で、球の表面の周りを任意の疑似2次元方向に移動できる必要がありますr
。たとえば、ホールディングWは球体の周りをプレーヤーの向きに対して上方向に移動する必要があります。
球体上の位置/方向を表すためにクォータニオンを使用する必要があると思いますが、正しい方法を考えることはできません。球面形状は、私の強力なスーツではありません。
基本的に、次のブロックを埋める必要があります。
public void Move(Direction dir)
{
switch (dir)
{
case Direction.Left:
// update quaternion to rotate left
break;
case Direction.Right:
// update quaternion to rotate right
break;
case Direction.Up:
// update quaternion to rotate upward
break;
case Direction.Down:
// update quaternion to rotate downward
break;
}
}
(1,1,1)
の左を保持するには、通過する、球の周りに回転させるだろう(~1.2,0,~-1.2)
、その後、(-1,-1,-1)
、その後、(~-1.2,0,~1.2)
バックに(1,1,1)
。
theta
やphi
、あなたの位置のアップデートとして、あなたはあなたの問題は、不必要に複雑になっています。各フレーム(1つ(ヨー)が変化しない)およびVector3.Transorm
球の周りの2つの回転軸を簡単に計算できます。これにより問題が簡単になりますが、phi
&で切断されtheta
ます。