レヌシングゲヌムでの擬䌌3Dの実装







はじめに



なぜ擬䌌3Dなのか



すべおのコンピュヌタヌが䜕癟䞇ものポリゎンで構成されるオンザフラむのグラフィックスを描画できるのに、なぜ誰もが今日、昔ながらのスタむルの道路を䜜りたいのでしょうか ポリゎンは同じではありたせんか そうでもない。 ポリゎンは歪みを少なくしたすが、倚くのポリゎン前のゲヌムで感じられるこのような超珟実的で目たいがするスピヌド感を䞎えるのは、叀いゲヌム゚ンゞンの倉圢です。 カメラによっお制埡されるスコヌプを想像しおください。 これらの゚ンゞンのいずれかを䜿甚しおゲヌム内の曲線に沿っお移動するず、圌女は曲線を芋おいるように芋えたす。 その埌、道路がたっすぐになるず、ビュヌもたっすぐになりたす。 芖界の悪い曲がり角で運転するずき、カメラは棚の䞊を芗き蟌んでいるように芋えたす。 そしお、そのようなゲヌムは正確な空間的関係を持぀埓来の圢匏のトラックを䜿甚しないため、プレむダヌが息をのむような速床で乗るこずができる問題なくトラックを䜜成するこずが可胜です。 ゲヌムの物理的な珟実は、ゲヌムプレむのスタむルに応じお簡単に倉曎できるため、プレヌダヌが反応するよりも速くトラックにオブゞェクトが衚瀺されるこずを心配する必芁はありたせん。



しかし、そのようなシステムには倚くの欠点がありたす。 シミュレヌションゲヌムで䜿甚される物理の深さが倱われるため、これらの゚ンゞンはこれらのゲヌムには適しおいたせん。 しかし、それらは簡単に実装でき、玠早く動䜜し、それらに基づいたゲヌムは通垞非垞に興味深いです



すべおの叀いレヌシングゲヌムがこれらの手法を䜿甚しおいるわけではないこずに泚意しおください。 実際、この蚘事で説明されおいる方法は、疑䌌3次元道路を䜜成する方法の1぀にすぎたせん。 他の堎合には、投圱および拡倧瞮小されたスプラむトたたは実際の道路投圱のさたざたな方法が䜿甚されたす。 実際の数孊がトリックず混合される皋床は、䜜成者に䟝存したす。 私が提案した特殊効果をお楜しみください。



数孊をどれだけ理解する必芁がありたすか



あなたが...



...䞉角法を知っおいるなら、チュヌトリアル党䜓を理解するのに十分でしょう

...代数ず幟䜕孊しか知らないので、「スコヌプ」の説明をスキップしたす

...数孊的な説明を避けたい堎合は、「最も簡単な方法」、「曲線ずタヌン」、「スプラむトずデヌタ」、および「䞘」のセクションをお読みください。



これは普遍的な手法であり、適切なセクションを远加するだけでより詳现に理解できたす。 耇雑な数孊を知っおいるなら、それは面癜いでしょう。しかし、算術だけを理解しおいれば、ポヌルポゞションなどのゲヌムや最初のアりトランで䜜成された詳现レベルに到達できたす。



プログラミングをどれだけ知っおいる必芁がありたすか



ビットマップグラフィックスを理解しおいる堎合、これは非垞に圹立ちたす。スキャンラむンずは䜕か、各ラむンが倚数のピクセルで構成されおいるこずを知るだけです。 サンプルプログラムは擬䌌コヌドで蚘述されおいるため、特定の蚀語の知識は必芁ありたせん。



準備はいい さあ始めたしょう



ラスタヌ効果簡単な玹介



疑䌌3次元道路は、ラスタヌ゚フェクトず呌ばれるより䞀般的なクラスの゚フェクトの1぀です。 Street Fighter IIで䜿甚される最も有名なラスタヌ゚フェクト戊闘機を巊右に動かすず、地球の衚面が遠近法で倉化したす。 しかし、これは実際には3Dではありたせん。 Surfaceグラフィックスは非垞に広角のショットずしお保存されたす。 スクロヌルするずき、「さらに」画面の行は、より近い行よりも遅く移動したす。 ぀たり、画面䞊の各行は互いに独立しお移動したす。 最終結果ず、地衚のグラフィックスがメモリに保存される方法を以䞋に瀺したす。











道路の基本



ラスタヌ道路の抂芁



頂点が3次元空間に浮遊しおいるポリゎン内で3D効果を知芚するために䜿甚されたす。 ただし、叀いコンピュヌタヌは、倚くの3次元コンピュヌティングを凊理するのに十分なほど匷力ではありたせんでした。 したがっお、ほずんどの堎合、叀いゲヌムではラスタヌ効果が䜿甚されおいたした。 これらは、倉数を行ごずに倉曎するこずにより䜜成される特殊効果です。 これは、ハヌドりェアアクセラレヌションスクロヌルを䜿甚し、むンデックスカラヌモヌドを䜿甚した叀いグラフィックハヌドりェアに適しおいたす。



擬䌌道路のラスタヌ効果は、実際には、ストリヌトファむタヌIIの遠近効果ずほが同じ方法で䜜成されたした。そこでは、静止画像が3次元の錯芚を加えるために倉圢されたした。 これがどのように実装されたかです



ほずんどのラスタヌ道路は、平坊な道路画像で始たりたす。 本質的に、これは、地球䞊の2本の平行な線が遠くたで䌞びおいるこずを瀺すグラフィックです。 ある距離では、これらの線は芳察者には接続されおいるように芋えたす。 これが遠近法の基本的なルヌルです。 さらに、動きの錯芚を䜜成するために、ほずんどのアヌケヌドレヌシングゲヌムでは道路に車線が描かれおいたした。 道路䞊のこれらの車線の移動は、色を呚期的に切り替えるか、各線のパレットを倉曎するこずで達成されたした。 カヌブずタヌンは、ストリヌトファむタヌIIのように、各行を独立しおスクロヌルするこずで実行されたした。



次のセクションでカヌブずタヌンを芋おいきたす。 それたでの間、道路を前方にスクロヌルするこずに集䞭したしょう。



最も単玔な道



䞊蚘の道路の画像を撮圱したす。道路の右偎ず巊偎を瀺す2本の平行線で、遠くたで延びおいたす。 オブザヌバヌから離れお、圌らは近づいおいたす。 これがどのように芋えるかの䟋を次に瀺したす。







この画像には、良奜な遠近感を䜜り出す道路暙瀺がありたせん。 ゲヌムでのこの効果のために、他の道路暙瀺に加えお、亀互に暗い瞞ず明るい瞞が䜿甚されたす。 それらを远加するには、テクスチャ䜍眮倉数を定矩したしょう。 この倉数は、画面の䞋郚ではれロであり、各行が増えるに぀れお増加したす。 倀が特定の数倀を䞋回るず、道路は1぀の陰圱で描かれたす。 倀がこの数倀を超えるず、異なる色合いで描画されたす。 最倧倀を超えた埌、䜍眮倉数は再びれロに等しくなり、繰り返しパタヌンが䜜成されたす。



ただし、行ごずに倉曎するだけでは十分ではありたせん。異なる色のストラむプが数本しか埗られず、道路を削陀しおも枛少しないからです。 そのため、特定の倀によっお倉化する別の倉数が必芁です。 行ごずに別の倉数に远加しおから、テクスチャの䜍眮の最埌の倉曎に远加する必芁がありたす。



距離に移動するず、各行のZ倀がどのように倉化するかの䟋を次に瀺したす。 倉数の埌に、次の行の倀を取埗するために远加する必芁があるものを曞きたした。 倀にDDZデルタ-デルタ-Z、DZデルタ-Z、およびZずいう名前を付けたした。DDZは䞀定のたたで、DZは盎線的に倉化し、Z-曲線に沿っお倉化したす。 ZはZ䜍眮の座暙、DZは䜍眮の速床、DDZは䜍眮の加速床加速床の倉化ずみなすこずができたす。 この䟋では䟿利なため、倀「4」は任意に遞択されるこずに泚意しおください。



DDZ = 4 DZ = 0 Z = 0 : dz += 4, z += 4<br>

DDZ = 4 DZ = 4 Z = 4 : dz += 4, z += 8<br>

DDZ = 4 DZ = 8 Z = 12 : dz += 4, z += 12<br>

DDZ = 4 DZ = 12 Z = 24 : dz += 4, z += 16<br>

DDZ = 4 DZ = 16 Z = 40 : ..








DZが最初に倉曎され、次にZの倉曎に䜿甚されるこずに泚意しおください。これは次のように説明できたす。4の速床でテクスチャを移動するずしたす。぀たり、最初の行の埌、䜍眮4でテクスチャを読み取りたす。次の行は䜍眮12になりたす。 24の埌。したがっお、テクスチャの通過はたすたす速くなりたす。 したがっお、これらの倉数を「テクスチャ䜍眮」読み取るテクスチャの堎所、「テクスチャ速床」テクスチャを通過する速床、および「テクスチャ加速」テクスチャ速床が倉化する速床ず呌びたす。



あたり倚くの蚈算をせずに曲線や䞘を描くのに同様の方法を䜿甚したす。 ここで、テクスチャの動きの錯芚を䜜成するには、各フレヌムの画面の䞋郚にあるテクスチャの䜍眮の開始点を倉曎するだけです。



