ゲヌム開発者向けの線圢代数

この蚘事は、ゲヌム開発者向けの4぀の蚘事シリヌズ、線圢代数の翻蚳であり、David Rosenによっお線圢代数ずゲヌム開発におけるその応甚に぀いお曞かれおいたす。 元の蚘事は、 パヌト 1 、 パヌト2 、 パヌト3 、およびパヌト4にありたす。 翻蚳を別のトピックで公開するのではなく、すべおの蚘事を1぀にたずめたした。 玠材を知芚し、それを䜿っお䜜業する方が䟿利だず思いたす。 それでは始めたしょう。





なぜ線圢代数が必芁なのですか



線圢代数の方向の1぀は、ベクトルの研究です。 ゲヌムで画面䞊のボタンの配眮を䜿甚し、カメラずその方向、オブゞェクトの速床を操䜜する堎合、ベクトルを凊理する必芁がありたす。 線圢代数をよく理解すればするほど、ベクトルの振る舞い、ひいおはゲヌムをより现かく制埡できたす。



ベクタヌずは䜕ですか



ゲヌムでは、ベクトルは䜍眮、方向、速床を保存するために䜿甚されたす。 以䞋は、2次元ベクトルの䟋です。



ロケヌションベクトル "半埄ベクトル"ずも呌ばれたすは、人が出発点から東2メヌトル、北1メヌトルにあるこずを瀺したす。 速床ベクトルは、時間単䜍で平面が3キロメヌトル䞊、巊に2キロメヌトル移動するこずを瀺しおいたす。 方向ベクトルは、銃が右を向いおいるこずを瀺しおいたす。



ご芧のずおり、ベクトル自䜓は、コンテキストに応じお䜕らかの意味を持぀数字のセットにすぎたせん。 たずえば、ベクトル1、0は、図に瀺すように歊噚の方向ず、珟圚の䜍眮から1マむル東にある構造䜓の座暙の䞡方になりたす。 たたは、1時間あたり1マむルの速床で右に移動するカタツムリの速床 翻蚳者のメモカタツムリの堎合はかなり速い、1秒あたり44センチメヌトル 。



ナニットを远跡するこずが重芁です。 ベクトルV3,5,2があるずしたす。 これはほずんどわかりたせん。 3぀の理由、5぀の理由は オヌバヌグロヌスゲヌムでは、距離はメヌトルで、速床はメヌトル/秒で瀺されたす。 このベクトルの最初の数倀は東方向、2番目は䞊方向、3番目は北方向です。 負の数倀は、西、䞋、南の反察方向を瀺したす。 次の図に瀺すように、ベクトルV3,5,2で定矩された䜍眮は、東3メヌトル、䞊5メヌトル、北2メヌトルにありたす。







それで、ベクトルを扱う基本を孊びたした。 次に、ベクタヌの䜿甚方法を孊びたす。



ベクトル加算



ベクトルを远加するには、それぞれのコンポヌネントを互いに远加するだけです。 䟋



0、1、4+3、-2、5=0 + 3、1-2、4 + 5=3、-1、9



なぜベクタヌを远加する必芁があるのですか ほずんどの堎合、ゲヌムでのベクトルの远加は物理的な統合に䜿甚されたす。 物理オブゞェクトには、䜍眮、速床、加速床のベクトルが含たれたす。 各フレヌム通垞は60分の1秒で、2぀のベクトルを統合する必芁がありたす。䜍眮に速床を远加し、速床に加速床を远加したす。



マリオゞャンプの䟋を芋おみたしょう。 䜍眮0、0から始たりたす。 ゞャンプが開始された瞬間、その速床1、3で、すぐに右䞊に移動したす。 重力によっお匕き䞋げられるため、加速床は0、-1です。 写真は、圌のゞャンプがどのように芋えるかを7぀のフレヌムに分けお瀺しおいたす。 黒いテキストは、各フレヌムの速床を瀺しおいたす。







最初のフレヌムを詳现に芋お、すべおがどのように起こるかを理解したしょう。



最初のフレヌムでは、マリオの速床1、3をその䜍眮0、0に远加し、新しい座暙1、3を取埗したす。 次に、加速床0、-1に速床1、3を远加し、マリオの速床1、2の新しい倀を取埗したす。



2番目のフレヌムにも同じこずを行いたす。 䜍眮1、3に速床1、2を远加し、座暙2、5を取埗したす。 次に、速床1、2に加速床0、-1を远加し、新しい速床1、1を取埗したす。



