【Unity道場スペシャル 2017博多】クォータニオン完全マスター

Unity Technologies Japan K.K.
Unity Technologies Japan K.K.Unity Technologies Japan K.K.
クォータニオン完全マスター
ユニティ・テクノロジーズ・ジャパン合同会社
安原 祐二
Unity スクリプトリファレンスより抜粋
座標変換
CG
オイラー角
複素数
クォータニオン
本セッションの旅程
座標変換
CGの
きほん
たくさんの点を動かす!
© Unity Technologies Japan/UCL
P(1, 2)
x
y
二次元座標
P’(-2, 1)
x
y
P(1, 2)
P(1, 2) P’(-2, 1)
ある変換で点を移動
変換
ある変換=なんらかのルール
同じ変換でたくさんの点を移動
Q(2, 0) Q’(0, 2)
変換
P(1, 2) P’(-2, 1)
変換
R(1, 1) R’(-1, 1)
変換
こういう式にしてみよう
x’ = ax + by
y’ = cx + dy
P’(x’, y’) = [変換]P(x, y)
x’ = ax + by
y’ = cx + dy
x’ = 1x + 0y
y’ = 0x + 1y
a=1 b=0 c=0 d=1 なら
x’ = x
y’ = y
変化しない変換
色々できそう!
色々できそう!
x’ = ax + by
y’ = cx + dy
x’ = 1x + 0y
y’ = 0x + 1y
a=1 b=0 c=0 d=1 なら
x’ = x
y’ = y
変化しない変換
x’ = 0x + 1y
y’ = 1x + 0y
a=0 b=1 c=1 d=0 なら
x’ = y
y’ = x
xy入れ替え変換
abcdをまとめてしまおう
x’ = ax + by
y’ = cx + dy
a b
c d( )
これを行列と呼ぶ!
変換を行列Mとして
P(1, 2) P’(-2, 1)
変換
P’=MP
P’(x’, y’) = [変換]P(x, y)
a b
c d( )P’= P
変換を行列Mとして
P(1, 2) P’(-2, 1)
変換
P’=MP
P’(x’, y’) = [変換]P(x, y)
(
行列に点ベクトルを掛ける
a b
c d( )=
a b
c d( ) 1
2)=)(-2
1
x’ = ax + by
y’ = cx + dy
-2 = a1 + b2
1 = c1 + d2
例えば
)(x’
y’ (x
y)
-2 = a1 + b2
1 = c1 + d2
行列に点ベクトルを掛ける
-2 = a1 + b2
1 = c1 + d2
1
2( )a b
c d( ) 1
=)(-2
1 2
1
2
+
+
三次元では3x3行列になる
x’ = ax + by + cz
y’ = dx + ey + fz
a b c
d e f
g h i( )
z’ = gx + hy + iz
概念は同じなので
以降も二次元で続けます
いろいろな行列
2 0
0 2( ) 2倍に拡大
スケーリング行列
cosθ -sinθ
sinθ cosθ( )θ回転する
回転行列
デモ
x
y
あれ?
移動は?
行列の値をどう工夫しても移動はできない!
x’ = ax + by
y’ = cx + dy
x’ = ax + by + s
y’ = cx + dy + t
移動するために式を変更
これで(s,t)で移動できる
追加!
移動を実現するために行列を拡張
a b s
c d t( )
a b
c d( )
a b s
c d t
0 0 1
( )
何かと都合がいいので
3x3 にする
x’ = ax + by + s
y’ = cx + dy + t
行と列の数が同じ
正方行列と呼ぶ
デモ
三次元でも同様にして移動を実現
つまり三次元では4x4行列を使う
a b c s
d e f t
g h i u
0 0 0 1
)(
x’
y’
z’
1
( )=
x
y
z
1
( )
a b s
c d t
0 0 1
( )
二次元用3x3行列の
各部分の役割
回転 移動
a b c s
d e f t
g h i u
0 0 0 1
)(
回転 移動
三次元用4x4行列の
各部分の役割
回転 移動
三次元用4x4行列の
各部分の役割
transform.rotation transform.position
Quaternion
クォータニオン
で作る
Vector3
ベクトル
で作る
a b c s
d e f t
g h i u
0 0 0 1
)(
異なる変換をいくつも重ねる
これを点ごとに計算するのはたいへん…
P’=(○(○(○(○P))))
いくつも変換する場合は事前に計算しておける
点ごとにMを掛ければ済む
P’=MP
P’=○○○○P
P’=(○(○(○(○P))))
M=○○○○ を
事前に計算して…
座標変換
CG
オイラー角
複素数
クォータニオン
CGに応用する行列
3つの変換行列
• モデル行列
• ビュー行列
• プロジェクション行列
すべての変換前
モデリングした物体の座標
データにはこの座標が
格納されている
この変換が
モデル行列
Transformで
移動・回転
シーンにはカメラがある
カメラ
Transformで
移動・回転
z
カメラが原点・ゼロ回転
になるように変換
この変換が
ビュー行列
空間全体をモニタの位置に合わせる!
z
画角や near, far を処理
w に z を格納など…
この変換が
プロジェクション行列
Unity組み込みシェーダ
UnityShaderVariables.cginc より抜粋
M:モデル V:ビュー P:プロジェクション
モニタに映すための
透視変換
この変換は
行列ではなく奥行きで割る
遠くのものを小さく!
透視変換のようす
座標変換
CG
オイラー角
複素数
クォータニオン
オイラー角方式
二次元の回転はシンプル
回転軸はひとつ
cosθ -sinθ
sinθ cosθ( )θ回転の
回転行列
三次元では3軸の
回転量をそれぞれ記述
あらゆる姿勢を表現可能
これがオイラー角方式
x
y
z
直感的!
Unity の Inspector の Rotation は…
表示に関しては
オイラー角方式
P’=YXZP
X X軸まわりの回転行列
Y Y軸まわりの回転行列
Z Z軸まわりの回転行列
オイラー角方式の回転には順番がある
Unityは
ZYXの順番
プログラム例:
オイラー角で作った回転を代入
transform.rotation = Quaternion.Euler(x, y, z);
①
②
③
変換を3回重ねている
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
座標変換
CG
オイラー角
複素数
クォータニオン
複素数と複素平面
クォータニオンは
複素数の拡張
問題
は虚数単位
虚数の定義
虚数単位
複素数
:実部
:虚部
2
1
普通の平面
P(1, 2)
x
y
実軸
虚軸
1+2i
1
2
複素平面
実軸
虚軸
半径1の円周上の点を
考える
単位円と呼ぶ
実軸
虚軸
1+0i つまり 1
実軸
虚軸
-1+0i つまり -1
1
実軸
虚軸
0+i つまり i
-1 1
実軸
虚軸
0-i つまり -i
-1 1
i
実軸
虚軸
-1 1
i
-i
実軸
虚軸
-1 1
i
-i
45°
実軸
虚軸
cos45°-1 1
i
-i
45°
sin45°
実軸
虚軸
cos45°+isin45°
-1 1
i
-i
45°
cos45°
sin45°
0.7+0.7iぐらい
実軸
虚軸
cosθ+isinθ
-1 1
i
-i
θ
cosθ
sinθ
重大な事実
単位円上の点は回転だった
実軸
虚軸
-1 1
i
-i
ゼロ回転
実軸
虚軸
-1 1
i
-i
180°回転
実軸
虚軸
90°回転
-1 1
i
-i
実軸
虚軸
270°回転
-1 1
i
-i
実軸
虚軸
-90°回転
-1 1
i
-i 270°と-90°は
同じ意味
もしくは
もっと重大な事実
点と点を掛けると回転する
虚数の性質
実軸
虚軸
i
-1 1
i
-i
i は90°回転
実軸
虚軸
i
-1 1
i
-i
i は i をさらに
90°回転
2
つまり
i = -12
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
実軸
虚軸
-1 1
i
-i
-1
-1をさらに
180°回転
つまり
(-1) = 12
実軸
虚軸
0.7+0.7i
-1 1
i
-i
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
実軸
虚軸
0.98i
-1 1
i
-i
0.7+0.7i
θ
実軸
虚軸
cosθ+isinθ
-1 1
i
-i
(cosθ+isinθ)
2
回転角を足す
と
複素数を掛ける
は
同じ意味!
cos2θ+isin2θ
=
2θ
ところで…
この方程式を解いてみよう
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
実軸
虚軸
-1 1
i
-i
実軸
虚軸
-1 1
i
-i
から正三角形!
120°
座標変換
CG
オイラー角
複素数
クォータニオン
クォータニオン
考案者はハミルトン
(William Rowan Hamilton 1805-1865)
「複素平面の三次元版は
作れないものか…」
虚軸を3つにすればうまくいく!
i が虚数単位
クォータニオン複素数
i, j, kが虚数単位
i =-12
i =-12
j =-12
k =-12
ij=k jk=i ki=j
ji=-k kj=-i ik=-j
驚愕のアイデア!
クォータニオンは複素数の三次元版
a+ib a+ib+jc+kd
クォータニオン複素数
複素数の要素はふたつ
クォータニオンの要素は4つ
クォータニオン要素を
x, y, z, w とする
ix+jy+kz+w
(x, y, z, w)
実部虚部
複素平面の回転軸は
固定だった
立体の場合
(x, y, z)
ix+jy+kz+w
(x, y, z, w)
実部虚部
回転軸が
虚部のベクトル
複素数の回転と
クォータニオンの回転
cosθ+isinθ
複素数
cosー+nsinー
2 2
θ θ
n=inx+jny+knz
n(nx, ny, nz)は回転軸のベクトル
クォータニオン
重大な事実
あらゆる回転は
ひとつの軸回転で表現できる
そしてクォータニオンは
軸回転を表現する
クォータニオンなら
一発で決まる!
あらゆる回転は
ひとつの軸回転で表現できる
クォータニオンのテクニック
便利なテクニック
Slerp (Spherical Linear Interpolation):球面線形補間
transform.rotation =
Quaternion.Slerp(transform.rotation,
target_rotation,
0.1f);
現在の値
目標の値
適当な率
凝ったテクニック
バネトルク
目標との差分に比例したトルクをかける
基本戦略:
目標への差分を求めて、トルクに変換する
差分クォータニオンの求めかた
差分=目標の値×現在の値
-1
実演
バネトルク実装例
4要素の符号を反転しても
同じ回転になる
(x, y, z, w)
(-x, -y, -z, -w)
実は回転の方向が異なる
(x, y, z, w)
(-x, -y, -z, -w)
バネトルクを完成させる
テクニック
wが負のときに反転すると
短い方の回転になる
(x, y, z, w)
(-x, -y, -z, -w)
修正済みコード
追加
var rot = Quaternion.LookRotation(diff);
第二引数に Vector.up が省略されている
var up = transform.TransformVector(Vector3.up);
var rot = Quaternion.LookRotation(diff, up);
自分の姿勢から up ベクトルを作る
水平を維持しないテクニック
修正済みコードその2
追加
デモ
このあと学習を続けるなら…
• トルクや物理を詳しく知りたい→Unity道場札幌講演をぜひ!
https://www.youtube.com/watch?v=FqjM9oujyNE&feature=youtu.be
• クォータニオンの応用例を知りたい→Unite2017Tokyoをぜひ!
https://www.youtube.com/watch?v=6EtTI5xC524 27分あたりから
• なんで と、 になるのか気になる→ ブログ「クォータニ
オンで回転を表現する定義にθ/2が使用される理由」をぜひ!
http://qiita.com/yuji_yasuhara/items/a5b7c489e1d521adbd72
θ
2
cosー+nsinー
2
θ
2
θ
ー
参考:Inverse自前実装
虚部を反転するだけで逆クォータニオン
実軸
虚軸
-1 1
i
-i
マメ知識
逆変換は
虚部の符号を反転
共役複素数と呼ぶ
おしまい
1 sur 121

Contenu connexe

Tendances(20)

MagicOnion入門MagicOnion入門
MagicOnion入門
torisoup10.4K vues
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
エピック・ゲームズ・ジャパン Epic Games Japan35.1K vues
GPU最適化入門GPU最適化入門
GPU最適化入門
Takahiro KOGUCHI19.3K vues
UE4で作成するUIと最適化手法UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法
エピック・ゲームズ・ジャパン Epic Games Japan17K vues
UniTask入門UniTask入門
UniTask入門
torisoup14.2K vues
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow) UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
エピック・ゲームズ・ジャパン Epic Games Japan9.9K vues
猫でも分かるUE4のポストプロセスを使った演出・絵作り猫でも分かるUE4のポストプロセスを使った演出・絵作り
猫でも分かるUE4のポストプロセスを使った演出・絵作り
エピック・ゲームズ・ジャパン Epic Games Japan92.9K vues
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解した
torisoup9.3K vues