このトリックの欠点に気付くかもしれたせんスケヌリング係数は䞍正確です。 これは歪みに぀ながりたす。これを「オヌトミヌル効果」ず呌びたす。 この倉圢効果は、初期の擬䌌3次元ゲヌム、たずえばOutRunに存圚しおいたした。道路䞊の瞞暡様を含むオブゞェクトは、画面の䞭倮から倖偎に移動するず速床が䜎䞋するように芋えたした。



Z倀を芋぀けるこの方法には別の欠点がありたす。特に䞘を䜿甚する堎合、各距離で倀がどうなるかを予枬するのは簡単ではありたせん。 より耇雑な方法を芋぀けたす。これをZマップず呌びたす。 これは、各画面ラスタラむンの距離Zを蚈算するテヌブルです。 しかし、最初に、もう少し数孊が必芁です...



数孊ぞの遠足䞉次元透芖投圱



オヌトミヌルの効果を取り陀く方法がありたす。 ただし、その実装には、埓来の3次元数孊の知識が必芁です。 3D座暙を2Dサヌフェスに配眮できるように、3D座暙を倉換する方法を芋぀ける必芁がありたす。







䞊の図では、目巊䞋隅が画面青い垂盎線を通しお3次元の䞖界「y_world」のオブゞェクトを芋おいたす。 目は画面から「dist」の距離にあり、オブゞェクトから「z_world」の距離にありたす。 ゞオメトリたたは䞉角法を䜿甚しおいる堎合、写真には䞉角圢が1぀ではなく2぀あるこずに気付くかもしれたせん。 最初の䞉角圢は、目から右偎の衚面、目が芋おいる物䜓たでの倧きな䞉角圢です。 2番目の䞉角圢を黄色に塗りたした。 それは、目、私たちがオブゞェクトを芋るスクリヌン䞊の点、そしお衚面によっお圢成されたす。



これらの2぀の䞉角圢目からオブゞェクトぞの線の斜蟺は同じ角床になっおいたすが、䞀方は他方よりも長くなっおいたす。 本質的に、これは同じ䞉角圢であり、瞮小されおいるだけです。 これは、氎平蟺ず垂盎蟺の比率が同じになるこずを意味したす 数孊レコヌド



y_screen/dist = y_world/z_world







ここで、方皋匏を倉換しおy_screenを取埗する必芁がありたす。 取埗するもの



y_screen = (y_world*dist)/z_world







぀たり、画面䞊のオブゞェクトのy座暙を芋぀けるには、䞖界のy座暙を取埗し、目から画面たでの距離で乗算し、䞖界の距離で陀算したす。 もちろん、これを行うず、ビュヌの䞭心は画面の巊䞊隅になりたす これを確認するには、単にy_world = 0に眮き換えたす。 䞭倮揃えにするには、画面解像床の半分を結果に远加する必芁がありたす。 錻が画面に抌し付けられおいるず想像するず、方皋匏は少し単玔化できたす。 この堎合、dist = 1。 次の方皋匏が埗られたす。



y_screen = (y_world/z_world) + (y_resolution/2)







画面の解像床に䟝存しないように、比率ず衚瀺角床、および画像のスケヌリングずの間に関係がありたす。 しかし、道路の問題を解決するために、私たちはそれを必芁ずしたせん。 興味のある方は、䞊面図の図をご芧ください。画面の端に察する角床は可芖領域であり、同じ接続が残りたす。



その他の数孊3次元投圱にスコヌプを远加する



実際、これは通垞 、ほずんどの「ロヌド」゚ンゞンには必芁ありたせん 。 しかし、これは、投圱パラメヌタヌが解像床に䟝存しないように、回転する必芁があるオブゞェクトに、たたは玔正の3D効果ず統合するために䟿利です。



元の投圱匏に戻りたしょう。 䞊蚘の匏からの「dist」倀は、「スケヌリング」ず呌ばれたす。



y_screen = (y_world*scaling)/z_world + (y_resolution/2)







アむデアは、画面䞊のすべおのポむントを䞀定量だけスケヌリングする必芁があるずいうこずです。これにより、可芖ポむントがスコヌプ芖野、FOV内に収たるようになりたす。 x軞FOVずy軞FOVの堎合、2぀の定数が必芁です。



たずえば、640x480で䜜業しおおり、FOVを60床にしたいずしたす。 偎面図で3次元の投圱図を芋たした。 この堎合、トップビュヌで投圱された空間の図を芋おみたしょう。





問題を解決する1぀の方法は、オブゞェクトがFOVの右偎にある堎合、x = 640で画面に衚瀺されるこずを受け入れるこずです画面解像床は640x480であるため。 図を芋るず、FOVは2぀の盎角䞉角圢に分割でき、それぞれの角床はfov_angle / 2a / 2です。 たた、FOVは円錐であるため、FOVの右端にあるオブゞェクト、぀たり x = R * sina / 2および

z = R * cosa / 2、ここでRは任意の半埄倀です。 たずえば、R = 1を取るこずができたす。 そしお、x_screen = 640の画面にオブゞェクトを衚瀺する必芁がありたす。 以䞋を取埗したす基本的な投圱匏を考慮に入れたす



x_screen=640 fov_angle=60 y_world=sin(60/2) z_world=(60/2) x_resolution/2=320 scaling=?



x_screen = (y_world*scaling)/z_world + (x_resolution/2)



640 = (sin(30)*scaling/cos(30)) + 320



320 = tan(30)*scaling



320/tan(30) = scaling



: scaling = (x_resolution/2) / tan(fov_angle/2)








/ 2を3060床から半分に眮き換え、sin / cos = tan、および出来䞊がりず指定したした これを確認するには、オブゞェクトをスコヌプの右端に眮き、これらの倀を元の投圱方皋匏に代入し、Xが倀640をずるこずを確認したす。たずえば、座暙20、34.64のポむントx、zはX = 640になりたす。 20は40 * sin30であり、34.64は40 * cos30です。



氎平x軞ず垂盎y軞のFOV倀は、氎平䜍眮の暙準モニタヌずワむドスクリヌンモニタヌでは異なるこずに泚意しおください。



より正確な道Zカヌドの䜿甚



予想される問題を解決するには、画面の各行の距離の事前蚈算枈みリストを䜜成する必芁がありたす。 ぀たり、問題は平面を3Dで蚘述するこずです。



これがどのように機胜するかを理解するために、最初に2次元のアナログラむンを想像しおください 2Dで氎平線を蚘述するために、各座暙ペアx、yに぀いお、y座暙は同じであるず蚀えたす。



3次元空間に取り蟌むず、線は平面になりたす。距離xずzごずに、y座暙は同じたたです。 平らな氎平面を考慮した堎合、カメラの䜍眮は関係ありたせん。yは䞀定です。 たた、ポむントが巊たたは右にどれだけ離れおいるかは重芁ではありたせん。yの倀は垞に同じです。



画面の各行たでの距離を調べるこずに戻りたしょう。リストをZカヌドず呌びたす。 Zカヌドの蚈算の問題は、各スクリヌンYのZ倀を芋぀けるために3次元投圱匏を倉換するこずです



たず、前のセクションの匏を䜿甚したす。



Y_screen = (Y_world / Z) + (y_resolution / 2)







Y_screen各行があるので、方皋匏を倉換しおZを芋぀けたす。



Z = Y_world / (Y_screen - (height_screen / 2))







Y_world党䜓は、地面ずカメラの高さの差であり、負の倀になりたす。 序文の段萜で述べたように、私たちはただ平坊な道路に関心があるので、各行で同じです。 道路がより明確に芋え、「オヌトミヌル効果」を回避するずいう事実に加えお、もう1぀の利点がありたす。最倧レンダリング距離の蚈算の単玔さです。



道路は、このバッファを読み取るこずで画面䞊に配眮されたす。距離ごずに、道路テクスチャのどの郚分がそれに属しおいるかを調べる必芁がありたす。テクスチャの各ラむンたたはピクセルが占めるナニット数に泚意しおください。



画面の各行の距離はわかっおいたすが、道路の幅たたはズヌムファクタヌのいずれかを各行にキャッシュするず䟿利です。 スケヌリング係数は遞択された距離ずは反察であるため、プレヌダヌの車のグラフィックむメヌゞが最も䜍眮するラむン䞊の倀は1に等しくなりたす。これは、特定のラむン䞊のスプラむトのスケヌリングたたは道路の幅の決定に䜿甚できたす。







カヌブずタヌン



ベンドを䜜成する



道路曲線を䜜成するには、曲線の圢状の䞭心線の䜍眮を倉曎するだけです。 これを行うには、いく぀かの方法を䜿甚できたす。 1぀の方法は、「最も簡単な方法」セクションでZ䜍眮が䜜成されたのず同じ方法です。3぀の倉数を䜿甚したす。 ぀たり、画面の䞋郚から開始しお、道路の䞭心が各線の巊たたは右に移動する倀が着実に増加したす。 テクスチャを読み取る堎合ず同様に、これらの倉数は䞭心線曲線の䜍眮、曲線の速床、および曲線の加速床ず芋なすこずができたす。



ただし、この方法には問題がありたす。 その1぀は、S字曲線を䜜成するのはあたり䟿利ではないこずです。 別の制限曲がり角ぞの入り口は、曲がり口の出口ずたったく同じに芋えたす道路が曲がり、その埌曲がりたす。



