0

世界の X、Z 軸にボードがあります。下向きまたは上向きに回転し、ワールド Y 軸を使用して左から右に回転できるカメラがあります。

カメラの回転コードは次のとおりです。

float angle = (mouseX_Current - mouseX_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(0.0f, angle, 0.0f, Space.World);

angle = (mouseY_Current - mouseY_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(angle, 0.0f, 0.0f, Space.Self);

マウス ボタン ダウンとマウス位置入力 (ドラッグ アンド ドロップ) を使用して、カメラをワールド内で移動させます。マウス (ドラッグ & ドロップ) 操作の X 値と Y 値を含む 2D ベクトルを受け取ります。私が使用するメソッドのコードは次のとおりです。

private void CameraOnPlaneTranslation(Vector2 myVector)
{

   float cameraYPos = Camera.main.transform.position.y;

   Camera.main.transform.Translate(new Vector3(myVector[0], 0.0f, myVector[1]));

   Camera.main.transform.position = new Vector3(Camera.main.transform.position.x, cameraYPos, Camera.main.transform.position.z);
}

問題 : カメラが Z 軸 (0.0f, Z, 0.0f) に直接向けられていない場合、計算した平行移動ベクトルが正しくありません。カメラがワールドの Y 軸上を移動しないように、ベクトルの Y 値を変更する必要があります。

ありがとう

4

2 に答える 2

1

私は Unity に詳しくありませんが、これらの点で他の 3D システムと似ていると仮定して、答えを試みますが、恥ずかしくないことを願っています。

カメラの位置を /translate/ してから、すぐにカメラの位置を /set/ するように見えます。したがって、translate によって行われた作業が上書きされます。このような場合は、camera.main.transform.position一度設定してみてください (カメラを作成した後の行で)。myVector次に、翻訳呼び出しによってのみ適用します(あなたが持っているように)。したがって、メソッドの 3 行目を削除する必要がありますCamera.main.transform.position = new Vector3(Camera.main.transform.position.x, cameraYPos, Camera.main.transform.position.z);

これを試しても期待どおりの結果が得られない場合は、ビューを更新するか、 Flush または ApplyTransform を実行する必要があるかどうかを確認してください。. . 変換の変更が完了し、更新された変換で再び処理する準備ができていることを理解させるもの。

于 2013-10-28T02:58:54.347 に答える
0

カメラの右/左回転 (ワールド アップ ベクトル) とカメラの移動のみに影響される別のゲーム オブジェクトを追加することで、これを解決しました。

Awake メソッドでは

cameraOrientation = new GameObject("cameraOrientation");
cameraOrientation.transform.position = Camera.main.transform.position;
cameraOrientation.transform.localEulerAngles = new Vector3(0.0f, Camera.main.transform.localEulerAngles.y, 0.0f);

ローテーション方式では

float angle = (mouseX_Current - mouseX_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(0.0f, angle, 0.0f, Space.World);
cameraOrientation.transform.Rotate(0.0f, angle, 0.0f, Space.World);

angle = (mouseY_Current - mouseY_ActionStart) * camRotationSpeedMod;
Camera.main.transform.Rotate(angle, 0.0f, 0.0f, Space.Self);

そして最後に翻訳方法

cameraOrientation.transform.Translate(new Vector3(myVector[0], 0.0f, myVector[1]));
Camera.main.transform.position = cameraOrientation.transform.position;
于 2013-10-28T15:20:57.963 に答える