wasd - 移動 space - ジャンプ arrow - カメラ e - 設置 q - 破壊
過去の遺物を引っ張り出してきました。 拡張性を間違えたのでここまでです。 turbowarp推奨 https://turbowarp.org/1307667256/fullscreen === 大まかな技術説明(turbowarp前提。sctachでも技術は変わらないがパフォーマンスは極端に落ちる。) === ・ワールドサイズ : 10x10x10チャンク = 80x80x80ブロック = 512,000ブロック ・描画範囲 : 93チャンク(マンハッタン距離≤4のチャンクからx,y,z≤2のクランプを掛けたチャンクを描画) = 47,616ブロック = 571,392三角形相当 ・2d及び3dvalueNoise、2dHashを使用した地形生成及び洞窟生成プログラム ・turbowarp用に再構成した擬似octree及びボクセルの結合 ・BackFaceCulling(BFC)、AdjacentFaceCulling(AFC)、簡易FlustumCullingを使用 これらの内部処理により571392枚の三角形は実行時には500~2000枚の三角形になる。 ・動的更新可能且つチャンク単位の部分更新によるスパイク回避 初期処理 ・初期処理は大きく3段階に分けて処理される。 1: 地形の生成 2: ボクセルの結合及び擬似octreeの生成 3: AFCの適用 擬似octreeとボクセル結合について これがこのプロジェクトのパフォーマンスを大きく引き上げた要因の一つである。 scratchが多次元配列を持てない関係上、木構造を作るには何かと工夫が必要になる。 そこでボクセル空間の座標は連続的ではなく、離散的である(ボクセルの位置は整数値に限定される)ことに着目し、各ボクセル座標に対して、所属空間の位置・サイズ・隣接面情報・ブロック種別を事前計算して保持することで、座標から必要な情報をO(1)で取得できる構造を実装した。(が、実際の描画はこのO(1)参照をうまく扱う方法が思い浮かばず、木を降りるプロセスが入ってしまったことは改善点になると思う。) 同種ブロックで完全に満たされた空間は一つの領域として統合することで、空間分割構造とボクセル結合結果を同一データとして扱えるようにした。これにより、octreeと結合ボクセル、空間単位の当たり判定を個別に管理する必要がなくなり、メモリ使用量と前処理コストを削減している。 またこのプロジェクトは画家アルゴリズムで描画をしているため、通常であれば三角形のzソートが必要になるが、これもこの空間分割を活用してソートをせずに前後順序の整合性を完璧に保つことに成功している。 また、チャンクを採用した理由として、 ブロックの動的更新をした時、データを全て生成し直すのはとても現実的ではないからである。