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

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

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

1405閲覧

AddTorqueで回転させると挙動がおかしくなる

hemaya

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/12/05 12:14

編集2021/12/16 00:24

前提・実現したいこと

物理挙動で敵の方向を向くようにしたい。

発生している問題・エラーメッセージ

ターゲットが特定の位置に行くと逆方向に回転を始める。
(動画はキューブがプレイヤーを向くようにしたもの)

イメージ説明

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { Rigidbody rigid; public GameObject target; public float speed;//回転速度 void Start() { rigid = GetComponent<Rigidbody>(); } void FixedUpdate() { //回転// var rotate = Quaternion.LookRotation(target.transform.position - transform.position); Quaternion diff = rotate * Quaternion.Inverse(rigid.rotation); rigid.AddTorque(new Vector3(diff.x,diff.y, diff.z) * speed); } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Unityを知らないので質問に貼られている動画の雰囲気からの想像でしかありませんが…

用いているメソッド (Quaternion.LookRotation とか) の結果の軸方向が必ずしも一定ではないのだと思います.
何らかの演算によって四元数を求めたときにその結果が (x,y,z,w) となるか, (-x,-y,-z,-w) となるか,的な部分が,どこかを境にして変わるのでしょう.
(…っていう話かどうかは,四元数の要素値を表示させてみるとかすれば確認できるのではないでしょうか)

もしそうであれば,
new Vector3(diff.x,diff.y, diff.z) * speed のように軸情報だけを用いてしまうと,軸を示すベクトルが反転した場合にトルクが逆向きになるでしょう.
係数 speed の符号が一定だからです.
ここに diff.w 成分の正負も反映させたならば動作が改善しないでしょうか.

投稿2021/12/16 04:44

編集2021/12/16 04:46
fana

総合スコア11708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/12/16 04:49

Unity素人的には,四元数の演算を用いずとも, target.transform.position - transform.position と 現在の向き との外積から直接的に AddTorque の引数を決めてしまえるのではないか? とか思いますが,どうなんでしょうね.
fana

2021/12/16 05:03 編集

> 軸方向が必ずしも一定ではないのだと思います 要は, 「ある基準方向(1)」が「方向(2) = target.transform.position - transform.position」にいくような回転を求めよ, って言われた際に… (1)を基準として見たときの(2)の方向というのが「右側」である場合と「左側」である場合とでは,結果の「回転軸」の向きが逆になるのか,それとも「回転角」の正負が逆になるのか? …っていうのは,回転を求める実装に依存するよね,っていう話. > new Vector3(diff.x,diff.y, diff.z) みたく,何かしらの演算結果の一部要素だけを抜き出して用いるのであれば,そこらへんはどうなの?っていう仕様を全部把握した上でやる必要があると思う.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問