前提・実現したいこと
前回の質問に引き続き、後半部分の質問です。
該当のソースコード
C#
1 void FixedUpdate() 2 { 3 float x = Input.GetAxis("Horizontal"); 4 float y = Input.GetAxis("Vertical"); 5 6 // xとyにspeedを掛ける 7 rigidbody.AddForce(x * speed, y * speed, 0); 8 9 Vector3 moveVector = Vector3.zero; 10 Debug.Log(moveForceMultiplier * (moveVector - rigidbody.velocity)); 11 12 rigidbody.AddForce(moveForceMultiplier * (moveVector - rigidbody.velocity)); 13 14 /* 後半部分 これ以降の処理に関して質問です。 */ 15 16 // プレイヤーの入力に応じて姿勢をひねろうとするトルク 17 Vector3 rotationTorque = new Vector3(-y * pitchTorqueMagnitude, x * yawTorqueMagnitude, -x * rollTorqueMagnitude); 18 19 // 現在の姿勢のずれに比例した大きさで逆方向にひねろうとするトルク 20 Vector3 right = transform.right; 21 Vector3 up = transform.up; 22 Vector3 forward = transform.forward; 23 Vector3 restoringTorque = new Vector3(forward.y - up.z, right.z - forward.x, up.x - right.y) * restoringTorqueMagnitude; 24 25 // 機体にトルクを加える 26 rigidbody.AddTorque(rotationTorque + restoringTorque); 27 28 }
試したこと
C#
1// プレイヤーの入力に応じて姿勢をひねろうとするトルク 2Vector3 rotationTorque = new Vector3(-y * pitchTorqueMagnitude, x * yawTorqueMagnitude, -x * rollTorqueMagnitude);
上記コードに関しては理解できました。
実際、下記のコードで試したところ、想定通りの動きをしていたので理解できていると思います。
C#
1rigidbody.AddTorque(rotationTorque);
分からないコードは2点です。
・質問1。
下記コードでrotationTorqueの逆回転(?)のベクトルを生成しているみたいですが、
どのような処理になっているかわからないです。
例えば、x成分に入れているのは、「forward.y - up.z」ですが、これはどういった値なのでしょうか?
他、y成分、z成分に関しても同様です。
C#
1Vector3 restoringTorque = new Vector3(forward.y - up.z, right.z - forward.x, up.x - right.y) * restoringTorqueMagnitude;
・質問2。
x, yの値に応じて回転させるrotationTorqueベクトルと、その逆回転のrestoringTorqueを同時に与えると、
相殺して無回転になるようなイメージをしてしまうのですが、
ゲーム実行した挙動からすると、rotationTorqueで回転した後、restoringTorqueで逆回転させるというような処理になっているのでしょうか?
rigidbody.AddTorque(A + B);
とすると、A回転した後、B回転するようになるのでしょうか?
C#
1rigidbody.AddTorque(rotationTorque + restoringTorque);
追記
C#
1 void FixedUpdate() 2 { 3 float x = Input.GetAxis("Horizontal"); 4 float y = Input.GetAxis("Vertical"); 5 6 // xとyにspeedを掛ける 7 rigidbody.AddForce(x * speed, y * speed, 0); 8 9 Vector3 moveVector = Vector3.zero; 10 11 //rigidbody.AddForce(moveForceMultiplier * (moveVector - rigidbody.velocity)); 12 13 // プレイヤーの入力に応じて姿勢をひねろうとするトルク 14 Vector3 rotationTorque = new Vector3(-y * pitchTorqueMagnitude, x * yawTorqueMagnitude, -x * rollTorqueMagnitude); 15 16 Quaternion target_rot = this.transform.rotation; 17 Quaternion rot = target_rot * Quaternion.Inverse(this.transform.rotation); 18 if(rot.w < 0f){ 19 rot.x = -rot.x; 20 rot.y = -rot.y; 21 rot.z = -rot.z; 22 rot.w = -rot.w; 23 } 24 Vector3 restoringTorque = new Vector3(rot.x, rot.y, rot.z) * 100f; 25 // 機体にトルクを加える 26 // rigidbody.AddTorque(rotationTorque); 27 rigidbody.AddTorque(rotationTorque + restoringTorque); 28 29 }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/07/21 14:48
2019/07/21 15:46
退会済みユーザー
2019/07/22 16:30 編集
2019/07/22 19:43
退会済みユーザー
2019/07/23 14:07