top of page
怜玢
  • ハッピヌ゚ンド過激掟

りディタで3Dゲヌムを䜜成した際の考え方改

曎新日2022幎1月26日

1幎ぶりにこの蚘事を芋たらものすごく分かりづらかったので曞き盎したす。


「砲火を駆ける」ず「むナズマラむゞング」をベヌスに蚘茉しおいたす。



床の描画方法

 

■マップの生成

  • マップを碁盀のように考え、各マスを座暙099、座暙09900ずする

  • X=0,Y=0からXを1぀ず぀増やし、99たで䜜成したら0に戻しYを1増やす

  • マスの幅は任意の生成間隔×X又はYずなる

  • Z座暙は䞀定で眮くか、高䜎差を出したい堎合は可倉DBに蚘録する

  • 高䜎差ずRGBを連動させるこずで自然なマップを生成する

  • 高䜎差に぀いおはらたさんのツむヌトを参考にしたした

  • 䜜成した床デヌタは可倉に栌玍する

  • 䟋えば、X50番目の座暙,Y50番目の画像は可倉の4949番に栌玍される

  • ぀たり、マップは10000マス100×100マスになる可倉䞊限

  • マップ遷移のむベントを䜜るこずでより広いマップは䜜れる


ランダム高䜎差&RGB連動のマップ




■衚瀺するマップ範囲の特定

  • 芖点の座暙を通垞倉数で管理し、芖点の座暙から呚蟺の座暙を調べる

  • この時、蟺瞁の座暙の堎合に透明床を䞋げる凊理をするずより良い

  • 透明床に぀いおはらたさんのツむヌトを参考にしたした

  • 䟋えば4949番からX-1は4948番に栌玍され、Y-1は4849番に栌玍されおいる

  • さらに芖点の向きに応じお衚瀺するマスをカットする

  • これにより10000マスのデヌタのうち60マス皋床のデヌタのみ凊理する


■マップの描画

  • 各床の栌玍デヌタから床の䞭心座暙を取埗し、床のサむズから各頂点のXY座暙を蚈算する

  • 䟋えばX-Y-のX座暙,Y座暙・X-Y+のX座暙,Y座暙などずなる

  • 各XY座暙に぀いお3D描画時の座暙に倉換する

  • 倉換の手順は以䞋のずおり


  1. 頂点のXYZ座暙芖点のXYZ座暙により、芖点を原点ずする頂点のXYZ座暙を求める

  2. 埗られたXY座暙ずりディタの角床機胜を䜿い、芖点から芋た頂点の方䜍角Ξシヌタを埗る

  3. 方䜍角Ξは3D描画時、暪方向の描画䜍眮ずなる

  4. 方䜍角Ξずりディタの䞉角関数機胜を䜿い、sinΞずcosΞを求める

  5. ここで、頂点たでのXY距離rはY座暙/sinΞ又はX座暙/cosΞで埗られる

  6. sinΞ又はcosΞが0に近いず0陀算で描画が厩れるので絶察倀を䜿い堎合分けする

  7. ここで、距離rずZ座暙は䞊蚘2.ず同様の関係にある

  8. 距離rずZ座暙から仰角φファむを埗る

  9. 仰角φは3D描画時、瞊方向の描画䜍眮ずなる


  • 䞊蚘手順により、任意のXYZ座暙の芖点から芋た方䜍角Ξず仰角φが分かる

  • あずは①芖野䟋えば0°から60°の範囲に入るか②芖野のどの䜍眮に描画されるかを以䞋の手順により求める


  1. 方䜍角Ξ方䜍角方䜍角の範囲/2により、巊端からの頂点の描画䜍眮が分かる

  2. 䟋えば芖野が0°から60°のずき方䜍角Ξが40°なら40/60×画面暪幅で画面の右あたりに描画する

  3. 逆に方䜍角Ξが90°なら画面倖に存圚するため描画しない

  4. 同様に角床φ仰角仰角の範囲/2により、䞊端からの描画䜍眮が分かる

  5. 各頂点の3D描画XY座暙を求め、ピクチャ自由倉圢機胜の各項目に蚈算結果を入れおいくず描画できる


  • 䞊蚘の凊理は呌び出しコモンにしおナニット描画にも甚いる


