【3Dゲームエンジン】Unity質問スレッド32 at GAMEDEV
【3Dゲームエンジン】Unity質問スレッド32 - 暇つぶし2ch1023:名前は開発中のものです。
17/12/20 00:34:43.35 TUVA4DF6.net
>>970
考えてみました。
Aに下記のスクリプトをセットします。
public class A : MonoBehaviour {
 GameObject obj;
 Vector3 target, position, direction;
 void Start () {
  obj = GameObject.Find ("B");
  target = obj.transform.position;
  position = transform.position;
  direction = target - position;
  Invoke ("Rotate", 1.0f);
 }
 void Rotate(){
  transform.right = direction; ←ここを置き換えるコードです。
 }
}

1024:名前は開発中のものです。
17/12/20 00:39:41.23 TUVA4DF6.net
①Quaternion.FromToRotationを使用する方法1
 transform.rotation = Quaternion.FromToRotation (Vector3.right, direction);
②Quaternion.FromToRotationを使用する方法2
 transform.rotation = transform.rotation * Quaternion.FromToRotation (transform.right, direction);
③Vector3.Angleを使用する方法1
 transform.rotation = Quaternion.Euler(0, 0, Mathf.Sign(Vector3.Dot(Vector3.forward, Vector3.Cross(Vector3.right, direction))) *Vector3.Angle(Vector3.right, direction));
④Vector3.Angleを使用する方法2
 transform.rotation = transform.rotation * Quaternion.Euler(0, 0, Mathf.Sign(Vector3.Dot(transform.forward, Vector3.Cross(transform.right, direction))) *Vector3.Angle(transform.right, direction));

1025:名前は開発中のものです。
17/12/20 00:44:36.57 TUVA4DF6.net
⑤Vector3.Angleを使用する方法3(Rotateを使用)
 transform.Rotate (0, 0, Mathf.Sign(Vector3.Dot(Vector3.forward, Vector3.Cross(transform.right, direction))) *Vector3.Angle(transform.right, direction));
⑥Mathf.Atan2を使用する方法1(Rotateを使用)
 transform.Rotate (0, 0, Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg - transform.rotation.eulerAngles.z);