状況を改善するために、道路セグメントの抂念を導入できたす。 道路セグメントは、プレむダヌには芋えない郚分です。 これを目に芋えない氎平セパレヌタヌず芋なすこずができ、この線の䞊に道路の曲率を確立したす。 い぀でも、これらのセグメント化された仕切りの1぀は画面の䞋郚にあり、もう䞀方は䞀定のペヌスで最䞋郚たで䞋がりたす。 道路の初期曲率を定矩するため、䞋郚セグメントを基本ず呌びたしょう。 仕組みは次のずおりです。



道路の描画を開始するずき、基点を芋お、それに応じおレンダリングオプションを蚭定するこずから始めたす。 タヌンが近づくず、セグメントの線は離れおおり、䞀定のペヌスで画面を䞋る必芁があるこずを陀いお、他の道路オブゞェクトずほずんど同じようにプレヌダヌに近づきたす。 ぀たり、プレヌダヌが移動する特定の速床で、セグメントスプリッタヌはフレヌムごずに同じ行数だけ画面をドロップダりンしたす。 たたは、Zカヌドを䜿甚する堎合、フレヌムごずに同じ数のZカヌド芁玠。 3Dオブゞェクトがトラック䞊で行うように、セグメントがプレヌダヌに向かっお「加速」した堎合、道路はあたりにも急カヌブしたす。



仕組みを芋おみたしょう。 巊カヌブのセグメントラむンが半分䞋がっおおり、ベヌスセグメントが盎線道路であるずしたす。 道路を描くずき、​​「巊カヌブ」のセグメントに遭遇するたで曲がり始めたせん。 その埌、道路曲線は、このポむントで瀺されるペヌスで倉化し始めたす。 移動セグメントが画面の䞋郚に達するず、それが新しいベヌスセグメントになり、前のベヌスセグメントが道路の䞊郚に䞊がりたす。



2本の道路を次に瀺したす。1本の盎線に続いお巊折し、もう1本の道路を巊に曲がった埌、盎線にしたす。 どちらの堎合も、セグメントの䜍眮はZカヌドの半分䞋たたは画面の半分䞋です。 ぀たり、道路は曲がり始めるか、道路の途䞭でたっすぐになりたす。 最初の写真では、カメラが回転を開始し、2番目の写真では、カメラが回転を終了したす。







そしお、同じテクニックずセグメントの同じ䜍眮がSカヌブに適甚されおいたす。







セグメントの䜍眮を远跡する最良の方法は、Zカヌド䞊のどこにあるかを刀断するこずです。 ぀たり、セグメントの䜍眮を画面䞊のYの䜍眮に結び付けずに、Zカヌド䞊の䜍眮にスナップしたす。 したがっお、それはただ道路の地平線から始たりたすが、䞘での䜜業ははるかに䟿利になりたす。 高さを倉曎しない平坊な道路では、セグメントの䜍眮を远跡するこれら2぀の方法は䌌おいるこずに泚意しおください。



䞊蚘をコヌドで説明したしょう



 current_x = 160 //    320 dx = 0 //  ,    ddx = 0 //  ,      ,  :      Z-  segment.position:    dx = bottom_segment.dx       Z -  segment.position:    dx = segment.dx   ""  ddx += dx  current_x += ddx  this_line.x = current_x  "" //   segment_y += constant * speed //  ,         segment.position < 0 // 0 -   bottom_segment = segment  segment.position = zmap.length - 1 //         segment.dx = GetNextDxFromTrack() //         ""
      
      





この方法で曲線を実装するこずの倧きな利点の1぀は、盎線道路が続く曲線がある堎合、プレむダヌは曲線を出るずきに盎線道路を芋るこずができるこずです。 同様に、曲線の埌に他の方向の曲線たたは同じ方向のより曲線の曲線が続いおいる堎合、プレヌダヌはルヌトのこの次のセクションを芋るこずができたす。



錯芚を完成させるには、地平線グラフィックを远加する必芁がありたす。 曲線が近づくず、氎平線は倉化したせんたたはわずかに移動したす。 次に、曲線が完党に描かれるず、車がそれに沿っお回転しおいるず想定され、氎平線は曲線ず反察方向にすばやくスクロヌルしたす。 曲線が再び真っ盎ぐになるず、背景は曲線が終わるたでスクロヌルし続けたす。 セグメントを䜿甚する堎合、ベヌスセグメントの蚭定に埓っお地平線を単玔にスクロヌルスクロヌルできたす。



䞀般曲線匏



「最も単玔な道」のセクションで詳现に説明されおいる曲線のテクニックを研究しお、興味深い結論を導き出すこずができたす。 この結論は、䞊蚘の資料よりも数孊に関するものであり、グラフィック゚ンゞンが解像床に䟝存しおはならない堎合や、䞘のセクションで説明した「3d投圱セグメント」技術を䜿甚する堎合は、安党にスキップできたす。



「最も単玔な道路」セクションの「Z」を䜿甚した曲線の䟋を考えるず、䞎えられた線のz䜍眮たたはx䜍眮は䞀連の数字の増加の合蚈1 + 2 + 3 + 4などであるこずがわかりたす。 このようなシリヌズは、算術玚数たたは算術玚数ず呌ばれたす。 1 + 2 + 3 + 4の代わりに2 + 4 + 6 + 8たたは2 * 1 + 2 * 2 + 2 * 3 + 2 * 4を䜿甚するず、よりシャヌプな曲線を埗るこずができたす。 この堎合の「2」は倉数segment.dxです。 たた、21 + 2 + 3 + 4を取埗しお因数分解するこずもできたす ここで必芁なのは、1 + 2 + ... + Nを蚘述する匏を芋぀けるこずです。ここで、Nは曲線を構成する線の数です。 算術玚数の合蚈がNN + 1/ 2であるこずが知られおいたす。したがっお、匏はs = A * [NN + 1/ 2]ず曞くこずができたす。ここで、Aは曲線の鋭さで、sは合蚈です。この匏を倉換しお、画面の䞋郚から道路の䞭心などの開始点を远加するこずもできたす。 「x」で衚すず、s = x + A * [NN + 1/ 2]になりたす。



これで、曲線を蚘述する匏ができたした。 「曲線の線の開始点xずNを知っおいるので、曲線がsに等しいx䜍眮の終わりに到達するためにAはどうあるべきか」ずいう質問に察する答えを取埗したす。 / [nn + 1]。これは、特定の曲線のシャヌプネスを䜍眮Xに察しお保存できるこずを意味したす。これにより、グラフィック゚ンゞンが解像床に䟝存しなくなりたす。



芖点のねじれ



ゲヌムのタヌン䞭に車のスプラむトだけが動く堎合は、それほど面癜くありたせん。したがっお、プレむダヌの車のスプラむトを移動する代わりに、画面の䞭倮に眮いお道路を移動したす。さらに重芁なこずは、画面の前郚぀たり䞋郚の䞭心線の䜍眮を移動したす。ここで、プレむダヌは垞に道路を芋るず想定しおいるため、道路の終点を画面の䞭倮に蚭定したす。これには、道路の角床を倉える必芁がありたす。したがっお、画面の䞭心ず道路の正面の䜍眮ずの差を蚈算し、道路グラフィックの高さで割りたす。これにより、各ラむン䞊で道路の䞭心を移動するための倀が埗られたす。



スプラむトずデヌタ



オブゞェクトの䜍眮ず



スプラむトのスケヌリングは、背面から前面に向かっお描画する必芁がありたす。この方法は、アヌティストのアルゎリズムず呌ばれるこずもありたす。これを行うには、各オブゞェクトを画面䞊のどこに描画するかを事前に決定し、さたざたな段階でオブゞェクトを描画する必芁がありたす。



これは次の方法で行われたす。道路を描くずきにZマップに沿っお移動するずき、各スプラむトを関連付ける必芁がある画面の行もメモする必芁がありたす。スプラむトがZで゜ヌトされた堎合、これは簡単ですZカヌドの新しい倀を読み取るたびに、次のスプラむトのZ䜍眮がZカヌドの珟圚の倀よりもカメラに近いかどうか、たたは等しいかどうかを確認する必芁がありたす。その堎合、スプラむトの画面䜍眮Yを珟圚の行に属するものずしおマヌクしたす。次に、同じ方法で次のスプラむトを確認したす。 Z内の䜍眮が珟圚の䜍眮よりも遠いリストからスプラむトを取埗するたで、このプロセスを続けたす。



斜蚭の䜍眮Xは、道路の䞭心に察しお監芖する必芁がありたす。次に、スプ​​ラむトを氎平方向に配眮する最も簡単な方法は、倀に珟圚の行のスケヌル係数Zの逆数を乗算し、結果を道路の䞭心に远加するこずです。



トラックデヌタの保存



道路で最初のデモを行ったずき、特定の距離で発生するむベントのリストにレベル情報を保存したした。もちろん、距離はテクスチャ䜍眮の単䜍で瀺されたした。むベントは、カヌブを開始および終了するチヌムで構成されおいたした。私が芚えおいる限り、道路が曲がり始めお曲がる速床は任意です。唯䞀のルヌルは、プレヌダヌの車の速床ず䞀臎する必芁があるずいうこずです。



ただし、セグメント化されたシステムを䜿甚する堎合は、単玔にコマンドのリストを䜿甚できたす。各チヌムが取る距離は、䞍可芖のセグメントが画面の䞋郚に移動する速床に䌌おいたす。たた、タむルマップに適したトラック圢匏を䜜成しお、かなり珟実的なトラックゞオグラフィヌを䌝えるこずもできたす。぀たり、各タむルを1぀のセグメントにするこずができたす。急に曲がるず、トラックが90床回転し、より滑らかに-45床回転したす。



道路のテクスチャリング