ナニットの描画方法


■ナニットの頂点座暙の登録

  • ナニット描画も床描画ず座暙倉換の考え方は同じ

  • 異なる点は、①立䜓②耇数のパヌツから構成される③陰になる郚分を消す必芁がある④向きが倉わるこず

  • なお、理屈䞊は䞉角圢・四角圢のポリゎンを組み合わせるこずで耇雑な立䜓を描画できるが、凊理量的に難しい

  • そのため、四角圢を3枚組み合わせた盎方䜓でナニットを圢䜜る

  • 具䜓的な手順は以䞋のずおり


  1. ナニットDBでナニットの䞭心座暙や角床、パヌツ皮類起点パヌツ番号ず終点パヌツ番号を管理する

  2. パヌツDBにパヌツ番号に察応しお連番でパヌツ情報を登録しおおく

  3. パヌツ情報にはナニット䞭心座暙からのパヌツ䞭心座暙差分、さらにパヌツ䞭心座暙差分からの各頂点の座暙差分を栌玍しおおく


  • 以䞊によりナニット座暙+パヌツ座暙差分+各頂点差分でXYZ空間におけるナニットの各頂点座暙を取埗できる

  • 描画の前に陰面消去ず座暙の回転を行う必芁がある


■陰面消去


  1. りディタは3D描画手段が自由倉圢に限られるため、陰面消去をピクチャ番号による優先順䜍操䜜でしか管理できない

  2. 芖点から各ナニットの各パヌツの䞭心座暙ぞの距離が近いほどピクチャ番号を高くする

  3. 距離は√X^2+Y^2+Z^2だが、比范だけなら√は䞍芁になる

  4. 2.ではバブル゜ヌトずいう゜ヌト方法を䜿う

  5. ナニット順-パヌツ順に描画DBにパヌツの情報を栌玍し、あわせお描画DBの栌玍番号ず距離を゜ヌトDBに栌玍する

  6. ゜ヌトDBの距離を1番目から比范しおいき、最埌のDB番号のデヌタず最倧のデヌタを入れ換え、カりント数を1枛らすこずを繰り返す

  7. 䞊蚘凊理により゜ヌトDBが距離順に゜ヌトされるので、この順番にパヌツを描画するこずで距離の近いパヌツが前面に衚瀺される


  • 以䞊がりディタにおける陰面消去の方法になる

  • 次に座暙回転の凊理で、座暙回転はナニットの向き倉曎に䜿う

  • 応甚ずしおパヌツ単䜍での向き倉曎、瞊方向ぞの向き倉曎があるが、ここでは暪方向ぞの向き倉曎のみ扱う

  • パヌツ単䜍での向き倉曎は䟋えば顔だけ暪を向くなどの衚珟で、座暙回転の凊理をパヌツ䞭心座暙差分ず頂点座暙差分にそれぞれ行うこずで実行できる

※3次元回転座暙

  • 瞊方向ぞの向き倉曎は攻撃時に腕を䞊げるなどの衚珟で、以䞋蚘茉する暪方向ぞの座暙回転に加え瞊方向ぞの座暙回転を行うこずで実行できる

  • 自分のやり方だずX軞→Z軞で回転しお、以䞋の匏で䞊手くいきたした。

X'=XcosΞ+YsinΞcosφ+ZsinΞsinφ
Y'=-XsinΞ+YcosΞcosφ+ZcosΞsinφ
Z'=-Ysinφ+Zcosφ

■暪方向ぞの座暙回転


  1. 回転前のパヌツ䞭心XY座暙差分+頂点XY座暙差分のXY座暙をあらかじめDBに登録したXY座暙だずするず、ナニットが方䜍角Ξだけ回転した埌の同X'Y'座暙はX'=XcosΞ+YsinΞ,Y'=YcosΞ-XsinΞずなる

  2. この凊理は2Dの方向転換でもよく䜿うず思われる


■ナニット描画


  1. 以䞊の手順を螏たえ、描画する

  2. ナニットDBずパヌツDBから芖点パヌツ間の距離を蚈算し、バブル゜ヌトで゜ヌトDBに栌玍する

  3. ゜ヌトDBに蚘録した怜玢番号順にパヌツDBから立䜓の各頂点座暙を取埗する

  4. 各頂点座暙をナニットの方䜍角に応じお回転させる

  5. 回転した各頂点座暙を3D描画座暙に倉換する

  6. 立䜓の面䞊、前、巊などのみ描画するブロックの぀の頂点のうち最も芖点ずの距離が近い頂点に察応した面を衚瀺する


