クォータニオン完全マスター
ユニティ・テクノロジーズ・ジャパン合同会社
安原 祐二
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
マメ知識
逆変換は
虚部の符号を反転
共役複素数と呼ぶ
おしまい

More Related Content

PDF
Unity dojo amplifyshadereditor101_jpn-jp
PDF
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
PDF
シェーダだけで世界を創る!three.jsによるレイマーチング
PDF
GPU最適化入門
PDF
Mayaカメラデータunityインストール
PDF
Unity道場11 Shader Forge 101 ~ShaderForgeをつかって学ぶシェーダー入門~ 基本操作とよく使われるノード編
PDF
VRM 標準シェーダ MToon の使い方
PDF
【Unity】 Behavior TreeでAIを作る
Unity dojo amplifyshadereditor101_jpn-jp
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
シェーダだけで世界を創る!three.jsによるレイマーチング
GPU最適化入門
Mayaカメラデータunityインストール
Unity道場11 Shader Forge 101 ~ShaderForgeをつかって学ぶシェーダー入門~ 基本操作とよく使われるノード編
VRM 標準シェーダ MToon の使い方
【Unity】 Behavior TreeでAIを作る

What's hot (20)

PDF
Unityではじめるオープンワールド制作 エンジニア編
PDF
UE4とBlenderでランニングコストを抑えるモダンなワークフロー
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
PDF
60fpsアクションを実現する秘訣を伝授 解析編
PDF
Observableで非同期処理
PDF
【Unity道場 2月】シェーダを書けるプログラマになろう
PDF
【Unity道場】物理シミュレーション完全マスター
PDF
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
PDF
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
PDF
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られた
PDF
UE4背景アーティスト勉強会(前編) 背景ワークフロー解説
PDF
Unityでパフォーマンスの良いUIを作る為のTips
PDF
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
PDF
Riderはいいぞ!
PDF
カスタムメモリマネージャと高速なメモリアロケータについて
PPTX
UE4におけるLoadingとGCのProfilingと最適化手法
PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
PPTX
なぜなにリアルタイムレンダリング
PDF
聖剣伝説3でのUE4利用事例の紹介~Making of Mana | UNREAL FEST EXTREME 2020 WINTER
Unityではじめるオープンワールド制作 エンジニア編
UE4とBlenderでランニングコストを抑えるモダンなワークフロー
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
60fpsアクションを実現する秘訣を伝授 解析編
Observableで非同期処理
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場】物理シミュレーション完全マスター
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
『FINAL FANTASY VII REMAKE』におけるプロファイリングと最適化事例 UNREAL FEST EXTREME 2021 SUMMER
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られた
UE4背景アーティスト勉強会(前編) 背景ワークフロー解説
Unityでパフォーマンスの良いUIを作る為のTips
アーティストの為のプロファイル入門!~楽しいRenderDocの使い方~
Riderはいいぞ!
カスタムメモリマネージャと高速なメモリアロケータについて
UE4におけるLoadingとGCのProfilingと最適化手法
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
なぜなにリアルタイムレンダリング
聖剣伝説3でのUE4利用事例の紹介~Making of Mana | UNREAL FEST EXTREME 2020 WINTER
Ad

Viewers also liked (6)

PPTX
【Unity道場スペシャル 2017博多】無料アニメーションツールAnima2Dを使ってみよう
PPTX
【Unity道場 博多スペシャル 2017】Textmesh proを使いこなす
PDF
【Unity道場スペシャル 2017博多】スマホゲーム開発者が知っておくべきチートのリスク&対策
PDF
【Unity道場スペシャル 2017博多】Unityで楽しむノンフォトリアルな絵づくり講座:トゥーンシェーダー・マニアクス
PPTX
Substance勉強会 in Osaka
PDF
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unity道場スペシャル 2017博多】無料アニメーションツールAnima2Dを使ってみよう
【Unity道場 博多スペシャル 2017】Textmesh proを使いこなす
【Unity道場スペシャル 2017博多】スマホゲーム開発者が知っておくべきチートのリスク&対策
【Unity道場スペシャル 2017博多】Unityで楽しむノンフォトリアルな絵づくり講座:トゥーンシェーダー・マニアクス
Substance勉強会 in Osaka
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
Ad

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

PPTX
【Unity道場スペシャル 2017大阪】クォータニオン完全マスター
PDF
A Mathematical Introduction to Robotic Manipulation 輪講 第二回.pdf
PDF
2次元/3次元幾何学変換の統一的な最適計算論文
PPTX
CG2013 08
PPTX
CG2013 06
PDF
点群深層学習 Meta-study
PDF
【Unite Tokyo 2018】誘導ミサイル完全マスター
PDF
Fusion4dIntroduction
PDF
論文紹介「PointNetLK: Robust & Efficient Point Cloud Registration Using PointNet」
PDF
第126回 ロボット工学セミナー 三次元点群と深層学習
PDF
150818 math001 座標
PPTX
CG2013 09
PDF
OpenGL 3DCG
PDF
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜
PPTX
OpenGLと行列
PPTX
OpenGLと行列
PDF
20170823【GWゼミ #2】コンピュータビジョンの基礎
PDF
HTML5 Canvas で学ぶアフィン変換
PDF
Unityとシェーダで描く360度フラクタル
PDF
三次元点群処理ライブラリPCLと 統合ロボットシステム研究での 利用例の紹介
【Unity道場スペシャル 2017大阪】クォータニオン完全マスター
A Mathematical Introduction to Robotic Manipulation 輪講 第二回.pdf
2次元/3次元幾何学変換の統一的な最適計算論文
CG2013 08
CG2013 06
点群深層学習 Meta-study
【Unite Tokyo 2018】誘導ミサイル完全マスター
Fusion4dIntroduction
論文紹介「PointNetLK: Robust & Efficient Point Cloud Registration Using PointNet」
第126回 ロボット工学セミナー 三次元点群と深層学習
150818 math001 座標
CG2013 09
OpenGL 3DCG
SSII2022 [TS1] Transformerの最前線〜 畳込みニューラルネットワークの先へ 〜
OpenGLと行列
OpenGLと行列
20170823【GWゼミ #2】コンピュータビジョンの基礎
HTML5 Canvas で学ぶアフィン変換
Unityとシェーダで描く360度フラクタル
三次元点群処理ライブラリPCLと 統合ロボットシステム研究での 利用例の紹介

More from Unity Technologies Japan K.K. (20)

PDF
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
PDF
UnityのクラッシュをBacktraceでデバッグしよう!
PDF
Unityで始めるバーチャルプロダクション
PDF
ビジュアルスクリプティング (旧:Bolt) で始めるUnity入門3日目 ゲームをカスタマイズしよう
PDF
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
PDF
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
PDF
PlasticSCMの活用テクニックをハンズオンで一緒に学ぼう!
PDF
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
PDF
Unity教える先生方注目!ティーチャートレーニングデイを体験しよう
PDF
「原神」におけるコンソールプラットフォーム開発
PDF
FANTASIANの明日使えない特殊テクニック教えます
PDF
インディーゲーム開発の現状と未来 2021
PDF
建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】
PDF
Burstを使ってSHA-256のハッシュ計算を高速に行う話
PDF
Cinemachineで見下ろし視点のカメラを作る
PDF
徹底解説 Unity Reflect【開発編 ver2.0】
PDF
徹底解説 Unity Reflect【概要編 ver2.0】
PDF
Unityティーチャートレーニングデイ -認定プログラマー編-
PDF
Unityティーチャートレーニングデイ -認定3Dアーティスト編-
PDF
Unityティーチャートレーニングデイ -認定アソシエイト編-
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
UnityのクラッシュをBacktraceでデバッグしよう!
Unityで始めるバーチャルプロダクション
ビジュアルスクリプティング (旧:Bolt) で始めるUnity入門3日目 ゲームをカスタマイズしよう
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
PlasticSCMの活用テクニックをハンズオンで一緒に学ぼう!
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
Unity教える先生方注目!ティーチャートレーニングデイを体験しよう
「原神」におけるコンソールプラットフォーム開発
FANTASIANの明日使えない特殊テクニック教えます
インディーゲーム開発の現状と未来 2021
建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】
Burstを使ってSHA-256のハッシュ計算を高速に行う話
Cinemachineで見下ろし視点のカメラを作る
徹底解説 Unity Reflect【開発編 ver2.0】
徹底解説 Unity Reflect【概要編 ver2.0】
Unityティーチャートレーニングデイ -認定プログラマー編-
Unityティーチャートレーニングデイ -認定3Dアーティスト編-
Unityティーチャートレーニングデイ -認定アソシエイト編-

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