質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

Unity(3D)での、物理演算と相性のいいオブジェクト回転方法

unity_beginner_
unity_beginner_

総合スコア12

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0評価

0クリップ

90閲覧

投稿2022/06/23 08:36

オブジェクトA(this)をオブジェクトB(target)と同じ角度になるように回転させる方法を模索しています。
具体的な条件は以下の通りです。

・指定したオブジェクトBと同じ角度になるようにオブジェクトAを回転させる
・オブジェクトAは滑らかに回転する(a.transform.rotation=b.transform.rotation とはしない)
・回転する途中、回転した後において、物理演算の影響(この表現であっているのかわかりませんが)を受ける。
そのため、回転中に壁などに引っかかった場合回転は止まる(もしくは回転の動きが変化する)

何通りかのスクリプトを書いてみましたが、全て回転がおかしくなりました。
調べてみた所、クォータニオンをオイラー角に変換している所が問題なようです。

クォータニオン型で角速度を与える方法、また他にも何か良い方法がございましたら、教えていただけると幸いです。

1例

using System.Collections; using System.Collections.Generic; using UnityEngine; //回転させるオブジェクト(A)にくっつける public class f_quaternion_rotate : MonoBehaviour { public GameObject follow_target; public float sokudo; public bool rotate_velo; //trueに設定 // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { Vector3 angle_velo; Quaternion angle; Quaternion this_Quat = this.transform.rotation; ///aにあたる Quaternion target_Quat = follow_target.transform.rotation; //bにあたる //thisは逆数にする this_Quat = Quaternion.Inverse(this_Quat); angle = Get_OuterProduct(this_Quat, target_Quat); angle_velo = angle.eulerAngles; { if (angle_velo.x > 180) angle_velo.x -= 360; if (angle_velo.y > 180) angle_velo.y -= 360; if (angle_velo.z > 180) angle_velo.z -= 360; } if(rotate_velo==true) { angle_velo = angle_velo / 180 * Mathf.PI; this.GetComponent<Rigidbody>().angularVelocity = angle_velo * 20f * sokudo * Time.deltaTime; } else { this.transform.Rotate(angle_velo); } Debug.Log("target: " + follow_target.transform.rotation + "\nthis: " + this.transform.rotation + "\nangle_velo: " + angle_velo); } Quaternion Get_OuterProduct(Quaternion a, Quaternion b) //クォータニオン型でabの外積を返す { Quaternion c; c.x = (a.w * b.x) + (a.x * b.w) + (a.y * b.z) - (a.z * b.y); c.y = (a.w * b.y) + (a.y * b.w) - (a.x * b.z) + (a.z * b.x); c.z = (a.w * b.z) + (a.z * b.w) + (a.x * b.y) - (a.y * b.x); c.w = (a.w * b.w) - (a.x * b.x) - (a.y * b.y) - (a.z * b.z); return c; } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

bboydaisuke

2022/06/23 12:59

Transform を回す = 物理挙動ではない、です。Transform を動かすのが物理挙動でないのと同じです。 物理挙動として回すには Rigidbody を使って Torque を操作します。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。