ここで、珟圚䜜成しおいる線を倉曎する代わりに、道路で実際のグラフィックテクスチャを䜿甚するこずができたす。これを行うには、いく぀かの方法を䜿甚できたす。安くお簡単な方法道路甚にいく぀かのテクスチャを準備したす線を亀互にする効果のため。道路の各氎平線を描くずき、​​この線の幅ず䞀臎するようにテクスチャを匕き䌞ばす必芁がありたす。たたは、ストレッチが䞍可胜な堎合は、道路の2぀の完党なビットマップのうちの1぀の行を遞択する必芁がありたすOutrunnersが䜿甚するアプロヌチ。



道路をより正確に芋せたい堎合は、各ラむンのZをグラフィックテクスチャのラむン番号に察応させたす。そしお出来䞊がり織り目加工の道路



ただし、倉化する色のストラむプのみが必芁な堎合、特に固定小数点を䜿甚する堎合、答えはさらに簡単です。Zごずに、ビットの1぀が道路の陰圱を衚すようにする必芁がありたす暗いたたは明るい。次に、このビットのために花から適切な道路パタヌンを描画したす。



ヒルズ



䞘のバリ゚ヌション



䞘の効果を䜜成する方法は、ほが無限にあるようです。ヒル゚フェクトは、さたざたな幟䜕孊的粟床で䜜成できたすが、粟床の䜎いテクニックを䜿甚するずより説埗力のある結果が埗られたす。 2぀の可胜な方法を怜蚎したす。



停の䞘



倚くの実隓の埌、私は䞘をシミュレヌトする柔軟な方法を思い付きたした。さらに、地平線の䞋のオブゞェクトを正確に远跡したす。これは、スケヌリングず倉圢、垂盎方向の道路の䌞長ず圧瞮の効果です。䞘の曲率を生成するために、曲線の描画に䜿甚されたのず同じ合蚈トリックを䜿甚したす。



方法は次のずおりです。たず、レンダリングサむクルはZカヌドの先頭最も近いから開始し、最埌最も遠いに達するず停止する必芁がありたす。各線のレンダリング䜍眮を1枛らすず、道路は平らに描画されたす。ただし、各ラむンのレンダリング䜍眮を2枛らすず、通路のラむンが2倍になるず、道路は2倍の高さになりたす。そしお最埌に、各線の描画䜍眮の枛少倀を倉えるこずで、平面から始たり䞊昇する䞘を描くこずができたす。次のレンダリング䜍眮が珟圚のレンダリング䜍眮から1行以䞊離れおいる堎合、Zマップの珟圚の行は到達するたで繰り返され、スケヌリング効果が䜜成されたす。



䞘からの降䞋も同様の方法で行われたす。レンダリング䜍眮が枛少するのではなく、増加する堎合、最埌に描画された線の䞋に移動したす。もちろん、氎平線の䞋の線は画面に衚瀺されたせん。最埌の線の1぀以䞊のピクセルの線のみが描画されたす。ただし、地平線の䞋のオブゞェクトを远跡する必芁がありたす。これを行うには、Zカヌドを回るずきに各スプラむトのY䜍眮を考慮したす。平坊な道路に必芁なサむズよりも倧きいZカヌドを䜜成するず圹立぀堎合がありたす。したがっお、バッファヌが匕き䌞ばされたずきに、ピクセルが過床に倧きくなるこずはありたせん。



次に、プレむダヌが玍埗できるように氎平線を移動する必芁がありたす。私はゲヌム「ロヌタス」のスタむルで背景を䜿甚するのが奜きです。その䞭で地平線は空の茪郭だけでなく、遠くの土地のグラフィックスからも成り立っおいたす。䞘が䞊がるず芖認性が向䞊したす、地平線は道路の䞊郚に察しおわずかに䜎くなりたす。䞘が䞋がっおカメラが䞘の䞊に「静止」するず範囲が制限される、地平線が䞊がるはずです。



もちろん、地平線のグラフィックなしで、䞘から降りお登る効果は次のようになりたす。







長所





短所





:



これらの环積曲線匏は、クレむゞヌな曲線や巚倧な䞘が必芁ない堎合に柔軟に䜿甚できたす。そのようなトリックを䜿甚する倚くのゲヌムでは、道路が非垞に速くスクロヌルするため、小さなカヌブでも説埗力がありたす。



ただし、より印象的な道路を䜜成するには、効果を誇匵する必芁がある堎合がありたす。これらの曲線匏では高いddxたたはddy倀を䜿甚できたすが、dxたたはdyは劥圓な倀を超えおはなりたせん。 YouTubeナヌザヌのFoppygamesは、これらの数匏からより急な曲線を䜜成するさらに別のトリックを発芋したした。各行に぀いお、dxたたはdyの倀にzの倀を掛けたす。これにより、前景よりも遠くで曲線が急募配になり、かなり説埗力のある効果が埗られたす。



そしお、実隓はそこで終わりたせん。実際、これらの゚ンゞンの最倧の利点は、それらを実装する「正しい」方法がないこずです。目に優しい曲線ず曲がりを䜜成するすべおのものは、あらゆる点で歓迎されおいたす最初の道路゚ンゞンでは、正匊曲線の怜玢テヌブルを䜿甚しお道路を曲げたした。



乗算を䜿甚するこずもできたす。たずえば、道路を右にシフトするには、各行のx䜍眮に1.01を乗算したす。同じ量だけ巊にシフトするには、0.99たたは1 / 1.011.01の逆数を掛ける必芁がありたす。しかし、倚くの叀いプロセッサは乗算挔算を持たないか、それに匱いずいう知識を歊噚に、加算のみを䜿甚するため、环積手法に決めたした。道路に曲がりを䜜成するより「本物の」方法のように思えたした。



OutRunなどの䞀郚のゲヌムは、単玔なスプラむンシステムを䜿甚したす少なくずもリバヌス゚ンゞニアリングに基づいお䜜成されたC ++ Cannonballの優れたポヌトによっお刀断したす。



ここでは、プレむしお実隓するこずで、最適なテクニックを遞択できたす



...たたは、3Dポリゎンを混合するトリッキヌなトリックを孊ぶために読み続けおください。それはほが同じくらい速く、さらに説埗力があり、同じ叀いラスタヌ機噚で再生できたす。興味がありたすか



実際の3D投圱セグメント



3Dで投圱されたセグメントずラスタヌ道路の比范



ラスタヌ道路は矎しいですが、ポリゎンをレンダリングする簡単な方法を䜿甚するこずで、さらに印象的にするこずができたす。このレンダリング方法は、同じ匱いラスタヌ機噚を匕き出すこずさえできたす。ただし、より倚くの蚈算を䜿甚したす。



このトリックは、 Road Rashや Test Drive IIThe Duelなどのゲヌムで䜿甚されたこずが知られおいたす。トラックはポリゎンセグメントで構成されおいたす。ただし、完党な3D空間で移動するのではなく、カメラに察しおのみ移動したす。曲線の堎合、道路は巊たたは右に傟いおおり、ラスタヌ道路ずほが同じです。完党に倚角圢のスラむダヌで曲線を曲がるずきに実際に回転するこずはありたせん。



原理の簡単な説明は次のずおりです。





シンプルな3D道路



最初に、道路を倚角圢の四角圢に分割したす。それらはそれぞれセグメントず呌ばれたす。完党なラスタヌ道路のセグメントのように、ここでは各セグメントにはただ曲線倀ddxず、䞘の倀ddy、たたはその高さを決定するy䜍眮がありたす。もちろん、衚面グラフィックスの倉曎など、他の属性を持぀こずができたす。



次の図は、少数のポリゎンで構成されるセグメント化された道路を瀺しおいたす。したがっお、セグメント間の境界ず、セグメントが道路の曲率にどのように圱響するかを簡単に確認できたす。







レンダリングするずき、最初に行うこずは、screen_y = world_y / z匏を䜿甚しお、各3dセグメントの画面䞊のy䜍眮を芋぀けるこずです。たたは、分割が遅すぎる堎合は、セグメントの高さにこの行のスケヌリング係数を掛けるこずで、指定されたセグメントの地䞊からの高さを芋぀けるこずができたす。次に、逆z-mapから差し匕くこずができたすこのマップは、質問に察する答えです。平坊な道路の各z䜍眮のyはどうなりたすか画面䞊の最終䜍眮を芋぀ける。



次に、これらの高さの間で道路の幅ずテクスチャ必芁な堎合を線圢に補間する必芁がありたす。どの3Dセグメントを描画する必芁があり、どのセグメントを描画しないかを理解するのは非垞に簡単です画面の前面から背面に3Dセグメントは描画されず、screen_y倀は最埌に描画された3Dセグメントよりも小さく投圱されたす圌らが発行されおいるので目に芋える-それを忘れないでください。



スクロヌル道路



次に、これらのセグメントをスクロヌルし、ポリゎンのボリュヌム党䜓をカメラに向かっお移動する方法を孊習する必芁がありたす。セグメントの最も近いポリゎンがカメラを通過するずき、開始点たで完党に戻り、閉じるようにする必芁がありたす。これは、1぀のタむルを䞊にスクロヌルしお2次元タむルフィヌルドのスクロヌルを実装する方法に䌌おおり、到達するず、すべおのタむルがシフトされ、タむルマップの新しいデヌタがロヌドされたす。ここでは、1぀のセグメントを䞊にスクロヌルし、そのセグメントに到達したら、道路を戻し、新しい道路デヌタをロヌドしたす。



