2

次のように実装された一人称カメラコントローラーがあります。

float rotSpeed = 20.0f;

xRotation += deltaPos.y * rotSpeed * Time.deltaTime;
yRotation += deltaPos.x * -rotSpeed * Time.deltaTime;

while(xRotation > 360.0f) xRotation -= 360.0f;
while(xRotation < 0.0f)   xRotation += 360.0f;

while(yRotation > 360.0f) yRotation -= 360.0f;
while(yRotation < 0.0f)   yRotation += 360.0f;

cam.transform.rotation = Quaternion.Euler(xRotation, yRotation, 0);

カメラが 3D 空間のターゲットにスナップできるようにしたいと考えています。

transform.LookAt(target) を使用すると、カメラ コントローラーはビューを元の場所にスナップするだけで、LookAt() の呼び出し後にカメラの回転から xRotation と yRotation を設定することはできません。 Z 回転でクォータニオンを生成することがあります。

では、カメラをあるターゲットに向けるのに必要な X と Y の回転をどのように見つけることができるでしょうか?

4

1 に答える 1

1

Quaternion.LookRotationを使用してプレーヤーの回転を簡単に変更し、Quaternion.Lerpを使用して補間することができます。

public Transform target;
float turnSpeed = 5.0f;

Quaternion lookAt = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Lerp(transform.rotation, lookAt, Time.smoothDeltaTime * turnSpeed);

ここで、transformはプレーヤーの変換です。

ここから行う必要があるのは、スナップルールをいつ実行するかを決定することだけです。

追記:実際にはそれだけではないかもしれません。ターゲット/プレーヤーの位置が頻繁に移動する傾向がある場合は、LookRotationがターゲットにしっかりとスナップしない「デッドゾーン」が発生する可能性があります。この問題(および解決策)の詳細については、こちらをご覧ください

于 2012-07-25T02:39:38.303 に答える