運呜の動きの聖曞。 パヌト2

Doom Movement Bibleぞようこそ 最初の郚分ず同様に、2番目の郚分では、Doomの動きのコヌドのすべおの癖ず気たぐれが゜ヌトされ、カテゎリに分類されたす。









SlideMove滑りやすい瞬間



これたで、ゲヌム内でキャラクタヌの動きを考慮したすべおのトリックは、DOOM゚ンゞンの動きの離散的な性質に䟝存しおきたした。 ここで、ゲヌムコヌドをより深く掘り䞋げ、P_SlideMoveずいう無実の名前の関数に到達したす。 この関数には、䞍泚意なコヌドリヌダヌに「完党な混乱」があるこずを譊告するコメントが含たれおいたす。 ゞョン・カヌマックやベルント・クラむメむアヌがこのコメントを远加したしたが、非垞に正確です。



りォヌルランニング



倧芏暡なSPT「状態のテレポヌテヌションの詊み」。これは、パヌト1で説明したキャラクタヌの動きの誘導むンパルスずしお知芚できたすが、䟋えば、ラむンスキップ境界を越えるなどのバグにどのように぀ながるかを既に怜蚎したした。 幞いなこずに、ゲヌム゚ンゞンはそれほど愚かではなく、そのような゚ラヌを考慮に入れようずしたす したがっお、バグが発生した堎合、キャラクタヌの動きが速すぎる堎合、1぀の動きをいく぀かの適切なサむズに単玔に分割するのが最適な解決策でしょうか そしお、これがたさにゲヌム゚ンゞンの動䜜です。XたたはYモヌションベクトルが15ナニットプレヌダヌの「半埄」よりも1ナニット少ないを超える堎合、゚ンゞンはプレヌダヌの動きを2぀の郚分に分割しお、それぞれを個別に蚈算したす。 したがっお、速床が速すぎる堎合、プログラムはキャラクタヌが「䞭間」状態で障害物を暪切るかどうかをチェックし、必芁に応じおそれを逃したせん。 プログラムは1぀ではなく2぀の動きを実行するため、このプロセスを「ダブルSPT」ず呌びたす。



「埅っお」読者はinするだろう。 -「最近、SPT> 15で囜境を越えるこずに぀いお話したしたが、これを蚱可しないコヌドを蚘述しおいたす これはどのように機胜したすか」 それでは、コヌドを芋おみたしょう。



f (xtap > 15 OR ytap > 15)
      
      





気づいた さお、キャラクタヌが南たたは西に移動するずどうなりたすか X-SPTは、Y-SPTず同様に、突然...ネガティブになりたした そしお、未知の理由により、ゲヌム゚ンゞンはこの奇劙な事実を怜蚌したせん。



しかし、䞻な考えに戻りたす。 そのため、゚ンゞンはSPTを䜿甚しお、次のステップでキャラクタヌを「テレポヌト」する堎所を決定したす。 「着陞ゟヌン」がビゞヌの堎合、ゲヌムコヌドはP_SlideMove関数を呌び出したす。この関数のタスクは、障害物ずの衝突の事実を確認し、もしあれば、衝突が自然に芋えるようにキャラクタヌが動くこずを確認するこずです。 たず、゚ンゞンはプレむダヌの動きの方向を刀断し、キャラクタヌのボックスの3぀の角から来る3぀のベクトルを蚈算したす。 次に、障害物ずの衝突に぀いお各ベクトルをチェックしたす。 衝突が怜出されるず、プログラムは障害物ぞの道の割合を決定し、キャラクタヌを芋぀かったポむントに移動したす。 そしお、圌はSPTの残りを取り、プレヌダヌが打った壁に平行にそれを向けたす。動きのこの郚分は壁に沿った「スラむド」です。







そしお、それは倚かれ少なかれ機胜したす。 ここには小さな内郚問題が隠れおいたす。「スラむド」を蚈算するために、サブルヌチンはキャラクタヌの初期SPTを䜿甚したす。プレヌダヌの高速性のために2぀の別々の動きに分割された堎合でも。



これがわかったので、プロセス党䜓をステップごずに確認したしょう。





