Open3

Vector、Rotationメモ

udonudon

ワールド座標をローカル座標に変換

Inverse Transform Location

あるワールド座標を、特定のアクタのローカル座標に変換する。
T:あるアクタ内のローカル座標に変換したい場合、そのアクターのTransformを入れる。
Location:ローカル座標にしたいワールド座標を入れる。

Tにアクタコンポーネントのワールド座標を入れた場合。
アクタコンポーネントからの相対座標を算出できる。

参考

https://wakagamestudio.hatenablog.jp/entry/2021/06/09/174412

udonudon

Vector入門

まず知るべきこと

Vectorは2つの意味を持っている。

・位置
・方向
Vectorの値の中にはこれらの意味が含まれている。
Set Actor Location を使っていると、Vectorは位置を扱うものなんだなと思うけど、方向も含まれている。

ワールドの向き、Actorの向き

ワールドの向き、Actorの向き、この二つは区別しなければならない。自分のような初学者は、ここの区別ができず混同してしまう。
エディタ上でActorを選択すると、3つの方向を示す矢印が表示される。
さて、これはActorの向きを示すものだろうか?
Actorが90度回転していようが、30度回転していようが、矢印の向きが変わることはない。
これはActorの向きではない。
ActorにArrowコンポーネントを追加すると、Actorの向き(前方)がわかる矢印が追加される。
Actorが回転すれば、矢印の向きも変わる。

Get Actor Forward Vector

ベクター初学者の難関。
Actorの前方を意味するVectorである。
Vectorの値を出力すると【方向】のみを示す情報が出てくる。(x:1,y:0,z:0)みたいな感じ。
以前の自分はGet Actor Forward Vector が(x:1,y:0,z:0)を返すものだと思っていた。
だけどActorを回転させて、Get Actor Forward Vectorをやると、別の値を返すことに気づける。

Get Actor Location + (Get Actor Forward Vector * 100(float))とかやると、Actorの前方100cm先の座標を得られる。

オススメ動画

https://youtu.be/0gvPOLEBbqE

短いし、図解があるのでわかりやすい。
英語がわからなくても図解を見ることでなんとなく理解ができそう。
内積(Dot Product)、外積(CrossProduct)の説明もあり。

回転(Rotate、クォータニオン)

回転と軸

棒をある方向へ傾けたい場合。
Xを30度,Yを90度,Zを...といった感じでもうややこしい。
回転は1つの軸回転で表現できるため、その軸を求めてしまった方が良い。
以下はすごくおススメの動画。

https://www.youtube.com/watch?v=uKWLPU8gfIY&t=2021s

ある回転後の結果がほしい場合、「Rotate from Axis and Angle」ノードを使って、1つの回転軸と角度で求めることができる。
角度は内積。回転軸は外積で求められる。
UnrealEngineではこれらを複雑な計算式を必要とせず求めることができる。
ベクトルが方向を示すものだと知っていれば、文系の私でもなんとかなる。

内積・なす角(Dot Product)

あるベクトルと、あるベクトル間の角度の算出に使える。
Dot Productノードの出力ピンをAcosd(度単位)ノードに繋がないと角度は取得できない。
使用場所の想定:Rotate系ノードのAngleという入力ピンでの使用など。
例えば、Actor(A)のUpVectorとか、Actor(B)のRightVectorとか、とにかく2つのベクトルをDot Productの入力ピンににいれるとベクトル同士の角度にどれだけの開きがあるかわかる。

外積(CrossProduct)

Axis(軸)を割り出す。軸はある方向へ伸びる直線。
使用場所の想定:Rotate系ノードのAxisという入力ピンでの使用など。
「Rotate from Axis and Angle」のAxisは回転させるための軸という意味。
ネジを締める場合や、コマを回す場合、それらはUnrealで言うところのZ軸を回転させている。
例えば、Actor(A)のUpVectorとか、Actor(B)のRightVectorとか、とにかく2つのベクトルをCrossProductの入力ピンに繋げることで、「入力した2つの軸に垂直な軸」を出力できる。そしてその軸は回転させるための軸として使える。

UnrealEngine上での動作

https://www.youtube.com/watch?v=O9pkcjFfKNQ

これもすごくオススメな動画。