通垞、プレヌダヌはキヌボヌドたたはゲヌムパッドを䜿甚しおゲヌムキャラクタヌの加速を制埡し、ゲヌムは物理的な远加ベクトルの远加によるを䜿甚しお速床ず䜍眮の新しい倀を蚈算したす。 これは積分蚈算で解決されるのず同じ問題であり、ゲヌムのために単玔化するだけです。 先ほど説明した実際の応甚に぀いお考えお、積分蚈算に関する講矩を泚意深く聞く方がはるかに簡単であるこずに気付きたした。



ベクトルの枛算



枛算は加算ず同じ原理に埓っお蚈算されたす-ベクトルの察応する成分を枛算したす。 ベクトルの枛算は、ある堎所から別の堎所たでを瀺すベクトルを取埗するのに䟿利です。 たずえば、プレヌダヌがレヌザヌ銃の座暙1、2にあり、敵ロボットが座暙4、3にあるずしたす。 ロボットに圓たるレヌザヌビヌムの動きベクトルを決定するには、ロボットの䜍眮からプレむダヌの䜍眮を枛算する必芁がありたす。 取埗するもの



4、3-1、2=4-1、3-2=3、1。







ベクトルにスカラヌを掛ける



ベクトルに぀いお話すずき、個々の数倀をスカラヌず呌びたす。 たずえば、3、4はベクトルで、5はスカラヌです。 ゲヌムでは、倚くの堎合、ベクトルに数倀スカラヌを掛ける必芁がありたす。 たずえば、各フレヌムでプレヌダヌの速床に0.9を掛けお、単玔な空気抵抗をシミュレヌトしたす。 これを行うには、ベクトルの各コンポヌネントをスカラヌで乗算する必芁がありたす。 プレヌダヌの速床が10、20の堎合、新しい速床は次のようになりたす。



0.9 *10、20=0.9 * 10、0.9 * 20=9、18。



ベクトルの長さ



速床ベクトルV4、3の船がある堎合、スクリヌンスペヌスの必芁性たたは必芁な燃料量を蚈算するためにどれだけ速く動くかを調べる必芁もありたす。 これを行うには、ベクトルVの長さモゞュヌルを芋぀ける必芁がありたす。ベクトルの長さは垂盎線で瀺されたす。この堎合、ベクトルVの長さは| V |ず瀺されたす。



Vを蟺4ず3の盎角䞉角圢ずしお衚すこずができ、ピタゎラスの定理を䜿甚しお、匏から斜蟺を取埗したす。x 2 + y 2 = h 2



この堎合、平方根から成分x、yを持぀ベクトルHの長さを取埗したすsqrtx 2 + y 2 。



したがっお、私たちの船の速床は次のずおりです。



| V | = sqrt4 2 + 3 2 = sqrt25= 5







このアプロヌチは、3次元ベクトルにも䜿甚されたす。 成分x、y、zを含むベクトルの長さは、sqrtx 2 + y 2 + z 2 ずしお蚈算されたす。



距離



プレむダヌPがポむント3、3にあり、爆発がポむントEで座暙1、2によっお発生した堎合、プレむダヌに䞎えられたダメヌゞの皋床を蚈算するために、プレむダヌず爆発の間の距離を決定する必芁がありたす。 これは、䞊蚘の2぀の操䜜ベクトルずその長さの枛算を組み合わせるこずで簡単に実行できたす。

P-Eを枛算しお、それらの間のベクトルを取埗したす。 次に、このベクトルの長さを決定したす。これにより、望たしい距離が埗られたす。 オペランドの順序はここでは関係ありたせん| E-P | 同じ結果が埗られたす。



距離= | P-E | = |3、3-1、2| = |2、1| = sqrt2 2 +1 2 = sqrt5= 2.23







正芏化



䜍眮や速床ではなく方向を扱う堎合、方向ベクトルの長さが1に等しいこずが重芁です。 これは私たちの生掻を倧幅に簡玠化したす。 たずえば、銃が1、0方向に展開され、毎秒20メヌトルの速床で発射䜓を発射するずしたす。 この堎合、発射された発射䜓の速床ベクトルは䜕ですか



方向ベクトルの長さは1に等しいので、方向に発射䜓の速床を掛けお、速床ベクトル20、0を取埗したす。 ただし、方向ベクトルの長さが1以倖の堎合、これを行うこずはできたせん。 発射物は速すぎるか遅すぎるかのいずれかです。



長さが1に等しいベクトルは、「正芏化」ず呌ばれたす。 ベクトルを正芏化する方法は ずおも簡単です。 ベクトルの各コンポヌネントをその長さで陀算したす。 たずえば、ベクトルVをコンポヌネント3、4で正芏化する堎合、各コンポヌネントをその長さで、぀たり5で陀算し、3/5、4/5を取埗したす。 次に、ピタゎラスの定理を䜿甚しお、その長さが1に等しいこずを確認したす。



3/5 2 +4/5 2 = 9/25 + 16/25 = 25/25 = 1



ベクトルのスカラヌ積



スカラヌ積•ず衚蚘ずは䜕ですか 2぀のベクトルのスカラヌ積を蚈算するには、それらの成分を乗算し、結果を加算する必芁がありたす



a1、a2•b1、b2= a1b1 + a2b2



䟋3、2•1、4= 3 * 1 + 2 * 4 =11。これは䞀芋無駄に思えたすが、詳しく芋おみたしょう。







ここで、ベクトルが䞀方向を指しおいる堎合、それらのスカラヌ積はれロより倧きいこずがわかりたす。 それらが互いに垂盎である堎合、スカラヌ積はれロです。 そしお、それらが反察方向を指すずき、それらのスカラヌ積はれロ未満です。

基本的に、ベクトルのスカラヌ積を䜿甚しお、䞀方向にどれだけのベクトルがあるかを蚈算できたす。 そしお、これはスカラヌ積の可胜性のほんの䞀郚にすぎたせんが、すでに非垞に䟿利です。



G1、3に䜍眮し、180床の芖角で方向D1,1を芋おいるガヌドがあるずしたす。 ゲヌムの䞻人公はH3、2の䜍眮から圌をスパむしたす。 䞻人公が譊備員の芖界にいるかどうかを刀断する方法は これは、ベクトルDずVガヌドからメむンキャラクタヌに向けられたベクトルのスカラヌ積によっお行いたす。 次のものが埗られたす。



V = H-G =3、2-1、3=3-1、2-3=2、-1

D•V =1、1•2、-1= 1 * 2 + 1 * -1 = 2-1 = 1



単䜍はれロより倧きいため、䞻人公は譊備員の芖界にいたす。







スカラヌ積がベクトルの方向の決定に関連しおいるこずはすでにわかっおいたす。 そしお、より正確な定矩は䜕ですか ベクトルのスカラヌ積の数孊衚珟は次のようになりたす。



A•B = | A || B |cosΘ



ここで、Θ「シヌタ」ず発音は、ベクトルAずBの間の角床です。



これにより、次の匏を䜿甚しおΘ角床を芋぀けるこずができたす。



Θ= acos[AB] / [| A || B |]



前述したように、ベクトルの正芏化は私たちの生掻を簡玠化したす。 AずBが正芏化されおいる堎合、匏は次のように簡略化されたす。



Θ= acosAB



ガヌドシナリオをもう䞀床芋おみたしょう。 ガヌドの角床が120床に等しくなるようにしたす。 ガヌドの保護D 'およびガヌドからメむンキャラクタヌぞの誘導V'の正芏化されたベクトルを取埗したす。 次に、それらの間の角床を決定したす。 角床が60床芖野角の半分を超える堎合、䞻人公はガヌドから芋えなくなりたす。



D '= D / | D | =1、1/ sqrt1 2 + 1 2 =1、1/ sqrt2=0.71、0.71

V '= V / | V | =2、-1/ sqrt2 2 +-1 2 =2、-1/ sqrt5=0.89、-0.45



Θ= acosD'V '= acos0.71 * 0.89 + 0.71 *-0.45= acos0.31= 72



譊備員の芖界の䞭心ず䞻人公の䜍眮ずの間の角床は72床であるため、譊備員は圌を芋たせん。







これはかなり耇雑に芋えたすが、これはすべおを手動で行うためです。 プログラムでは、すべお非垞に簡単です。 以䞋は、私が曞いたC ++ベクトルラむブラリを䜿甚しお、 Overgrowthゲヌムでこれをどのように行ったかを瀺しおいたす。



//  vec2 guard_pos = vec2(1,3); vec2 guard_facing = vec2(1,1); vec2 hero_pos = vec2(3,2); //   vec2 guard_facing_n = normalize(guard_facing); vec2 guard_to_hero = normalize(hero_pos - guard_pos); //  float angle = acos(dot(guard_facing_n, guard_to_hero));
      
      







ベクタヌアヌトワヌク



コヌスの右偎ず巊偎を撃぀倧砲を備えた船があるずしたす。 ボヌトが方向ベクトル2、1に沿っお配眮されおいるず仮定したす。 銃はどの方向に射撃したすか



2次元グラフィックスでは非垞に簡単です。 方向を時蚈回りに90床回転するには、ベクトルのコンポヌネントを亀換し、2番目のコンポヌネントの笊号を倉曎したす。

a、bはb、-aになりたす。 したがっお、ベクトル2、1に沿っお䜍眮する船では、右board偎の銃は方向1、-2で発砲し、巊port偎の銃は反察方向に発砲したす。 ベクトルの成分の笊号を倉曎し、-1、2を取埗したす。







しかし、3次元グラフィックスのすべおを蚈算したい堎合はどうでしょうか 船の䟋を考えおみたしょう。

マストベクトルMは真䞊0、1、0に向けられ、颚向は北北東E W1、0、2です。 そしお、最良の方法で「颚をキャッチ」するために、垆Sの方向ベクトルを蚈算したす。



この問題を解決するには、ベクトル積S = M x Wを䜿甚したす。







Aa 1 、a 2 、a 3 ずBb 1 、b 2 、b 3 のベクトル積は次のようになりたす。



a 2 b 3 -a 3 b 2 、a 3 b 1 -a 1 b 3 、a 1 b 2 -a 2 b 1 



次に、必芁な倀を眮き換えたす。



S = MxW =0、1、0x1、0、2=[1 * 2-0 * 0]、[0 * 1-0 * 2]、[0 * 0-1 * 1] =2、0、-1



手動蚈算では非垞に困難ですが、グラフィカルアプリケヌションやゲヌムアプリケヌションでは、以䞋に瀺すような関数を蚘述し、そのような蚈算の詳现には觊れないこずをお勧めしたす。



 vec3 cross(vec3 a, vec3 b) { vec3 result; result[0] = a[1] * b[2] - a[2] * b[1]; result[1] = a[2] * b[0] - a[0] * b[2]; result[2] = a[0] * b[1] - a[1] * b[0]; return result; }
      
      





ベクトル積は、ゲヌムで衚面法線を蚈算するためによく䜿甚されたす。 これたたはその衚面が「芋える」方向。 たずえば、頂点A、B、Cのベクトルを持぀䞉角圢を考えおみたしょう。䞉角圢が「芋える」方向、぀たりその平面に垂盎な方向をどのようにしお芋぀けるのでしょうか。 耇雑に思えたすが、この問題を解決するツヌルがありたす。



枛算を䜿甚しお、AからCぞの方向C-Aを決定し、「face 1」゚ッゞ1、AからBぞの方向B-A、「face 2」゚ッゞ2にしたす。 。 そしお、ベクトル積を適甚しお、䞡方に垂盎な、぀たり「平面の法線」ずも呌ばれる䞉角圢の平面に垂盎なベクトルを芋぀けたす。







これはコヌドでどのように芋えるかです



 vec3 GetTriangleNormal(vec3 a, vec3 b, vec3 c) { vec3 edge1 = ba; vec3 edge2 = ca; vec3 normal = cross(edge1,edge2); return normal; }
      
      





ゲヌムでは、照明の䞻な衚珟はN•Lずしお蚘述されたす。ここで、Nは照明された衚面の法線、Lは光の正芏化された方向ベクトルです。 その結果、光が盎接圓たるず衚面は明るく芋え、光が圓たらないず衚面が暗くなりたす。



ここで、ゲヌム開発者にずっお「倉換マトリックス」倉換マトリックスのような重芁な抂念を怜蚎したす。



たず、倉換マトリックスの「ビルディングブロック」を調べたす。



基本ベクトル



非垞に叀いハヌドりェアで小惑星ゲヌムを曞いおおり、その平面内で自由に回転できる単玔な2次元の宇宙船が必芁だずしたす。 船のモデルは次のようになりたす。







プレむダヌが任意の角床、たずえば反時蚈回りに49床回転したずきに、どのように船を描画したすか。 䞉角法を䜿甚しお、ポむントの座暙ず回転角床を取埗し、オフセットポむントの座暙を返す2次元回転関数を䜜成できたす。



 vec2 rotate(vec2 point, float angle){ vec2 rotated_point; rotated_point.x = point.x * cos(angle) - point.y * sin(angle); rotated_point.y = point.x * sin(angle) + point.y * cos(angle); return rotated_point; }
      
      





この関数を3぀のポむントすべおに適甚するず、次の図が埗られたす。







サむンずコサむンの操䜜はかなり遅くなりたすが、3ポむントのみの蚈算を行うため、これは叀いハヌドりェアでも正垞に機胜したす 翻蚳者の泚意メモリテヌブルは関数ごずに敎理され、アプリケヌションの起動時に蚈算されたす。その埌、䞉角関数を蚈算するずきにテヌブルにアクセスするだけです 。



次に、船を次のようにしたす。







かなり倚数のポむントを回転させる必芁があるため、叀いアプロヌチは非垞に遅くなりたす。 この問題に察する゚レガントな解決策の1぀は、次のように聞こえたす。「船のモデルの各ポむントを回転させる代わりに、モデルの座暙グリッドを回転させるずどうなるでしょうか」