⑦Mathf.Atan2を使用する方法2
 transform.rotation = Quaternion.AngleAxis(Mathf.Atan2((direction.y, direction.x) * Mathf.Rad2Deg, Vector3.forward);
うーん、どうやっても元よりも長いコードになってしまいます。
オブジェクトAの位置が原点だとか、オブジェクトAの向きが無回転だとか、
条件を付ければ、もう少し簡略化できますが・・・

1026:名前は開発中のものです。
17/12/20 01:00:49.24 TUVA4DF6.net
Quaternion.FromToRotation(A, B)では、
回転方向を含めた回転状態を得られますが、
Vector3.Angle(A, B)では、



1027:ベクトル間の角度しかわからず、向きがわかりません。 また、取得される角度は180度以下に限定されるため、 左向きに270度は、右向きに90度かもしれないということです。 回転方向は、Vector3.Cross(A, B)のZ成分が正か負かで判定します。 2Dでは、Mathf.Sign((Vector3.Cross(A, B)).z)でも良いのですが、 3Dでは、回転面がXY平面上とは限らないため、外積ベクトルと 正の向きにしたい軸との内積をとってから符号判定した方が確実です。 Atan2関数は、戻り値がradのため、度に直す必要があります。 また、相対回転であるRotateを使用する場合は、 求めた偏角から、現在の向きの回転角を引いておく必要があります。 rotationはQuaternionのため、eulerAnglesでオイラー角に戻しておき、 Z軸回転成分だけを取り出して減算します。



1028:名前は開発中のものです。
17/12/20 08:42:36.26 XTZUI7pU.net
969です
>>977-980
詳しく解説ありがとうございました!
やっぱり、角度から行こうとすると結構面倒ですね~

1029:名前は開発中のものです。
17/12/20 18:29:13.04 XTZUI7pU.net
汎用性を考えると、Quaternion.FromToRotationは良さそうですね
これは、あるベクトルを別のベクトルにする回転を返すわけだから、
自分の向きを、自分のベクトルから目標とするベクトルへ向ける回転にするわけですか・・・

1030:名前は開発中のものです。
17/12/20 22:49:28.74 TUVA4DF6.net
>>981
テラシュールブログ
URLリンク(tsubakit1.hateblo.jp)
ここに、Quaternion.FromToRotationの使い方がうまくまとまってました。
>>var diff = (target.position - transform.position ).normalized;
>>transform.rotation = Quaternion.FromToRotation( Vector3.up, diff);
このサイトでは、diffは正規化されているようですが、
基本的に内部で強制的に単位ベクトルになるようなので、
target.position - transform.positioだけで大丈夫そうです。
なお、外積ベクトルを利用する場合は、大きさも影響してきますので、
方向ベクトルは単位ベクトルにしておいたほうが無難です。

1031:名前は開発中のものです。
17/12/20 22:56:36.28 TUVA4DF6.net
なお、私の方法では、外積ベクトルとZ軸の内積をとっていますが、
最終的に符号のみを取り出しているので、大きさが影響しません。
Vector3.Reflect,Vector3.Project,Vector3.ProjectOnPlaneなど、
単位ベクトルに内積を乗算するタイプの関数では、
必ず正規化して単位ベクトルにしてから代入しないと、
計算結果が変わってきますので、注意が必要です。

1032:名前は開発中のものです。
17/12/21 12:35:15.03 rQmWRShb.net
  /⌒ヽ
 く/・〝 ⌒ヽ   すうがくのことわからない
  | 3 (∪ ̄]
 く、・〟 (∩ ̄]
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

1033:名前は開発中のものです。
17/12/21 13:03:49.54 nBeZymLn.net
算数だぞ。

1034:名前は開発中のものです。
17/12/21 14:22:23.93 8qhc65N4.net
確実に高校数学
中学算数でベクトルは習わない(特定進学校は除く)

1035:名前は開発中のものです。
17/12/21 14:52:32.83 nBeZymLn.net
>>987
URLリンク(www.google.co.jp)

1036:名前は開発中のものです。
17/12/21 17:37:17.76 mWsXZ6ft.net
年がいくつでも何処からでも学べるんちゃうんか

1037:名前は開発中のものです。
17/12/21 17:41:22.45 ogJEBcpf.net
年寄りは観念が固まってるから、4*4=4+4+4+4とか切り口を変えた柔軟な発想が出来ない

1038:名前は開発中のものです。
17/12/21 17:49:58.06 uW9gzElK.net
柔…軟…???

1039:名前は開発中のものです。
17/12/21 18:12:39.26 p4DyS94v.net
なんだかんだと言ってもITはそれなりの頭がないと出来ない
中学、高校で数学が苦手だった奴にプログラミングはむかない
そんな理由で糞IT専門学校卒の底辺IT奴隷だって素質があって他の業種からみれば高給与
まあ糞IT専門学校に逝っても半分以上は素質がなくて資格も


1040:取れずIT関連企業にも就職できないんだけど



1041:名前は開発中のものです。
17/12/21 18:43:55.99 d8WQwc80.net
Unityのプログラムを、コピペじゃなくて、
自分で考えて、組み立ててコードを書けるってことは、
それなりに数学的な素養があると思うんだよね~
何も行列とかクォータニオンとかを数学的にきちんと理解していなくても、
「そのメソッドで何ができるか」を理解していれば、
たとえメソッドの内部はブラックボックスでも、それを組み合わせて、
ちゃんと機能するコードが書けるから・・・
ある意味、クラスによるカプセル化と一緒で、
オブジェクト指向の根幹になるんじゃないかな?

1042:名前は開発中のものです。
17/12/21 18:52:38.72 d8WQwc80.net
もちろん、そのクラスや構造体の中で、
「数学的に何が行われているのか?」を理解していれば、
それを応用して、別のクラスを作ったり、
他の処理に応用することができるようになるとは思うけど・・・
3D処理(描画じゃなくて動作)で必要なのは、
ベクトル、行列、複素数の拡張であるクォータニオン、
極座標、関数(特に、三角関数)、初等幾何学、
古典物理学(力学)くらいじゃないかな・・・
Unityでは、行列は基本内部処理だけで表に出ないから、
高校の数学ⅡBくらいまでのレベルじゃなかろうか?

1043:名前は開発中のものです。
17/12/21 19:26:27.42 J5wOBApL.net
>>989
>年がいくつでも何処からでも学べるんちゃうんか
それを聞く時点でキミはすでに学べない。

1044:名前は開発中のものです。
17/12/21 20:31:14.43 MUjb87iC.net
そんなんいらね。
三角関数を何となく使えるぐらいで十分。
あとはunityがやってくれる。

1045:名前は開発中のものです。
17/12/21 20:41:57.83 m2pWnfBj.net
>>989
高校卒業してから20年くらい、今年初めからUnityを始めましたが、
独学でベクトルの外積やクォータニオン演算まで辿り着けたので、
興味さえあれば、何とかなるもんですよ。

1046:名前は開発中のものです。
17/12/21 20:52:09.10 m2pWnfBj.net
例えば、物理演算を使用する場合、Unityで設定できるのは、
速度velocityと力AddForce、角速度angularVelocityとトルクTorqueだけです。
(位置positionや角変位rotationは原則いじらないほうが良いです)
すると、直線移動や自転だけなら設定が簡単ですが、
公転のような円運動を行うには、物理法則に準じた命令を与える必要があります。
物理演算では、transform.RotateAroundを使えないので、
そういう場合に自分で工夫して実装できるかどうかに関わってくると思います。

1047:名前は開発中のものです。
17/12/22 00:21:49.04 ko83+b2p.net
一番とっつきにくいのは回転運動だと思います。
Rigidbodyでは、ForceMode.Accelerationがあるので、
加速度Vector3 a(m/s/s)を得たい場合は、
AddForce(a, ForceMode.Acceleration)とするだけ、
角加速度Vector3 aa(rad/s/s)を得たい場合は、
AddTorque(aa, ForceMode.Acceleration)とするだけですが、
Rigidbody2Dでは、ForceMode.Accelerationがないので、
加速度Vector2 a(m/s/s)を得たい場合は、
AddForce(a * mass)としたり、
角加速度float aa(度/s/s)を得たい場合は、
AddTorque(aa * inertia * Mathf.Deg2Rad)とする必要があります。
要するに、ニュートンの運動方程式や、
オイラーの回転運動方程式を使う必要が出てきます。
速度は、2DはVector2 v(m/s)、3DはVector3 v(m/s)で分かりやすいですが、
角速度は、2Dはfloat w(度/s)、3DはVector3 w(rad/s)と単位が変わります。
Torqueではrad単位で入れないと、inertiaと乗算できないので面倒です。

1048:名前は開発中のものです。
17/12/22 02:24:21.72 BHuKTyia.net
オイラーは、ドラマー♪

1049:名前は開発中のものです。
17/12/22 10:39:11.64 GTvlornd.net
10年は 夢のよう
100年は 夢また夢
1000年は 一瞬の光の矢
過ぎてく時間は怖くない
輝きを失う事が嫌なのです

1050:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 53日 5時間 33分 36秒

1051:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch