< Return to Video

Quaternions - Unity Official Tutorials

  • 0:00 - 0:03
    Unity ではTransform の Rotation(角度)は
  • 0:03 - 0:04
    クォータニオン(四元数)で格納されます
  • 0:05 - 0:07
    これはベクトルと似ていますが
  • 0:07 - 0:11
    X Y Z W の 4 個のコンポーネントから構成されます
  • 0:12 - 0:14
    各コンポーネントは相互に影響し合い
  • 0:14 - 0:16
    オブジェクトの回転を
  • 0:16 - 0:18
    定義します
  • 0:19 - 0:21
    クォータニオンを扱う上でまず覚えておくべき事は
  • 0:21 - 0:23
    X, Y, Z, W の 4 コンポーネントは
  • 0:23 - 0:25
    まとめて扱うものであり 単体で調整しては
  • 0:25 - 0:28
    いけないという点です
  • 0:28 - 0:30
    Unity にはクォータニオンを簡単に管理するための
  • 0:30 - 0:33
    ビルトイン機能が多数備わっています
  • 0:34 - 0:36
    さて回転を管理するシステムは
  • 0:36 - 0:37
    おそらく聞きなじみのある
  • 0:37 - 0:39
    「オイラー角」です
  • 0:40 - 0:42
    インスペクターで表示される Rotation の値も
  • 0:42 - 0:45
    利便性の高さからこのシステムを使っています
  • 0:46 - 0:48
    オイラー角における回転は それぞれ X 軸
  • 0:48 - 0:51
    Y 軸 Z 軸の回転をベースとしています
  • 0:52 - 0:54
    では オイラー角のほうが分かりやすいなら
  • 0:54 - 0:56
    なぜ Unity ではクォータニオンを使っているのでしょう?
  • 0:56 - 0:59
    ましてやなぜインスペクターで表示するオイラー角を
  • 0:59 - 1:01
    わざわざクォータニオンから変換しているのでしょう
  • 1:01 - 1:03
    端的に言えば オイラー角では
  • 1:03 - 1:05
    ジンバルロックが発生してしまい
  • 1:05 - 1:08
    その結果 増分回転が正しく動作しなくなるからです
  • 1:09 - 1:11
    Unity では回転を
  • 1:11 - 1:14
    クォータニオンで格納することでジンバルロックを
  • 1:14 - 1:16
    回避しているのです
  • 1:16 - 1:18
    それでは Quaternion クラスで使える機能を
  • 1:18 - 1:20
    見ていくとしましょう
  • 1:21 - 1:23
    まずは LookRotation 関数を見ていきます
  • 1:25 - 1:27
    さて ここにキャラクターとオーブが配置されたシーンがあります
  • 1:28 - 1:30
    キャラクターには LookAtScript というスクリプトが
  • 1:30 - 1:32
    アタッチされています
  • 1:32 - 1:34
    一方のオーブには MotionScript というスクリプトが
  • 1:34 - 1:36
    アタッチされています
  • 1:36 - 1:38
    MotionScript はオブジェクトを Horizontal 入力軸に沿って
  • 1:38 - 1:41
    単純に左右に移動させるスクリプトです
  • 1:42 - 1:44
    LookOutScript には target Transform の
  • 1:44 - 1:46
    public フィールドがあり さらにここの Update 関数で
  • 1:46 - 1:48
    LookRotation を使ってオブジェクトを
  • 1:48 - 1:51
    target を向くよう回転させます
  • 1:52 - 1:55
    LookRotation 関数は Vector3 を取り
  • 1:55 - 1:57
    パースされた Vector3 に合った
  • 1:57 - 1:59
    回転をクォータニオンで返します
  • 2:00 - 2:02
    オブジェクトとターゲット間の相対ベクトルを
  • 2:02 - 2:04
    計算することでオブジェクトのZ軸を
  • 2:04 - 2:06
    ターゲットのほうに
  • 2:06 - 2:08
    向かせることができます
  • 2:09 - 2:12
    Transform.LookAt と似た仕組みですが
  • 2:12 - 2:15
    クォータニオンを用いたほうがより明示的な指定になります
  • 2:16 - 2:18
    なお この関数は 2 個の
  • 2:18 - 2:20
    Vector3 をパースすることができます
  • 2:21 - 2:23
    このとき 2 個めの Vector3 はどちらの方向が
  • 2:23 - 2:25
    上かを指定します
  • 2:26 - 2:29
    さて Unity に戻りシーンを実行してみましょう
  • 2:29 - 2:32
    オーブをどこに動かしてもキャラクターがそちらに顔を
  • 2:32 - 2:34
    向けるのが確認できますね
  • 2:35 - 2:37
    次に見ていく関数は
  • 2:37 - 2:38
    Slerp 関数です
  • 2:38 - 2:41
    Slerp は Spherical Interpolation(球面線形補間)の略です
  • 2:42 - 2:44
    lerp 関数と非常によく似てますが
  • 2:44 - 2:47
    そちらは Linear Interpolation(線形補間)です
  • 2:47 - 2:49
    両者の最大の違いは lerp が 2 つの
  • 2:49 - 2:51
    クォータニオン間で均等に
  • 2:51 - 2:53
    補間するのに対し slerp は
  • 2:53 - 2:55
    曲線的に補間する点です
  • 2:56 - 2:58
    結果 lerp は均等な結果を
  • 2:58 - 3:00
    返すのに対し slerp は始点と終端近くで遅く
  • 3:00 - 3:03
    中盤で速くなります
  • 3:04 - 3:07
    さて今度もキャラクターとオーブのあるシーンです
  • 3:07 - 3:10
    今回のキャラクターにはスクリプトがアタッチされていません
  • 3:10 - 3:12
    一方のオーブには Gravity スクリプトがアタッチされています
  • 3:13 - 3:15
    このシーンでは slerp と前移動を活用して
  • 3:15 - 3:18
    重力軌道的な移動を実現してみます
  • 3:19 - 3:21
    Gravity スクリプトの構成は先ほどの
  • 3:21 - 3:24
    LookAt スクリプトと似ています
  • 3:24 - 3:26
    今回も target Transform の public フィールドがあり
  • 3:27 - 3:29
    オブジェクトとターゲット間の相対ベクトルを
  • 3:29 - 3:32
    計算します ただし今回は
  • 3:32 - 3:35
    オーブの高さを考慮したオフセットを追加します
  • 3:35 - 3:37
    また今回も LookRotation を計算していますが
  • 3:37 - 3:39
    今回は計算結果をオブジェクトの
  • 3:39 - 3:42
    Transform の回転に格納していません
  • 3:43 - 3:45
    代わりに今回はクォータニオン変数である
  • 3:45 - 3:47
    rotation に格納します
  • 3:47 - 3:49
    そしてオブジェクトの localRotation を
  • 3:49 - 3:52
    クォータニオン変数 Current に格納します
  • 3:53 - 3:55
    その後 slerp 関数を使い オブジェクトが
  • 3:55 - 3:58
    ターゲットの方をゆっくりと向くようにします
  • 3:59 - 4:02
    slerp 関数はまず current の回転を読み
  • 4:02 - 4:04
    最終結果の回転を読み そして
  • 4:04 - 4:06
    補間または向き変更の速度を読みます
  • 4:07 - 4:09
    即時ではなく時間をかけて
  • 4:09 - 4:11
    回転するのがこのサンプルを
  • 4:11 - 4:13
    機能させるカギとなっています
  • 4:14 - 4:16
    そしてオブジェクトがややターゲットの方を向いたところで
  • 4:16 - 4:19
    少しだけオブジェクトを前進させます
  • 4:20 - 4:22
    では Unity に戻ってシーンを実行し
  • 4:22 - 4:23
    結果を確認してみましょう
  • 4:24 - 4:26
    オーブは前進を続けながら
  • 4:26 - 4:28
    ターゲット... 今回はキャラクターのほうを
  • 4:28 - 4:29
    向き続けています
  • 4:29 - 4:33
    きれいな重力軌道が描けましたね
  • 4:34 - 4:36
    さてレッスン最後に見ていくのは
  • 4:36 - 4:38
    Quaternion クラスの identity プロパティです
  • 4:39 - 4:42
    クォータニオンを Quaternion.identity にセットすると
  • 4:42 - 4:44
    そのオイラー角が
  • 4:44 - 4:47
    (0,0,0) または回転なしに設定されます
  • 4:48 - 4:50
    Quaternion クラスにはこの他にもさまざまな関数が
  • 4:50 - 4:53
    あります 詳細は下記リンク先のドキュメントをご覧ください
  • 4:54 - 4:56
    最後に このレッスンで一番覚えておいて欲しい点を改めて
  • 4:56 - 4:58
    クォータニオンは回転を制御する
  • 4:58 - 5:00
    最適な方法で そのコンポーネントは個別に
  • 5:00 - 5:03
    調節してはいけません
  • 5:04 - 5:06
    そうしなくとも大丈夫な機能が
  • 5:06 - 5:08
    かならず用意されているはずですから
Title:
Quaternions - Unity Official Tutorials
Description:

more » « less
Video Language:
English
Duration:
05:11

Japanese subtitles

Revisions