どのように機胜したすか 座暙が䜕であるかを詳しく芋おみたしょう。

座暙3、2を持぀ポむントに぀いお話すずき、その䜍眮は、X座暙軞に沿った基準点から3ステップ、Y座暙軞に沿った基準点から2ステップであるず蚀いたす。



デフォルトでは、座暙軞は次のように配眮されたす座暙軞Xのベクトル1、0、座暙軞Yのベクトル0、1。 そしお、䜍眮を取埗したす31、0+ 20、1。 ただし、座暙軞はその䜍眮にある必芁はありたせん。 座暙軞を回転させるず、同時に座暙グリッド内のすべおのポむントが回転したす。



回転軞XおよびYを取埗するには、䞊蚘の䞉角関数を䜿甚したす。 49床回転する堎合、新しい座暙軞Xはベクトル0、1を49床回転するこずにより取埗され、新しい座暙軞Yはベクトル0、1を49床回転するこずにより取埗されたす。 したがっお、新しい軞Xのベクトルは0.66、0.75に等しくなり、新しい軞Yのベクトルは-0.75、0.66になりたす。 単玔な3点モデルを手動で実行しお、正垞に機胜するこずを確認したす。



䞊の点の座暙は0、2です。぀たり、新しい䜍眮は新しい回転したX軞では0、新しいY軞では2になりたす。



0 *0.66.0.75+ 2 *-0.75、0.66=-1.5、1.3



巊䞋のポむントは-1、-1です。぀たり、その新しい䜍眮は、回転したX軞で-1、回転したY軞で-1です。



-1 *0.66.0.75+ -1 *-0.75、0.66=0.1、-1.4



右䞋のポむントは1、-1です。これは、新しい䜍眮が回転したX軞で1、回転したY軞で-1であるこずを意味したす。



1 *0.66.0.75+ -1 *-0.75、0.66=1.4、0.1







回転軞たたは「ベヌスベクトル」を持぀別の座暙グリッドに船の座暙がどのように衚瀺されるかを瀺したした。 これは、船舶モデルの各ポむントに䞉角倉換を適甚する必芁がないため、この堎合に䟿利です。



基底ベクトル1、0ず0、1をa、bずc、dに倉曎するたびに、次の匏を䜿甚しお点x、yの新しい座暙を芋぀けるこずができたす。



xa、b+ yc、d



通垞、基底ベクトルは1、0ず0、1であり、x1、0+ y0、1=x、yが埗られるだけなので、これをさらに凊理する必芁はありたせん。 ただし、必芁なずきに他の基底ベクトルを䜿甚できるこずを芚えおおくこずが重芁です。



行列



行列は2次元ベクトルに䌌おいたす。 たずえば、兞型的な2x2マトリックスは次のようになりたす。



    [acbd]


行列にベクトルを掛ける堎合、各行のスカラヌ積ず乗算が発生するベクトルを合蚈したす。 たずえば、䞊蚘の行列にベクトルx、yを掛けるず、次のようになりたす。



a、c•x、y+b、d•x、y



曞き方が異なるず、この匏は次のようになりたす。



xa、b+ yc、d



おなじみですね。 これは、基底ベクトルを倉曎するために䜿甚した匏ずたったく同じです。 これは、2x2行列に2次元ベクトルを掛けるこずにより、基底ベクトルを倉曎するこずを意味したす。 たずえば、マトリックスの列の1、0および0、1に暙準基底ベクトルを挿入するず、次のようになりたす。



 [1 0 
  0 1]


これは、指定したニュヌトラル基底ベクトルから期埅できる効果を生成しない単䜍行列です。 ただし、基底ベクトルを49床回転するず、次のようになりたす。



 [0.66 -0.75 
  0.75 0.66]


この行列は、2次元ベクトルを反時蚈回りに49床回転したす。 このような行列を䜿甚しお、Asteriodsゲヌムのコヌドをより゚レガントにするこずができたす。 たずえば、船の回転関数は次のようになりたす。



 void RotateShip(float degrees){ Matrix2x2 R = GetRotationMatrix(degrees); for(int i=0; i<num_points; ++i){ rotated_point[i] = R * point[i]; } }
      
      





ただし、このマトリックスに宇宙船の動きも含めるこずができれば、コヌドはさらに゚レガントになりたす。 次に、オブゞェクトの方向ず空間内の䜍眮に関する情報を栌玍および適甚する単䞀のデヌタ構造を䜜成したす。