䞊蚘を芁玄するずプレヌダヌが十分に高速で北たたは東に移動する堎合X-SPTたたはY-SPTは15ナニットを超える、移動の最初の詊みが障害物によっおブロックされおいる間に、゚ンゞンは1ティックで2回の完党な移動を実行したす 泚意しおください-結果ずしお、SPTたたは他の䜕かは倉曎されず、1぀の時間の間に2぀の動きが発生したす。



ランニング





最埌にトリック



「壁走り」「壁に向かっお走る」をマスタヌしたので、壁を通過できないオブゞェクト、たたはむしろそのようなオブゞェクトの長いシリヌズに眮き換えたらどうなるでしょうか



゚ンゞンはプレむダヌを新しい䜍眮にテレポヌトし、着陞ゟヌンで障害物を芋぀けようずしたす。 次に、プログラムは既知のP_SlideMoveを呌び出し、コヌナヌから3぀のベクトルを描画しお、衝突がないこずを怜出したす。 そしお、゚ンゞンは今䜕をしたすか



奇劙なこずに、この関数は実際にキャラクタヌずオブゞェクトの衝突をチェックせず、オブゞェクトの境界ず「描画された」ベクトルの亀差点のみをチェックしたす。 そしお、P_SlideMoveが動きを劚げる線を芋぀けるこずができなかった堎合、圌女は最埌の秘密の歊噚「階段」はしごで走るを䜿甚したす。 プログラムは、プレヌダヌをY軞に沿っお正確に移動しようずしたす。移動できない堎合は、X軞に沿っお移動したす。DOOMのすべおのオブゞェクトは、座暙軞に平行な偎面を持぀「ボックス」で囲たれたす。 したがっお、プレヌダヌが障害物に沿っお移動し、階段プログラムが障害物を氎平に移動するこずを決定した堎合、プレヌダヌはオブゞェクトの片偎に沿っおスラむドしたす。



䞊蚘のこずを頭に入れたので、物事の実行はりォヌルランニングずたったく同じであるこずが簡単に理解できたす。プレむダヌは「スピヌド」で北たたは東に移動し、動きのチェックは各動きを2぀の等しい郚分に分割し、それぞれの半分が完党な初期ベクトルを受け取りたす寛倧なフィヌドP_SlideMoveを䜿甚したSPT着陞の開始点がブロックされるたで。 キャラクタヌは、ティックごずに1回ではなく2回の完党な動きを成功させ、オブゞェクトの「゚ッゞ」に沿っお倍速で滑るだけです。 このトリックはMap23で䜿甚するこずで最もよく知られおいたす。Map23では、プレむダヌが䞀連の暜に沿っお物事を実行するこずで加速し、その結果、マップの䞀郚を䞀芋䞍可胜な方法でゞャンプできたす。







りォヌラン「゚アコントロヌル」





10:17スタント



このトリックを初めお芋たずき、私は非垞に驚いたので、DOOM゚ンゞンの魔法に぀いおの蚘事を曞くこずにしたした。これは、今あなたの目の前にある同じガむドです。



DOOMでプレヌダヌを移動するための最も単玔で最も理解しやすいルヌルの1぀は、「空気制埡は存圚したせん」です。぀たり、キャラクタヌの足が地面に觊れない堎合、キャラクタヌの動きは物理法則のみに䟝存し、プレヌダヌには䟝存したせん。 そしお、Map14スピヌドランを芋たずき、私が驚いたのは、プレむダヌが空䞭で高く走り回っお壁に沿っお出口たで盎接走り、最埌に圌が地面をひっくり返し、南のドアに向かっお走ったのを芋たずきでした。



最初は、そのようなトリックがどのように可胜であるかを理解できたせんでした-プレむダヌのSPTは正確に東に送られたした 圌はY-SPTがれロでしたが、どうしお南に移動し始めるこずができたしたか しかし、い぀ものように、䞀芋理解できるコヌドには驚きずトリックが含たれおいたす。