Similaire à 【Unity道場スペシャル 2017博多】クォータニオン完全マスター(20)

機械学習と深層学習の数理機械学習と深層学習の数理
機械学習と深層学習の数理
Ryo Nakamura53.9K vues
CG2013 06CG2013 06
CG2013 06
shiozawa_h913 vues
代数トポロジー入門代数トポロジー入門
代数トポロジー入門
Tatsuki SHIMIZU3.1K vues
Ppt kasawakiPpt kasawaki
Ppt kasawaki
harmonylab259 vues
kasawaki bkasawaki b
kasawaki b
harmonylab723 vues
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル3.3K vues
Ppt minagawaPpt minagawa
Ppt minagawa
harmonylab267 vues
minagawa mminagawa m
minagawa m
harmonylab788 vues
機械学習とこれを支える並列計算 : 並列計算の現状と産業応用について機械学習とこれを支える並列計算 : 並列計算の現状と産業応用について
機械学習とこれを支える並列計算 : 並列計算の現状と産業応用について
ハイシンク創研 / Laboratory of Hi-Think Corporation1.6K vues
JOIss2020 発表資料JOIss2020 発表資料
JOIss2020 発表資料
mdkcpp 1015111 vues
topology of musical datatopology of musical data
topology of musical data
Tatsuki SHIMIZU2.7K vues

Plus de Unity Technologies Japan K.K.(20)

Unityで始めるバーチャルプロダクションUnityで始めるバーチャルプロダクション
Unityで始めるバーチャルプロダクション
Unity Technologies Japan K.K.3.7K vues
インディーゲーム開発の現状と未来 2021インディーゲーム開発の現状と未来 2021
インディーゲーム開発の現状と未来 2021
Unity Technologies Japan K.K.2.6K vues
Cinemachineで見下ろし視点のカメラを作るCinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作る
Unity Technologies Japan K.K.4.5K vues
徹底解説 Unity Reflect【開発編 ver2.0】徹底解説 Unity Reflect【開発編 ver2.0】
徹底解説 Unity Reflect【開発編 ver2.0】
Unity Technologies Japan K.K.1.6K vues
徹底解説 Unity Reflect【概要編 ver2.0】徹底解説 Unity Reflect【概要編 ver2.0】
徹底解説 Unity Reflect【概要編 ver2.0】
Unity Technologies Japan K.K.2.2K vues

【Unity道場スペシャル 2017博多】クォータニオン完全マスター