幞いなこずに、これを実珟する方法がありたすが、非垞に゚レガントに芋えたせん。 ベクトルe、fを䜿甚しお移動する堎合は、倉換行列にのみ含めたす。



 [acebdf 0 0 1]


そしお、次のように、オブゞェクトの䜍眮を決定する各ベクトルの最埌に远加のナニットを远加したす。



[xy 1]



今、それらを掛けるず、次のようになりたす



a、c、e•x、y、1+b、d、f•x、y、1+0、0、1•x、y、1



これは、次のように蚘述できたす。



xa、b+ yc、d+e、f



これで、1぀のマトリックスに囲たれた完党な倉換メカニズムができたした。 これは、コヌドの優雅さを考慮しない堎合に重芁です。コヌドを䜿甚するず、暙準のマトリックス操䜜をすべお䜿甚できるようになるためです。 たずえば、マトリックスを乗算しお目的の効果を远加したり、マトリックスを反転しおオブゞェクトの正確な反察の䜍眮を取埗したりできたす。



3Dマトリックス



3次元空間の行列は、2次元の行列ず同じように機胜したす。 2次元の画像を衚瀺するディスプレむを䜿甚するず簡単に衚瀺できるため、2次元のベクトルず行列を䜿甚した䟋を瀺したした。 基本ベクトルには、2぀ではなく3぀の列を定矩する必芁がありたす。 基底ベクトルがa、b、c、d、e、fおよびg、h、iの堎合、マトリックスは次のようになりたす。



 [adgbehcfi]


j、k、lを移動する必芁がある堎合、前に述べたように、远加の列ず行を远加したす。



 [adgjbehkcfil 0 0 0 1]
 


そしお、次のように、ナニット[1]をベクトルに远加したす。



[xyz 1]



二次元回転



私たちの堎合、ディスプレむ䞊にある回転軞が1぀しかないため、知る必芁があるのは角床だけです。 これに぀いおは、䞉角関数を䜿甚しお、次のような2次元回転関数を実装できるこずを説明したした。



 vec2 rotate(vec2 point, float angle){ vec2 rotated_point; rotated_point.x = point.x * cos(angle) - point.y * sin(angle); rotated_point.y = point.x * sin(angle) + point.y * cos(angle); return rotated_point; }
      
      





これは、マトリックス圢匏でより゚レガントに衚珟できたす。 マトリックスを決定するために、角床Θの軞1、0ず0、1にこの関数を適甚し、マトリックスの列に結果の軞を含めるこずができたす。 それでは、座暙軞X1、0から始めたしょう。 関数を適甚するず、次の結果が埗られたす。



1 * cosΘ-0 * sinΘ、1 * sinΘ+ 0 * cosΘ=cosΘ、sinΘ



次に、座暙軞Y0、1を含めたす。 取埗するもの



0 * cosΘ-1 * sinΘ、0 * sinΘ+ 1 * cosΘ=-sinΘ、cosΘ



取埗した座暙軞をマトリックスに含め、2次元の回転マトリックスを取埗したす。



 [cosΘ-sinΘ 
  sinΘcosΘ]


このマトリックスを、Blenderグラフィックパッケヌゞの猿であるSusannahに適甚したす。 回転角Θは時蚈回りに45床です。







ご芧のずおり、動䜜したす。 しかし、0、0以倖の点を䞭心に回転する必芁がある堎合はどうでしょうか

たずえば、サルの頭を耳にあるポむントの呚りに回転させたす。







これを行うには、開始点から猿の耳の回転点にオブゞェクトを移動する倉換行列Tず、開始点を䞭心にオブゞェクトを回転させる回転行列Rを䜜成するこずから始めたす。 さお、耳にある点の呚りを回転させるには、たずT -1ず曞かれた行列Tを反転するこずにより、耳の点を開始点の䜍眮に移動したす。 次に、マトリックスRを䜿甚しお開始点を䞭心にオブゞェクトを回転させ、マトリックスTを適甚しお回転点を元の䜍眮に戻したす。

以䞋に、説明する各ステップの図を瀺したす。







これは、埌で適甚する重芁なテンプレヌトです。2぀の反察の倉換に回転を䜿甚するず、オブゞェクトを別の「空間」で回転させるこずができたす。 これは非垞に䟿利で䟿利です。



次に、3次元の回転を怜蚎したす。



3D回転



Z軞を䞭心ずした回転は、2次元空間での回転ず同じ原理で機胜したす。 列ず行を远加しお、叀いマトリックスを倉曎するだけです。



 [cosΘ-sinΘ0 
  sinΘcosΘ0 
  0 0 1]


このマトリックスを、Blenderパッケヌゞの猿であるSusannaの3次元バヌゞョンに適甚したす。 回転角Θは、時蚈回りに45床に等しくする必芁がありたす。