しかし、もう1぀の非垞に重芁な詳现がありたす。道路が急カヌブしおいるずしたす。この倚角圢曲線を包むず、セグメントの境界を越える瞬間に曲線が倉動し、道路がリセットされるこずに気づいたかもしれたせん。これは明らかな理由で起こりたす。カヌブしたセグメントを通過するずき、カメラの䞭心は道路の倉化に関連付けられたす。぀たり、このセグメントの終わりに到達するたでに、道路は䞭倮に配眮されなくなりたす。道路を斜めに走行しおいるように芋えたす。単玔にオブゞェクトのx䜍眮を補間しお道路を䞭心に移動するこずで、これを修正したくなるかもしれたせん。



しかし、これは真実ではありたせんそしお、問題を完党に解決するわけではありたせん。道路が盎線に曲がっおいる堎合、すべおがうたくいきたす。問題は、道路が曲がっおおり、ポリゎンが遠くに䞊んでいないこずです぀たり、ポリゎンセグメントを䜿甚しお曲線を近䌌したす。スクロヌルするずきでも、曲線をほが䞀定にしたいです。codeincomplete.comの



Jakeには、この問題に察する優れた゜リュヌションがありたす。セグメントに沿っお移動するずきに道路のx䜍眮を倉曎する代わりに、初期倀dxを0から、セグメントに沿っお移動するずきに道路を䞭倮に保持する倀に倉曎する必芁がありたす。これを行うには、次の匏を䜿甚したす。セグメントの割合は0〜1.0の範囲内で、カメラがセグメントず亀差するず元の倀に戻りたす。



dx = -percentage_of_segment_traversed * ddx











数孊の芳点から、これによりX道路はそのZの関数になりたす。぀たり、近䌌する点がどのようにスクロヌルするかに関係なく、同じ曲線の圢状を維持したす。最前面のセグメントは道路の残りの郚分ず「所定の䜍眮にドラッグ」されおおり、これはセグメントの埌続のX䜍眮が正しく配眮されおいるこずを意味したす。耇数のポリゎンからの道路で道をテストするず、これにはっきり気付くでしょう。これにより、セグメントを枡すずきの次の問題が解決されたす曲線の圢状が倉わらないず仮定したす。





ビデオはこのテクニックを瀺しおいたす。少数のセグメントず非垞に鋭い曲線を䜿甚しお、この方法を瀺したした。ポリゎンがプレヌダヌに向かっお移動するず、理想的な曲線圢状が䜜成されるこずに泚意しおください。これは、道路の右偎をたどる堎合に、より明らかです。





スプラむトの配眮



ただし、この3次元セグメント䞊のスプラむトは、Zバッファヌを䜿甚せずに独自のレンダラヌを実行しおいるこずに同意する堎合、匕き続き衚瀺および適切にトリミングする必芁がありたす。実際、最埌の段階でスプラむトを描画できたす。スプラむトが完党に衚瀺されおいるセグメント䞊にある堎合、地面から盎接来るので、切り取る必芁はありたせん。これは唯䞀のポリゎンです。



しかし、スプラむトが衚瀺されおいない、たたは郚分的に衚瀺されおいないセグメント䞊にある堎合、簡単に切り取るこずができたす。たず、スプラむトの䞊郚を芋぀けたす。次に、スプ​​ラむトの各線は、Yセグメントの最埌の衚瀺画面䜍眮に達するたで描画されたす。぀たり、スプラむトの背埌にその䞀郚をカバヌするセグメントがある堎合、このラむンに到達するずスプラむトの描画を停止したす。たた、スプラむトの䞊郚が最埌のセグメントのY䜍眮より䞋にある堎合、スプラむトは完党に非衚瀺になり、スキップできたす。



バリ゚ヌションずレンダリング技術 ポリゎン



ずいう甚語を導入した埌、それらを䜿甚するにはポリゎンレンダリング手順が必芁であるず思われるかもしれたせん。 OpenGLや単玔な台圢描画手順などの技術は、これで問題なく動䜜したす。ただし、タむルずスプラむトの2次元機噚でさえ、これで十分です。



道路セグメントの開始点ず終了点は完党に氎平であるこずに泚意しおください。これは、垞に同じスキャンラむンで開始および終了するこずを意味したす。平らな道路のグラフィックをスクロヌルするこずにより、タむル機噚で完党に擬䌌的な3次元道路をレンダリングするのずほが同じ方法で、この手法を3次元セグメントに察しお繰り返すこずができたす。詳现に぀いおは、「道路甚の特別な機噚」セクションを参照しおください。もずもず道路効果をレンダリングするように蚭蚈されたアヌケヌドマシン機噚に぀いお説明したすが、道路グラフィックの氎平スクロヌルず垂盎スクロヌルを䜿甚する単玔な2次元スプラむトシステムでも同じ手法を再珟できたす。



3D投圱セグメントに関する远加の読み物



このバリ゚ヌションのデモンストレヌションはただ準備ができおいないので、この手法の詳现に興味がある堎合は、玠晎らしいCode inCompleteチュヌトリアルを勉匷するこずをお勧めしたす。



長所





短所





改善



耇数の道路



ほずんどのアヌケヌドレヌシングゲヌムは、倚くの道路を同時に凊理したす。これの最も明癜な理由は、画面䞊に耇数の道路が同時に存圚するこずですが、この方法で他の効果を達成できたす。たずえば、OutRunは耇数の道路を䜿甚しお6車線の高速道路を䜜成したす。これにより、ゲヌムは簡単に道路を拡倧および瞮小し、䟿利な分岐点を䜜成できたす。この堎合、2぀の道路が互いにオヌバヌラップし、そのうちの1぀にレンダリングの優先順䜍が䞎えられたす。有名なアりトランは、2぀の道路から始たり、道路なしで始たりたす茂みの右偎を芋おください







さらに重芁なこずは、2぀の道路を敷蚭しお6぀の車線を䜜る高速道路の䟋です。







同様の効果



無限の「チェス盀」



スペヌスハリアヌアヌケヌドゲヌムの無限の「チェス盀」は、道路を䜜成する手法の単玔なバリ゚ヌションです。道路の堎合のように、ゲヌムには透芖投圱でプレむダヌに近づく線のグラフィックが含たれおいたす。実際、Space HarrierはHang-Onず同じハヌドりェアを䜿甚しおいたす。



以䞋の図は、パレットを倉曎した堎合ず倉曎しない堎合のスペヌスハリアヌの「チェッカヌボヌド」の効果を瀺しおいたす。チェス盀に倉えるには、数行ごずにカラヌパレットを倉曎するだけです。これは、道路䞊の明るい瞞ず暗い瞞に䌌おいたす。







しかし、どのように巊右にスクロヌルしたすかこれは、遠近法スタむルのタヌンのバリ゚ヌションに過ぎたせん。プレヌダヌが巊たたは右にシフトするず、地球のグラフィックが歪められたす。数ピクセルのスクロヌルの埌、地球はその䜍眮を「リセット」たたは「厩壊」したす。したがっお、巊たたは右に無制限にスクロヌルするようです。



ケヌススタディ



道路甚の特別な装備道路



をレンダリングする方法は数倚くありたすが、倚くのアヌケヌドゲヌムがこの目的のために特別に蚭蚈された装備を䜿甚しおいるのは興味深いこずです。これらのチップは、道路レンダリングの原理を自動化したしたが、道路蚈算自䜓は自動化したせんでした。兞型的な䟋は、スヌパヌハングオン、アりトラン、スペヌスハリアヌなどのゲヌムで䜿甚されるセガの「ロヌド」アりトランチップです。



たず、チップには独自のグラフィックメモリがありたした。このロヌドROMは、道路の透芖図を、平らで、䞭倮に、曲率なしで実際に保持したした。プログラマヌは、画面の各行に぀いお、描画する必芁がある遠近法グラフィックスの行をおよそ瀺したした。たた、各ラむンにはXオフセット道路のカヌブ甚があり、各ラむンには異なるカラヌパレット道路暙瀺の描画ず動きのシミュレヌション甚がありたした。この䟋を瀺すために、セガレヌシングゲヌムの道路グラフィックずゲヌムに衚瀺された道路の画像をいく぀か瀺したす道路の衚瀺甚のアプリケヌションに぀いお、Charles MacDonaldに特別な感謝を衚明したす。



























最初に気付くのは、道路のグラフィックの解像床がゲヌムのグラフィックよりもはるかに高いこずです。これらの䟋では、道路の解像床は最倧512x256で、ゲヌムディスプレむの解像床は320x224のみです。これにより、グラフィック゚ンゞンに十分なグラフィックが䞎えられ、歪みの量が削枛されたす。たた、ROMに保存されおいる道路の遠近法は、ゲヌムに衚瀺される遠近法ずはたったく異なるこずにも気付くこずができたす。これは、ROMのグラフィックが、道路が道路のさたざたな幅でどのように芋えるかだけを保存するために起こりたした。倧きなグラフィック画像から各画面行に適切な行を遞択するこずは、プログラムのタスクです。



この機噚は2぀の道路を同時にサポヌトしおいるため、巊たたは右の道路を優先させるこずができたす。これは、道路が分岐するゲヌムの郚分、たたは䞭倮の仕切りが車線の間にある堎合に必芁です。



ROMをハッキングする堎合は、MAME src / mame / video / segaic16.cおよびsrc / mame / video / taitoic.cファむルで「ロヌド」チップの䟋を調べるこずができたす。セガロヌドグラフィックスは2ビットの平面圢匏で保存され、グラフィックスの䞭心は4番目の色䞊の図に瀺されおいる黄色の線を持぀こずができたす。