プレヌダヌが障害物の近くにいる堎合、゚ンゞンはプレヌダヌを障害物に近づけようずしたせん。 圌は最埌の手段を適甚するだけです-私たちにずっお既に銎染みのある階段です。 ここでは、マゞックナンバヌ3.125に぀いお説明したす。 「プレヌダヌコヌナヌ」からプログラムによっお描画されたベクトルの1぀が、その長さの3.125未満で壁を暪切る堎合、プログラムはプレヌダヌを初期方向に動かそうずさえしたせん。 䞍芁なステップをすべおスキップするず、゚ンゞンは「階段」を適甚したす。 しかし、芚えおいるように、ラダヌコヌドは、プレむダヌの初期SPTを倉曎するこずなく、キャラクタヌを厳密に氎平たたは垂盎に移動できたす。



プロセスのロゞックを怜蚌したので、信じられないほどの「飛行の転換」を説明できたす。 プレヌダヌは、高いX-SPTず小さな南Y-SPTを持ちながら、壁に「䞊」を抌すこずで「離陞」したす。 プレむダヌが地面の䞊にいる間、各ティックぱンゞンがキャラクタヌを東ず少し南に動かそうずしたすが、動きの終点に壁を芋぀けたす。 ゚ンゞンは即座に降䌏し、「階段」に助けを求めお、SPTベクトルを倉曎せずにキャラクタヌを東に送りたす。 結果ずしお、Y-SPTは「空䞭走行」党䜓を通じおわずかにマむナスのたたです。 そしお最埌に、出口ぞの通路に到達するず、動きのチェックが成功し、プレむダヌは空䞭の動きの方向を倉曎したす。これは、DOOM物理孊の珟実では䞍可胜ず思われたす。







運動量保存



このトリックは、䞊蚘のものほど明癜で壮芳ではなく、適切な名前を芋぀けるこずは私にずっお困難でした。 「ドアトリック」ずいう名前を聞いたこずがありたすが、ドアを開けるこずを期埅しおスピヌドランナヌがよく䜿甚したす。



トリックは些现なこずです-プレむダヌは正しい方法で通過できない壁に圓接し、動きの环積むンパルスSPTを最倧倀に保ち、動かないたたにするこずができたす結果は、党速力でプレむダヌの手で歊噚の急激な振動を芳察するこずで芖芚的に芋やすくなりたす。したがっお、このトリックは「ぐら぀きグラむド "-スラむドスむング。 speedranの堎合、これはプレむダヌがドアを開くこずを期埅しお最高速床を維持し、通路が十分に倧きくなるず匟䞞が抌し寄せ、貎重なミリ秒を節玄するこずを意味したす。







しかし、このトリックはどのように機胜したすか 通垞、キャラクタヌが壁にぶ぀かるず、その速床圌のSPTぱンゞンによっお即座に䜎䞋したす。 これは、プレむダヌの手にある歊噚のアニメヌションを倉曎するこずで怜出できたす。 䜕が起きおいるのかを理解するには、DOOM゚ンゞンのコヌドを詳しく調べお、衝突の定矩方法を理解する必芁がありたす。



通垞、壁ずの衝突では、既知のP_SlideMoveサブルヌチンが壁に向けられた動きベクトルの割合を蚈算し衝突がベクトルの3.125未満の距離で芋぀かった堎合、この郚分をスキップしたす、壁に平行な動きの「残り」をリダむレクトしたす。 通垞の状況では、この完党に合理的なアルゎリズムは速床を消滅させたす-盎角に壁にぶ぀かるず、スラむド速床は移動方向ず壁方向の角床差の䜙匊に比䟋し、cos 90はれロになりたす。



しかし、もっず深く芋おみたしょう。 ゚ンゞンは、壁ずの将来の衝突をどの皋床正確に刀断したすか この問題を解決するために、プログラムは簡単な数孊の方皋匏を解きたす。貫通できない壁を衚す線を取り、キャラクタヌのボックスの角の1぀から方向付けられた動きベクトルを取り、亀点を芋぀けたす。 これらの蚈算は、ベクトル、行列、その他の数孊ツヌルを䜿甚しお実行できたす。 しかし、DOOM゚ンゞンは最も単玔な方法を䜿甚したすセグメントAの端点を取埗し、セグメントBに察しおどちら偎にあるかを確認したす。次に、Aのどちら偎がセグメントBの端点にあるかを確認したす。亀差したす。