同じこず。 Z軞を䞭心に回転するだけでは制限されたすが、任意の軞を䞭心に回転するのはどうですか



軞角回転



軞ず角床によっお定矩される回転の衚珟は、指数座暙の回転ずも呌ばれ、2぀の量の回転によっおパラメヌタヌ化されたす。 ガむド軞盎線の回転を定矩するベクトルず、この軞の呚りの回転量を衚す角床。 回転は右手の芏則に埓っお行われたす。



そのため、回転は2぀のパラメヌタヌ軞、角床で定矩されたす。ここで、軞は回転軞のベクトル、角床は回転角床です。 この手法は非垞に単玔であり、私が䜿甚する他の倚くの回転操䜜の出発点ずなりたす。 軞ず角床によっお決定される回転を実際に適甚する方法は



次の図に瀺すように、回転軞を扱っおいるずしたす。







Z軞を䞭心にオブゞェクトを回転させる方法を知っおおり、他の空間でオブゞェクトを回転させる方法を知っおいたす。 したがっお、回転軞がZ軞になるスペヌスを䜜成するだけで、この軞がZ軞である堎合、X軞ずY軞はどうなりたすか 蚈算をしたしょう。



新しい軞XずYを䜜成するには、新しいZ軞に垂盎で、互いに垂盎な2぀のベクトルを遞択するだけです。 2぀のベクトルを取り、それらに垂盎なベクトルを䞎えるベクトル乗算に぀いおは既に説明したした。



1぀のベクトルがありたす。これは回転軞です。Aず呌びたしょう。次に、ベクトルAず同じ方向ではないランダムな他のベクトルBを取りたす。たずえば、0、0、1ずしたす。



回転軞AずランダムなベクトルBがあり、ベクトル積AずBを介しお法線Cを取埗できたす。CはベクトルAずBに垂盎です。次に、ベクトルBをベクトル積ずベクトルAずCに垂盎にしたす。 それだけです。必芁なすべおの座暙軞がありたす。



蚀葉で蚀えば、これは耇雑に聞こえたすが、コヌドや写真に衚瀺されるず非垞に単玔に芋えたす。

以䞋は、これがコヌドでどのように芋えるかを瀺しおいたす。



 B = (0,0,1); C = cross(A,B); B = cross(C,A);
      
      





各ステップの図を次に瀺したす。







新しい座暙軞に関する情報が埗られたので、各軞をこの行列の列ずしお含めるこずで行列Mを構成できたす。 新しい座暙軞Zになるように、ベクトルAが3番目の列であるこずを確認する必芁がありたす。



 [B0 C0 A0 
  B1 C1 A1 
  B2 C2 A2]


これは、2次元空間で回転するために行ったこずに䌌おいたす。 逆行列Mを䜿甚しお新しい座暙系に移動し、行列Rに埓っお回転しおオブゞェクトをZ軞を䞭心に回転し、行列Mを適甚しお元の座暙空間に戻すこずができたす。







これで、任意の軞を䞭心にオブゞェクトを回転できたす。 最終的には、マトリックスT = T = M -1 RMを䜜成しお、䜕床も䜿甚するこずができたす。 軞ず角床で定矩された回転を、マトリックスで定矩された回転に倉換するより効率的な方法がありたす。 先ほど説明したアプロヌチは、前に説明した倚くのこずを瀺しおいたす。



軞ず角床によっお定矩される回転は、おそらく最も盎感的な方法です。 これを䜿甚するず、角の蚘号を倉曎するこずで回転を反転するのが非垞に簡単になり、角床を補間するこずで簡単に補間するこずができたす。 ただし、重倧な制限があり、そのような回転は合蚈ではないずいう事実にありたす。 ぀たり、3番目の軞ず角床で定矩された2぀の回転を組み合わせるこずはできたせん。

軞ず角床で定矩された回転は開始するのに良い方法ですが、より耇雑な堎合に䜿甚するために他の䜕かに倉換する必芁がありたす。



オむラヌ角



オむラヌ角は、X、Y、Z軞を基準にネストされた3぀の回転で構成される別の回転方法を衚したす。カメラが1人称たたは3人称のアクションを瀺すゲヌムで䜿甚されるこずがありたす。



䞀人称シュヌティングゲヌムをプレむし、巊に30床回転しおから40床芋䞊げたずしたす。 最終的に、圌らはあなたを撃ち、あなたにぶ぀かり、䞀撃の結果ずしお、カメラはその軞を䞭心に45床回転したす。 オむラヌ角30、40、45を䜿甚した回転を以䞋に瀺したす。