その他


■圓たり刀定

  • 前提ずしお、圓たり刀定はSTG同様XY平面䞊で蚈算しおも十分ゲヌムになりたす

  • 以䞋の蚘事の円ず四角圢の圓たり刀定は分かりやすく、3Dぞの拡匵も簡単そうです

  • http://2dgames.jp/2012/05/22/2d%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E5%BD%93%E3%81%9F%E3%82%8A%E5%88%A4%E5%AE%9A/

  • 私は䞊蚘の蚘事を読たず、以䞋のコモンを参考に四角圢の点を点ず぀、他の四角圢の点に察し内倖刀定倖積を䜿うをやるずいう凊理をやりたした

  • https://silsec.sakura.ne.jp/WolfRPGEditor/CommonList/html/tdv241.html

  • 内積及び倖積は䞋蚘のHPが䞀番分かりやすかったです

  • http://www.deqnotes.net/acmicpc/2d_geometry/products


■移動凊理・TPS芖点

  • XY平面䞊における移動距離は方䜍角ΞのずきX方向に+sinΞ、Y方向に+cosΞ

  • 远尟時は角床が巊右反転するため3600+i-Ξを芖点の方䜍角ずする


取り組み䞭のもの


■屋内マップの䜜成・自動生成

  • ▌型のタむル描画1,3,5,7,9,11,13,15

  • 壁倖の描写をカットする

  • 操䜜ナニットの圓たり刀定

  • 芖点の圓たり刀定

  • Excel䞊でマップを䜜成しVBAで可倉DBに読み蟌たせる

  • テクスチャも考慮


■倚面䜓(枈)

  • 面を可倉DBの[XX:●:XX]の●で管理するこずで1䞇面䜓たでは䜜れる

  • 各面は䞉角圢か四角圢

  • 床描画の重さから掚枬するず癟面䜓くらいが限界か

  • 面ごずに陰面消去する

  • テクスチャなどは぀けやすい

  • 球䜓や䞀枚絵的なシヌンで䜿うこずを想定しおいる

  • 点矀からメッシュを䜜成する方法があったが、面の情報をあらかじめ入れた方が早い

  • Excelで点の座暙を蚈算し可倉DBに読み蟌む


■自然なマップタむル枈碁盀からランダム頂点か぀頂点に高さを加える

  • 空間䞊の平面は぀の座暙から方皋匏を求められるらしい、぀たり床を䜜成する際に頂点぀を決めればあずの点の座暙がXY座暙を決めるず勝手に決たる

  • aX+bY+cZ=0らしい

  • あるいは䞭心座暙を䜿っおも良い

  • これによりなだらかな高さを䜿った面を描写できるはず

  • 法線ベクトルから平面の方皋匏を求める方法

  • 法線ベクトルの蚈算匏

  • ちなみに䞊蚘匏に圓おはめるずマスABCDのDの高さはAの高さ+ABの高さ差分+ACの高さ差分ずなる

  • 方皋匏は䜿わず-10+10の乱数で問題なくいけたした


■枈なだらかな高さを持぀床に察するあたり刀定ずナニット高さ調節

  • 平面に察する圓たり刀定に぀いおも、䞻人公の䞭心座暙を盎䞋のタむルの平面の方皋匏に代入するずが求たり面の现かい座暙を取埗できる

  • さらに移動時のZ座暙の差分を取埗するこずで䞀定の募配以䞊は進めない=床ではなく壁になる凊理ができる

  • 衚瀺順の課題は残るが倢はある

  • ランダム高䜎差がかなり自然なので壁凊理は䞀旊眮いずきたす


■枈ナニットモヌション

  • パヌツごずに角床ず座暙を管理するこずでモヌション管理ができる

飛行モヌション

歩行モヌション





䜕かあれば远蚘したすが、䞀旊ここたでずしたす。読んでいただきありがずうございたす。


閲芧数469回0件のコメント
bottom of page