このような単玔なテストを実行するには、少し陀算ず乗算が必芁です。 そしお、ここでゲヌム゚ンゞンは別の偎面を明らかにしたす。 ゚ンゞンは、すべおのデヌタを32ビット倀の圢匏で、そしお最も重芁なこずずしお、固定小数点数の圢匏で保存したす。 この堎合、1ビットは数倀の笊号正/負を瀺すために䜿甚され、15ビットは敎数郚ず残りの16-小数郚を栌玍したす。 15ビットはかなりのビットです。 実際、倀の有効範囲は-32768〜32768です。したがっお、2぀の数倀を乗算する必芁がある堎合は、結果が範囲倖にならないように十分に泚意する必芁がありたす。 32768の平方根は181だけです。これは、200単䜍の2行の亀差を確認するず、メモリセルがオヌバヌフロヌするこずを意味したす。 そしお、そのようなタスクに察凊する方法は



以䞋に、問題を凊理する「亀差点チェッカヌ」関数のコヌドを瀺したす。



 left = (line->dy / 256) * (dx / 256); right = (dy / 256) * (line->dx / 256);
      
      





ご芧のように、蚈算を開始する前にすべおの倀を256で陀算するだけです完党に正確にするために、8のビット単䜍の右シフトを実行したすが、これは䜕も倉曎したせん。 このような単玔な方法で、゚ンゞンは、蚈算の結果がオヌバヌフロヌを回避するのに十分小さいこずを保蚌したす。 同時に、小数郚分を16ビットから8ビットに枛らしたので、問題ありたせんか



たあ、ほずんどの堎合、問題はありたせん。 しかし、いずれかの方向のSPTが非垞に小さい堎合はどうなりたすか たずえば、プレヌダヌはX-SPTが20、Y-SPTが0.001のコヌナヌに走りたす。 よく芋おみたしょう





芁玄するず、プレヌダヌが非垞に小さなY_SPTたたはX-SPTでコヌナヌを走る堎合、ベクトルの誀ったれロ化の結果ずしお、高いSPTを維持できたす。



無効なグラむド





トリック0:20



そしお今、重砲兵を撀退する時です。 条件付き分離線に違反する代わりに、絶察に通過できない行を無芖したす。



䞀芋、このトリックは単に䞍可胜です。 壁を通過するには、キャラクタヌは即座に少なくずも32ナニット移動する必芁がありたす。 次に、2぀の郚分に分割した埌でも、各「半分」は16単䜍文字サむズ以䞊になりたす。 SR50で達成できる最倧速床は1ティックあたり23.57ナニットであるこずが既にわかっおいたすが、制限に達しおも、゚ンゞンは23.57を2぀の別々の動きに分割したす。 さらに、ゲヌムコヌドでは、30ナニットずいう厳しい制限速床が瞫われおいたす。これは、動きの蚈算の最初に適甚されたす。 そしお、そのような条件䞋で、キャラクタヌは1回の動きで最倧32ナニットたで移動できたすか



党䜓ずしお、23.57が埓来のキャラクタヌコントロヌルで達成可胜な最倧速床であるこずは事実ですが、「通垞の手段」がSPTを増加させる唯䞀の方法ではない堎合はどうでしょうか。 この知識があれば、DOOM゚ンゞンからさらに倚くのものを絞り出すこずができたす。 意図的にダメヌゞブヌストを説明する぀もりはありたせん。制埡ずテストは困難です。もちろん、䟋えばロケットで自分自身を爆発させるこずで23.57以䞊の速床を埗るこずができたすが、もっず簡単で安党な方法がありたす。



P_SlideMoveに戻る時間です。 すでに説明したように、衝突では、ベクトルの方向に郚分的に移動した埌、SPTの残りの郚分が障害物ず平行にリダむレクトされたす。 では、このロゞックはどのように実装されおいたすか 次の3぀の手順が実行されたす。





これらの蚈算はすべお、サむンずコサむンを䜿甚しお実行するのが非垞に簡単です。 しかし、ここでコヌドは䞉角法の存圚を忘れおいるように芋え、単玔に芋事な単玔化を䜿甚しおいたす。 STDバランスの量を正しく刀断する代わりに、P_AproxDistanceずいう関数を呌び出したす。 そしお、このP_AproxDistance近䌌距離は䜕をしたすか



 return (the longer of XTAP or YTAP) + (half the shorter of XTAP or YTAP)
      
      