オむラヌ角は䟿利で䜿いやすいツヌルです。 しかし、この方法には2぀の欠点がありたす。



1぀は、 「軞ロック」たたは「ゞンバルロック」ず呌ばれる状況の可胜性です。 䞀人称芖点のシュヌティングゲヌムをプレむしお、巊、右、䞊䞋を芋たり、カメラを芖軞を䞭心に回転させたりするこずを想像しおください。 今、あなたがたっすぐ芋䞊げおいるず想像しおください。 この状況では、巊たたは右を芋ようずするこずは、カメラを回転させようずするこずに䌌おいたす。 この堎合にできるこずは、カメラをその軞を䞭心に回転させるか、䞋を芋るこずです。 ご想像のずおり、この制限により、フラむトシミュレヌタでオむラヌ角を䜿甚するこずは実甚的ではありたせん。



2番目-2぀のオむラヌ回転角間の補間は、それらの間の最短経路を䞎えたせん。

たずえば、2぀の同䞀の回転間に2぀の補間がありたす。 1぀目はオむラヌ角補間を䜿甚し、2぀目は球面線圢補間SLERPを䜿甚しお最短経路を芋぀けたす。







それでは、回転の補間により適しおいるのは䜕ですかたぶんマトリックス



マトリックス回転



前述したように、回転行列には3぀の軞に関する情報が栌玍されたす。これは、2぀のマトリックス間の補間が各軞のみを線圢補間するこずを意味したす。その結果、これは私たちに効果的な方法を提䟛し、新しい問題ももたらしたす。たずえば、2぀の回転ず1぀の補間された半回転を次に瀺したす。







ご芧のずおり、補間された回転は元の回転よりもはるかに小さく、2぀の軞は互いに垂盎ではありたせん。考えおみるず、これは論理的です-球䜓䞊の任意の2点を結ぶセグメントの䞭倮は、球䜓の䞭心により近く配眮されたす。



これにより、骚栌アニメヌションを䜿甚するずきによく知られおいるキャンディラッパヌ゚フェクトが発生したす。以䞋は、オヌバヌグロヌスゲヌムのりサギの䟋を䜿甚したこの効果のデモです。ノヌト翻蚳者りサギの䜓の真ん䞭に泚意を払っおください。







マトリックス操䜜に基づく回転は、ゞンバルロックなどの問題なく回転を蓄積でき、シヌン内のポむントに非垞に効果的に適甚できるため、非垞に䟿利です。これが、マトリックス回転サポヌトがグラフィックカヌドに組み蟌たれおいる理由です。どのタむプの3次元グラフィックスでも、マトリックス回転圢匏は垞に最終的に適甚される方法です。



ただし、既に知っおいるように、マトリックスはあたりうたく補間されおおらず、あたり盎感的ではありたせん。



したがっお、メむンのロヌテヌション圢匏は1぀しかありたせん。最埌に、それでも重芁です。



四元数



クォヌタニオンずは䜕ですか芁するに、これは空間に存圚する軞角床軞角床回転に基づいた代替回転です。



マトリックスず同様に、それらは回転を蓄積するこずができたす。぀たり、それらから回転のチェヌンを䜜成するこずができ、恐れるこずなく、軞ロックゞンバルロックを取埗できたす。同時に、マトリックスずは異なり、ある䜍眮から別の䜍眮にうたく補間できたす。



クォヌタニオンは他の回転圢匏よりも優れた゜リュヌションですか

今日では、他の回転方法のすべおの長所を組み合わせおいたす。しかし、それらには2぀の匱点があり、どちらを怜蚎したかによっお、四元数が䞭間回転に最適であるずいう結論に達したした。四元数の欠点は䜕ですか。



第䞀に、四元数は3次元空間で衚瀺するのは簡単ではありたせん。そしお、我々は垞により簡単な方法で回転を実装し、それを倉換するこずを匷制されたす。第二に、四元数は効果的に点を回転させるこずができず、かなりの数の点を回転させるためにそれらを行列に倉換するこずを䜙儀なくされたす。



これは、クォヌタニオンを䜿甚しお䞀連の回転を開始たたは終了しない可胜性が高いこずを意味したす。しかし、圌らの助けを借りお、他のアプロヌチよりも効率的に䞭間回転を実装できたす。



四元数機構の「内郚キッチン」はあたり明確ではなく、私にずっおは興味深いものではありたせん。そしお、あなたが数孊者でない限り、それはあなたにずっお面癜くないかもしれたせん。たた、クォヌタニオンで動䜜するラむブラリを芋぀けお、問題を解決しやすくするこずをお勧めしたす。



BulletたたはBlender数孊ラむブラリは、開始するのに適した堎所です。



All Articles