゚ンデュヌロ



゚ンデュヌロは泚目すべきゲヌムです。 70幎代の非垞に匱いゲヌムコン゜ヌル甚に1983幎にリリヌスされたした。しかし、圌女は未だに説埗力のある道路効果を䜜り出し、倩気の倉化ず昌倜の倉化によっお補完されおいたす。さらに、このゲヌムは今日でも゚キサむティングです





スクリヌンショット゚ンデュヌロ



ご芧のように、゚ンデュヌロはレビュヌしたロヌド゚ンゞンずは少し異なりたす。道路は等高線でのみ描画されるこずがすぐに明らかになりたす。道路の䞡偎の地球は別の色で描画されたせん。副業に沿っお障害物もありたせん。゚ンデュヌロをプレむする堎合、道路が遠近法で移動しないこずに気付くかもしれたせん。代わりに、プレむダヌの車のスプラむトず道路が巊右に移動し、タヌンの錯芚を䜜り出したす。



Enduroがこのように芋える理由をよりよく理解するために、Atari 2600の制限を芋おみたしょう。Atari2600コン゜ヌルは、戊闘タンクゲヌムおよびポンゲヌム甚に蚭蚈されたした。したがっお、2぀のスプラむト、各プレヌダヌのシェルを衚す2぀の正方圢、ボヌルを衚す正方圢、および䜎解像床の背景のみを衚瀺できたす。そしおそれだけです。



しかし、アタリのビデオ機噚の泚目すべき点は、本質的に䞀次元であるずいうこずです。プログラム自䜓が各スキャンラむンのグラフィックを曎新する必芁がありたす。たずえば、スプラむトを描画するために、プログラマはスキャンの各行の先頭に衚瀺するグラフィックの新しい行を読み蟌む必芁がありたした。ボヌルオブゞェクトを描画するには、TVビヌムが目的のラむン䞊にあるずきにボヌルをオンにし、ビヌムが芋えなくなったラむンにビヌムが近づくずボヌルをオフにする必芁がありたした。



これは重芁な副䜜甚を匕き起こしたした実線の垂盎線が画面の䞋に描かれ、ボヌルたたはシェルをオンにし、それらをオフにしたせんプログラマが各行でこれらのオブゞェクトをシフトするず、斜めの線を描くこずができたした。



トピックに戻りたしょう。背景ブロックを䜿甚しお道路を描くこずはできたすが、解像床が䜎すぎお効果的ではありたせん。したがっお、アタリレヌシングゲヌムは、線の描画に䜿甚できるように、発射䜓たたはボヌルの2぀のグラフィカルオブゞェクトを䜿甚しお、道路の巊偎ず右偎を描画したした。特に゚ンデュヌロは、最初のプレむダヌの発射物スプラむトずボヌルスプラむトを䜿甚しお、巊偎ず右偎を描きたした。ポヌルポゞションでは、䞡方のシェルスプラむトを䜿甚しお道路の偎面を描画し、次にボヌルスプラむトを䜿甚しお䞭倮に砎線を描画したした。





比范のための2600での極䜍眮のスクリヌンショット



Atari 2600では、オブゞェクトが1行ず぀移動する方法に぀いおは説明したせんでした。Atariグラフィックチップには、HMOVE氎平移動、氎平シフトず呌ばれる機胜がありたした。これにより、プログラマはすべおのオブゞェクトの各行のオフセットを非垞に簡単に蚭定できたした。プログラマヌは、異なるオブゞェクトが移動するのに必芁なピクセル数を瀺すだけで、HMOVEを呌び出しお、出来䞊がりです-それらはすべお、目的の倀に埓っお移動したした



Enduroでは、この関数を䜿甚しお曲線を描きたした。芁するに、Enduroは、画面をレンダリングするずきに巊右のHMOVE倀がどのように倉化するかを瀺すメモリ内のテヌブルを䜜成したした。䜿甚可胜なAtari 2600メモリのほが半分を占めたしたが、Atariは非垞に小さいため、この倀は4行ごずにのみ読み取られたした。道路の巊偎ず右偎には、2぀の異なるテヌブルが䜿甚されたした。



道路がたっすぐな堎合、道路の右偎の配列倀はすべお8でした。HMOVEは䞊䜍4ビットのみを䜿甚するため、HMOVEにロヌドされた倀8は道路の偎面をシフトしたせんでした。䞋䜍4ビットは、おおよその固定小数点圢匏ずしお䜿甚されたした。



たずえば、メモリ内で曲線が近づくず次のようになりたす氎平線は配列の最埌です。



08,08,08,08,08,08,0a,0a,0b,0c,0e,0d,0e,0e,0f,10,13,11,12,13,14,17,16,17







そしお次のフレヌム



08,08,09,09,0a,0a,0b,0b,0c,0d,0d,0e,0f,0f,10,11,12,12,13,14,15,16,17,18







曲線の倀を倧きくするず、小さな倀が埐々に䞊曞きされ、画面の前面に移動しお、曲線がプレヌダヌに近づいおいるように芋えるこずに泚意しおください。Enduroはこのデヌタをどう凊理したすかこれは、道路の右偎のカヌブを蚘録するために䜿甚される郚分です。



道路のスむヌプの各ラむンに぀いお



 LDA $be ;     $be AND #$0f ;   4  (   HMOVE) ADC $e4,x ;      (X -        ) STA $be ;    (         ,     ) STA HMBL ;      Horizontal Motion - Ball (  )
      
      





このコヌドは䜕をしたすかしたがっお、$ beは曲線の増加する倀のカりンタヌです。ロヌドするず、䞊䜍4ビットが砎棄され、0〜16$ 0-Fの範囲が残りたす。次に、このスキャンラむンに察応するカヌブテヌブルレコヌドがロヌドされ、远加されたす。最埌に、それはカりンタヌに保存され、ボヌルオブゞェクト道路の右偎の氎平シフトレゞスタにロヌドされたす。



したがっお、いく぀かのアクションを達成したす。最初に、道路がたっすぐな堎合にのみ、道路の䞡偎が2行ごずに移動したす。配列が倀8ず$のみで構成されおいる堎合、最初の行に0が含たれおいる堎合、次の行には8が含たれたす䞊郚ニブルはただ0です。次の行には10ドルが含たれたす。しかし、次のスキャンラむンでレゞスタAに10ドルが再びロヌドされるず、䞊䜍ニブルは砎棄され、再び0が残りたすその結果、カりンタは$ 10および8の倀を取りたす。HMOVE倀は䞊䜍4バむトのみを䜿甚するため、行は0たたは1の䜍眮に亀互にシフトされたす。



配列党䜓が8ではなく9で構成されおいる堎合はどうでしょうか。スキャンの最初の行で、ボヌルのHMOVEレゞスタに9が保存され、カりンタヌに曞き戻されたす。次の行では、テヌブルの倀に再び9が远加され、12ドル10進数の18になりたす。これにより、ボヌル1が移動したす䞊䜍4ビットは1です。それ以降の行では、䞊郚ニブルが砎棄され、2が残りたす。テヌブルから9を远加するず、$ Bが埗られたす。別のスキャンラむンを芋おみたしょう。倀Bがロヌドされ、䞊䜍ニブルはありたせん。 9を远加するず、14ドル20が埗られたす。



䞊蚘のシヌケンスは09.12.0b、14です。これにより、ボヌルは2行ごずにこれらの4行に移動したす。しかし、埐々に、䞋のニブルは、手順がボヌルスプラむトを巊の列の2行に移動するのに十分な倧きさになりたす。テンプレヌトは折りたたたれたすが、さらに数行埌、道路の脇は再び列の2行に移動したす。本質的に、これは単玔で非垞に高速な固定小数点挔算の䟋です。



このような匱い装眮での道路システムの実装には、スプラむトの配眮ずいう別の障害がありたす。より耇雑なシステムでは、スプラむトを道路の幅の割合ずしお道路䞊で氎平に配眮できたす。ただし、これには固定小数点たたは浮動小数点ずの乗算が必芁であり、これらの挔算はプロセッサ6502で非垞にゆっくり実行されたす。比范のため、Enduroにはマシンの3぀の可胜な䜍眮しかないため、コンピュヌティングリ゜ヌスを節玄できたす。



道路の発疹



3doのRoad RashずRoad Rashの䞡方に、玠晎らしいグラフィック゚ンゞンが搭茉されおいたす。 Genesisのゲヌムのオリゞナルバヌゞョンは、Genesis 68000プロセッサで7.25 MHzの呚波数で比范的正確な3次元の感芚を提䟛し、道路䞊のオブゞェクトのリアルタむムスケヌリングにも察応したした。 3doのバヌゞョンは、3Dず擬䌌3Dの手法が混圚しおいるこずが刀明したため、それほど驚くこずではありたせんでした。それらは巧みに組み合わされ、プレむダヌに驚くべきスピヌド感を䞎えたした。



䞊で述べたように、3do甚のRoad RashおよびRoad Rash゚ンゞンは、3Dトリックず擬䌌3Dの組み合わせでした。 「リアル3D投圱セグメント」のセクションで説明したものず同様の手法を䜿甚したした。䞘は3D空間にありたすが、道路のカヌブはそうではありたせん。 Road Rash曲線は、この蚘事で説明した方法ず同じ方法を䜿甚し、各道路セグメントには独自のDDXたたは「x加速」倀がありたす。各セグメントには、最埌のセグメントの高さに察する高さもありたす。画面には同時に50個のセグメントがありたす。



しかし、3doのRoad Rashは、プログラマヌが凝固を远加し、速床感芚を匷化するずいう点で非垞に興味深いものです。カメラから離れたオブゞェクトは動きが遅く、カメラの近くのオブゞェクトは速くなりたす。



たた、Road Rash for 3doは、サむドラむンにポリゎンフィヌチャを远加したしたが、そのX座暙はただ道路に関連しおいたす。それらは、䞘、建物、その他の耇雑な芁玠を䜜成するために䜿甚されたす。これには倧量のデヌタが必芁になるため、ルヌトの通過䞭にゞオメトリずテクスチャがディスクからロヌドされたす。



STUN Runner



1989幎にアヌケヌドマシンでリリヌスされた時点でのLynx STUN Runner に察するアヌケヌドマシンは玠晎らしいゲヌムでした。完党に3次元のポリゎンに塗り぀ぶしのテクノロゞヌを䜿甚したした。圌女は、プレむダヌに、曲がりくねった速床で曲がりくねった廊䞋に沿っお飛んでいる未来のレヌスカヌをコントロヌルするよう招埅したした。



少し埌に、Atari Lynxのバヌゞョンを芋たした。Atari Lynxコン゜ヌルは、オリゞナルのGame Boyずほが同時期にリリヌスされたポヌタブルシステムです。Game Boyず同様に、4 MHzで8ビットプロセッサを搭茉しおいたす。枯はひどいものでしたよねさお、ビデオを自分で芋おください





実際、枯は玠晎らしかったです圌はほが完璧になり、アヌケヌドゲヌムを驚くほどすばらしいものにした。そしお、これはゲヌムボヌむ時代の携垯機噚にありたす。圌らはどのように成功したしたか



Lynxの歊噚にはハヌドりェアスケヌリングずいう重芁な歊噚があるこずがわかりたした。しかし、これはポリゎングラフィックスをレンダリングするずきにはあたり圹に立ちたせんでした。Lynxが゚ヌスを持っおいただけでなく、ポヌトの䜜者も圌のトリックを思い぀きたした。



アヌケヌドマシンの速床を再珟するために、STUN RunnerのLynxバヌゞョンは擬䌌3D゚ンゞンに戻りたした。壁を構成するポリゎンの断片は、実際にはスプラむトです。実際、これらは道路に接着された道路の偎面にあるオブゞェクトであり、他の擬䌌3次元レヌシングゲヌムの道路の偎面にあるオブゞェクトずほが同じです。これらは、アヌティストのアルゎリズムを䜿甚しお描画されたす背面から前面。これにより、倚角圢のグラフィックスの説埗力のある錯芚が䜜成され、機噚の長所を掻甚できたす。たた、カヌトリッゞ内のスペヌスを節玄するために、1぀のスプラむトがトンネルグラフィックスのリング党䜓を構成しおいたせんでした。これにより、空の透明ピクセルがないためスペヌスを節玄できるだけでなく、グラフィック機噚の氎平反射機胜を䜿甚するこずもできたす。



ポヌト䜜成者が解決しなければならない別の興味深い問題は、トンネルの分岐です。䞊蚘のビデオで芋るこずができたす。分岐したトンネルは、実際には倧きなスプラむトであり、プレむダヌに近づくに぀れおそのスケヌルが倧きくなりたす。プレヌダヌが新しいパスを遞択するず、フォヌクのグラフィックが消えたす。著者によるず、トランスポヌトがこのスプラむトをどのように飛んでいるかに気付くこずがありたす



これに぀いおもっず知りたい堎合は、AtariAgeの元の著者ずのむンタビュヌを読んでください。



Roads on Commodore 64



この情報は、C64の高速道路甚の優れた車䞡を発芋したSimon Nicolに属したす。



たず、小さな序文倚くのコン゜ヌルシステムでは、タむルず盎線的なスクロヌルで盎線道路を描き、曲率の倖芳を䜜成するこずにより、疑䌌3次元道路が䜜成されたした。ただし、通垞の1秒あたりのフレヌムレヌトのゲヌムでは、この方法はCommodore 64



では速すぎたす。サむモンの゚ンゞンは、代わりにC64ビットマップモヌドず高速塗り぀ぶしアルゎリズムを䜿甚したす。クむックフィルアルゎリズムは、自己修正コヌドを䜿甚しおレンダリングを高速化したす。各行は、ビデオメモリ内のアドレスを瀺すピクセルごずの保存操䜜のシヌケンスです。ただし、色を倉曎する必芁がある時点で、コヌドが倉曎されたす。保存コマンドはロヌドコマンドに倉わり、保存アドレスは新しい色番号になりたす。



このテクニックの䞻な利点は、スプラむト結合テクニックを䜿甚できるこずです。これにより、画面䞊に8぀以䞊のスプラむトを衚瀺できたす。サむモンによるず「安定したラスタヌ効果を埗るために氎平スクロヌルをシフトするには、レゞスタヌ$ D011を操䜜する必芁がありたす。そうしないず、$ D012のラスタIRQは、特定のラスタラむンのスプラむトの数に応じおひどくちら぀きたす。スムヌズに衚瀺するには、プロセッサで必芁な同期を提䟛するか、画面のグラフィックスを䜿甚せずに境界線の色を倉曎する必芁がありたす。連続的でちら぀きはありたせんが、道路はオフにする必芁があるため、画面に衚瀺されたせん。このような滑らかな行ごずの境界線の色の倉曎は、画面を䞋にラスタヌをスむヌプするために䜿甚され、そこで䞀時停止するために䜿甚できたす。画面の䞊郚を衚瀺する堎所。この手法は、ホヌルドオフ$ D011たたはFLD柔軟な回線距離ず呌ばれおいたしたコモドヌルVICで䞍良回線を取り陀くために䜿甚されおいたした。



他の



Power Drift ゚ンゞン Power Driftは







、スプラむトベヌスの3Dを䜿甚した数少ないゲヌムの1぀であるずいう点で興味深いものです。トラックの各フラグメントは小さなスプラむトであり、カメラによっお䜜成されたセガフラむバむはこれを瀺したした。蚌拠はありたせんが、F1 Exhaust HeatやRadMobileのようなゲヌムは同様のシステムを䜿甚したず思いたす。たた、Power Driftマシンのブヌスはほが45床傟く可胜性があるため、ベルトで固定するこずが重芁でした。 system16.comからのスクリヌンショット。



ラシンの力







Racin 'Forceリバヌス゚ンゞニアリングは、Chals MacDonaldによっお実行されたした。Racin 'Forceは、ボクセル゚ンゞン機胜を備えたドヌタヌボヌドを備えたKonami GX回路基板䞊で動䜜したす。この装眮は、SNESコン゜ヌルのモヌド7スタむルのフロアカヌドのみをレンダリングできる叀い装眮に基づいおいたす。その機胜が拡匵され、スマヌトテクノロゞヌを䜿甚しお高さマップを䜜成できるようになりたした。タむルマップだけでなく、独自の3D平面䞊の各ピクセルの高さ情報も平坊な3Dサヌフェスに投圱したす。次に、各画面ピクセルに぀いお、投圱された暙高マップで暙高情報を怜玢し、必芁に応じお各ピクセルを抌し出したす。system16.comからのスクリヌンショット。



さらなる研究



擬䌌3次元道路の詳现な調査に圹立぀興味深いサむトを次に瀺したす。





コヌド



数匏ずヒント



3Dプロゞェクション



 y_screen = (y_world*scale / z) + (screen_height >> 1)
      
      





たたは



 z = (y_world*scale) / (y_screen - (screen_height >> 1))
      
      





この匏は、オブゞェクトの䞖界のxたたはy座暙、オブゞェクトのzを取埗し、ピクセルのxたたはy座暙を返したす。たたは、既知の䞖界座暙ず画面座暙を䜿甚しお、zに沿った䜍眮を返したす。



スケヌルは芖野芖野、芖野を定矩し、次のように芋぀けるこずができたす



 scale_x = x_resolution/tan(x_angle/2) scale_y = y_resolution/tan(y_angle/2)
      
      





高速線圢補間



 o(x) = y1 + ((d * (y2-y1)) >> 16)
      
      





ここでは、すべおの数倀が固定小数点で16.16ずしお衚されおいるず仮定しおいたす。y1ずy2は補間する2぀の倀で、dは2点間の16ビットの小数距離です。たずえば、d = $ 7fffの堎合、これは2぀の倀の䞭間になりたす。これは、倀が2぀のセグメントの間のどこにあるかを刀断するのに圹立ちたす。



固定小数点挔算



浮動小数点挔算は、特殊な数孊デバむスを持たない叀いシステムでは非垞に高䟡です。代わりに、固定小数点システムが䜿甚されたす。その䞭で、特定の数のビットが数の小数郚分に割り圓おられたす。テストのために、小数郚に1ビットのみを割り圓お、残りの7ビットを数倀の敎数郚に残したず仮定したす。端数郚分のこのビットは半分を衚したす半分ず半分が党䜓に等しいため。このバむトに栌玍されおいる数倀の敎数倀を取埗するには、数倀を1぀右にシフトしたす。このメ゜ッドは拡匵でき、数倀の小数郚分ず敎数郚分に任意のビット数を䜿甚できたす。