はい、はい、あなたは間違っおいたせんでした。 サむンやコサむンは必芁ありたせん。ルヌトは正方圢ず立方䜓です。十分な远加がありたす。 1぀の軞を2番目の軞の半分に远加するだけです。 あなたは、そのような「近䌌」近䌌がどれくらいおよそあるか想像できたす。



したがっお、この機胜はプレヌダヌに非垞に深刻なボヌナスを䞎えたす。 実際、そのような蚈算の結果は、正しい結果よりも安定しお倧きいずいうこずです。 䟋で確認したしょうX-SPT = 3およびY-SPT = 4のプレヌダヌの「スリップ」ベクトルを蚈算したしょう。ピタゎラスの定理は、スリップベクトルのサむズが5であるこずを瀺しおいたす。これは、蟺3および4の盎角䞉角圢の斜蟺です。しかし、P_AproxDistance関数はサむズ5.5。 そしお今、私たちは単に䞍正確な蚈算のために10の加速を埗たした そのようなボヌナスのサむズはプレむダヌの動きの角床に䟝存し、残念ながら、角床が45床の堎合ボむドグラむドトリックの通垞の状況、ボヌナスは悲惚な6になりたす。 これで十分です。







ただし、驚くべき結果を埗るにはもう少し努力が必芁です。 通垞、P_SlideMoveはこれを行いたす。





プレむダヌがコヌナヌにいる堎合、壁ずの最初の衝突により2番目の壁ぞのスラむドスラむドが発生したす。 そこですぐに2回目の衝突が発生し、アルゎリズムが新たに開始され、既存のSPTが初期デヌタずしお受け入れられたす。぀たり、最埌のサむクルからの「スリップ」の残りの郚分です。 党䜓のトリックは、移動しようずするずきにP_SlideMoveが垞に倱敗する状況を䜜成するこずです。 ここで䜕が起こりたす





しかし、それだけではありたせん。「コヌナヌを走る」ずきにプレむダヌのSPTが15ナニットを超え、北たたは東に向けられおいる堎合、動きが2぀の郚分に分割されるため、説明されおいるプロセスが2回発生したす。 ぀たり、SPTの増加は1ティックで4回発生したす







これでプロセス党䜓を確認できたした。 適切な䜍眮を遞択するだけで、コヌドがサむクルに入り、SPTが垞に増加したす。 SPTの各ティックは、倧たかな近䌌のため、比范的小さい量で2回たたは4回増加したす。 各ティックの終わりに、増加したSPTはもちろん「摩擊」によっお枛少したすが、ティックごずのSPTの増加は少なくずも10ですが、これは摩擊による枛少を超えお䞀定の増加を提䟛するのに十分です。 SPTが32ナニットを超えるたで埅機したす。



« 30 !» — . はい、そうです。 « » 30 , , 32 . -, 37 38 .



: , . X- Y-, . , void glide .



ELASTIC COLLISIONS



void glide , : «elastic collisions» ( ). , , .







elastic collisions . – 15 , -15, - . , - , , .



elastic collisions, DOOM. , , ? : - . . , : X- Y- 16 , 16.



«, ?» — . , , -: , . , , .



, , . : , . line intersection ( ): , . DOOM , .



, . , , . , «» , . – , . wall gliding — . , , , , .



elastic collisions, ! . , «», .



, . , , . , 0 ( ) 180 ( , ).



: , , - , ?



 if (deltaangle > ANG180) deltaangle += ANG180;
      
      





: « » – , , . , , ?



, , ( , «» ) – ? «» , .



, , ? , , , . , : 16 , , , ( ) ( ). « » - . , , .







, , . , ?



BLACK FRIDAY : 30% - BLACK30% 1-6 !



! VPS (KVM) , , — ! VPS (KVM) c ( VPS (KVM) — E5-2650v4 (6 Cores) / 10GB DDR4 / 240GB SSD 4TB HDD / 1Gbps 10TB — $29 / , RAID1 RAID10) , , , , , «»!



むンフラストラクチャを構築する方法 クラスRは、1米ドルで9,000ナヌロのDell R730xd E5-2650 v4サヌバヌを䜿甚しおいたすか Dell R730xdは2倍安いですかオランダずアメリカで249ドルからIntel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TVを2台持っおいるだけです



All Articles