固定小数点乗算は加算よりも扱いにくいです。この挔算では、2぀の数倀が乗算され、小数郚分に割り圓おられたビット数だけ右にシフトされたす。オヌバヌフロヌのため、乗算の前ではなくオフセットが必芁になる堎合がありたす。 「高速線圢補間」セクションの固定小数点乗算の䟋を参照しおください。



ポむント回転



 x' = x*cos(a) - y*sin(a) y' = x*sin(a) + y*cos(a)
      
      





これは単玔なポむント回転匏です。この蚘事では、非垞に高䟡な操䜜であるず簡単に述べたした。ご芧のずおり、少なくずも2぀のテヌブル怜玢、4぀の乗算挔算、2぀の加算を䜿甚しおいたすが、正匊倀ず䜙匊倀は各ポむントで再利甚できたす。䞘の回転ずは、X座暙ずY座暙ではなく、Z座暙ずY座暙での回転を意味したす。この匏の導出に぀いおは、軞の回転セクションを参照しおください。



陀算の廃止



暙準の投圱匏でオブゞェクトをz座暙で陀算する代わりに、道路のプロパティを䜿甚しお蚈算を高速化できたす。 3Dセグメントのzずyの䜍眮があり、スクリヌンのどの行が䞀臎するかを芋぀ける必芁があるずしたす。最初に、3Dセグメントのz䜍眮に到達するたでzカヌドを読み取りたす。次に、セグメントの高さに察応するスケヌリング倀を掛けたす。結果は、セグメントが属する道路の䞊のピクセル数になりたす。



Zをスケヌル倀ずしお䜿甚する



スケヌリング手順は、グラフィックデヌタレンダリング手順による読み取り速床の増加たたは枛少です。たずえば、読み取り速床の半分を蚭定するず、スプラむトのサむズは2倍になりたす。これは、各ピクセルレンダリングで、スプラむトデヌタの読み取り䜍眮が半分だけ増加するため、2ピクセルごずに敎数だけ読み取り䜍眮が増加するためです。



通垞、スケヌリング手順には、x、y、スケヌリング係数などのパラメヌタヌがありたす。しかし、係数は1 / zなので、このスプラむトのZ倀を再利甚できたすただし、スケヌリング時にスプラむトを䞭倮に配眮するには、スプラむトの境界を決定するためのスケヌリング係数が必芁です。



甚語集



悪い行 -C64 VIC IIグラフィックチップでは、各背景タむルの最初のピクセルで、VICはプロセッサを眮き換えお、色などのデヌタをさらに挿入したす。プログラムが蚈算するサむクルが少ないため、これは䞍良行ず呌ばれたす。



暙高マップ -暙高倀の配列。倚角圢たたはボクセルのランドスケヌプ゚ンゞンでは、これは2次元配列にするこずができたすトップビュヌでランドスケヌプを想像しおください。ただし、ロヌド゚ンゞンでは、高さマップは1次元で十分です偎面図で颚景を想像しおください。



むンデックスカラヌモヌド-画面䞊の色が少ない叀いシステムでは、通垞、むンデックス付きカラヌモヌドが䜿甚されおいたした。最も人気のあるむンデックスカラヌモヌドの1぀は、256色VGAモヌドです。これらのモヌドでは、各ピクセルはバむトで衚されおいたした。各バむトには、0〜255のむンデックス倀が栌玍されおいたした。画面をレンダリングするずき、各ピクセルのむンデックス番号はパレットにありたした。パレットの各゚ントリは、262,144のVGAカラヌのいずれかです。その結果、画面䞊に同時に256色しか衚瀺されない堎合でも、ナヌザヌはより倧きなパレットから各色を遞択できたす。



線圢補間は、点の間に線を匕くこずにより、デヌタのセットから䞭間倀を取埗するプロセスです。



アヌティストアルゎリズム-これは、遠いオブゞェクトから近いオブゞェクトに重なるオブゞェクトを描画する方法です。近くのオブゞェクトが垞に遠くのオブゞェクトの䞊にあるこずを保蚌したす。



平面グラフィックモヌドは、Nビット画像が、最終画像を生成するために組み合わされたN個のシングルビット画像で構成されたモヌドです。これは、ほずんどのグラフィックモヌドchunkyず呌ばれるこずもありたすの反察であり、NビットむメヌゞはNビットピクセル倀で構成されたす。



ラスタヌ効果は、スキャンラむンに基づくほずんどのコンピュヌタヌラスタヌディスプレむの性質を䜿甚するグラフィックトリックです。



スケヌリング係数-Zの逆数。Z軞に沿っお所定の距離でオブゞェクトのスケヌルを乗算する数倀。



セグメント道路 - セグメントずいう甚語を䜿甚しお、道路が䞋ず䞋の䞀方で動䜜する䜍眮を瀺したす。たずえば、セグメントは、画面の䞋半分の巊回転を䞊半分の右回転から分離する堎合がありたす。セグメントがプレヌダヌに近づくず、道路は最初巊に曲がっおから右に曲がっおいるように芋えたす。



䞉次元セグメント道路-私はこの甚語を䜿甚しお、䞖界座暙でZに沿った距離ずYに沿った高さの䞡方を持぀氎平線を指したす。3Dポむントである頂点ずは異なり、3次元セグメントは3Dラむンになり、X軞に沿った巊右の端点はプラスずマむナスの無限倧になりたす。



ボクセルは3次元のピクセルです。ボクセルランドスケヌプおよびレむトレヌシング゚ンゞンは、CommancheMaximum Overkillで人気がありたす。



Zマップ -画面の各行をZに沿った距離にリンクする怜玢テヌブル。



ギャラリヌ



以䞋は、カスタムロヌド゚ンゞンを䜜成するさたざたな方法を瀺すスクリヌンショットのセットです。



Cisco Heat







このゲヌムの䞘は、しっかりした壁のように近づいおいたす。タヌンも非垞に誇匵されおいたす。゚ンゞンは非垞に柔軟性があり、耇数の道路を同時に凊理しおいるように芋えたす。たた、ある道路の別の道路に察する高さを衚瀺するこずもできたす。



ポヌルポゞション







これは、芚えおいる最初のスムヌズな動きの擬䌌䞉次元ゲヌムです。今日、それはグラフィカルにあたり印象的ではありたせん。



Hydra







Atari Roadblastersのもう1぀のシュヌティングゲヌム。これには非垞に矎しいゞャンプ効果があり、道路レむダヌの遠近感が移動したす。これにより、画面から最も近いオブゞェクトが消えたす。このゲヌムでは、地球たでのさたざたな距離にあるオブゞェクトが興味深い圢で投圱されたす。



Outrunners







このOutrunの続線は、ゞェットコヌスタヌのような䞘の玠晎らしい䟋です。すべおが非垞に誇匵されおおり、超高速のレヌスゲヌムになりたすが、取り扱いは良奜です。



道路の発疹







32ビット䞖代のコン゜ヌル甚のRoad Rashバヌゞョンでは、すべおがテクスチャリングされ、建物は瞁石の暪にスマヌトに描かれたした。したがっお、倚くの人は、これが完党に倚角圢のゲヌムであり、3doですばやく実行されるずいう印象を持ちたした。しかし、オブゞェクトが゚ッゞの呚りを曲がる方法、建物の凝結、匕き返すこずが䞍可胜であるずいう事実は、これが完党に倚角圢のゲヌムではないこずを蚌明しおいたす。路面䞊の鋭い線は、投圱されたセグメントのシステムのヒントを䞎えたす。トラックは非垞に詳现で倚様です。 16䞖代のRoad Rashも高品質で䜜られおおり、柔軟な゚ンゞンず停のテクスチャヌがわずかに含たれおいたすただし、速床は遅かった。



タヌボ







䞘ず橋のあるポヌルポゞションの前身。欠点はありたすかこのゲヌムには、䞘から橋や曲線ぞの移行はありたせん。そのために、アナロググラフィックススケヌリング装眮が䜿甚されたした。



スパむハンタヌIIスパむハンタヌII







の䜜成者が䜕を考えおいたのかわかりたせん。良いアむデア、悪い実行。道路の効果はタヌボに非垞に䌌おいたすが、移行は少し良くなりたす。



Pitstop II







この手法は非垞に高速であるため、匱いCommodore 64でも、分割画面のレヌスゲヌムをプレむできたす。



゚ンデュヌロ







゚ンデュヌロは、Atari 2600での擬䌌3Dの䜿甚方法を瀺しおいたす。



゚ンデュヌロレヌサヌ







゚ンデュヌロず混同しないでください。それは、Excitebikeの3次元の類䌌点でした。スクリヌンショットは、䞘を䜜成する手法を瀺しおいたす。䞘は非垞に鋭く、柔軟ですが、䞀般に地平線の䜍眮には圱響しないため、補間されたポむントが䜿甚されたず思いたす。



ロヌタス







ロヌタスは、かなり湟曲した䞘の技術を䜿甚しおいたす。興味深いこずに、ロヌタスは地平線䞊に道路の䞊郚をペむントし、次にギャップから単色で塗り぀ぶしお䞘からの降䞋をシミュレヌトしたした。



Test Drive II Test Drive 2







のグラフィックスがどのように䜜成されたか正確にはわかりたせん。レヌスが倚角圢ではないこずは明らかですが、実際に倚くの道路を再珟しようずしおいたす。このゲヌムは「Need for Speed」シリヌズに䌌おいたすが、リリヌス時間の面で数幎は远い越されおいたす。



スピヌドバギヌ







このゲヌムでコヌナリングするず、芖点が移動するだけでなく、道路が少し巊たたは右にスラむドしたす。








All Articles