PLATEAU 最適化

提供: ディーズガレージ wiki
2021年7月2日 (金) 11:04時点におけるShogooda (トーク | 投稿記録)による版 (LOD)

移動先: 案内検索

Project PLATEAU データセットを最適化、軽量化してみます。

Viewer

Qr PLATEAU.png

具合

GLB L: 8192x8192
GLB M: 4096x4096
GLB S: 2048x2048
(*): LOD付き

新宿 池袋
53394525 53394526 53394535 53394536 ALL 53394577
FBX (MB) 1,830 1,180 2,190 1,860 7,060 432
FBX テクスチャ (枚) 1,487 453 1,012 1,042 3,994 1,866
GLB L Draco (MB) 30 21 34 29 115 42
GLB M Draco (MB) 11 8 13 11 45 18
GLB S Draco (MB) 4 (6) 3 5 5 21 9
triangles 最大 115,582 67,094 126,598 130,902 440,176 180,153
geometries 最大 798 492 1,131 1,054 3,427 1,866
textures 最大 6 4 6 5 21 10
draw calls 最大 786 480 1,119 1,042 3,427 1,866

メモ


地形
GitHub - domlysz/BlenderGIS

3D Tiles
GitHub - NASA-AMMOS/3DTilesRendererJS

CityGML
https://ascii.jp/elem/000/004/044/4044198/

XR
How to create VR content - three.js docs
WebXR ポリフィル - MDN - Mozilla

AI
スペースデータ

SameSite Cookie 警告出てる

環境

データセット 3D都市モデル 東京都23区(FBX 2020年度)
DCCツール unity, 3dsmax, photoshop

配慮が必要

Unity 2020.1.13f1 FBX Exporter UVの欠落なし まれにあり
Unity 2018.3.6f1 FBX Exporter UVの欠落あり
3dsmax 2017 FBX Import 一部がマルチタイル(3dsmax 2017新機能)は都合悪い
3dsmax 2014 FBX Import 全てビットマップ
3dsmax 2017 ジオメトリ226個目のベイク処理でエラー
3dsmax 2014 ジオメトリ219個目のベイク処理でエラー
photoshop script ファイルをレイヤーとして読み込み
200枚は途中でエラー 50枚程度はOK メモリ容量の問題?

変換

FBX1個につきオブジェクト数とオブジェクト名は変更せず、
メッシュの頂点連結とテクスチャとマテリアルを数個にまとめる
建物200棟を1枚にベイクを目安にしてみる

メッシュ

Unity 2020.1.13f1

1.新規project
  MeshOptimizerWindow.cs
  PlateauLod2FbxImporterWindow.cs
  FBX Exporter
2.fbxとfbmディレクトリを同時にドラッグアンドドロップでインポート
  Hierarchyに配置
3.PLATEAU Mesh Optimizer
4.Hierarchyに作成される変換データ
  Export to FBX
  同名になるので末尾に_newなど名前変更
  off: Compatible Naming

3dsmax 2014

5._newのfbx読込み
  アセットトラッキング修正
  MAX保存

3dsmax 20xx

6.MAX読込み
  目立つUVの欠落修正
7.バウンディングボックス修正
  ジオメトリ全て選択
  基点調整 > 基点にのみ影響 > 位置合わせ: 中心オブジェクト
  MAX保存

テクスチャ

3dsmax 20xx

1.MAX読込み
2.ジオメトリ200個でグループ分け
  533945**_bldg_6677_001
  533945**_bldg_6677_002
  533945**_bldg_6677_003
  ...
3.グループ1つ選択
4.UVWアンラップ > チャネル 2(移動)
5.UVエディタ > マッピング > フラッテンマッピング
6.テクスチャレンダリング
  保存先 グループ同名フォルダ作成
  一般設定 > 出力 > パス > グループ同名フォルダ指定
  off: レンダリングフレームウインドウ
  マッピング座標 > 既存チャネルを使用 > チャネル 2
  出力 > 追加 > DiffuseMap
  ターゲットマップスロット 空を選択
  8192x8192
  画像形式の指定
    A."選択オブジェクト" > "個別設定" に変更
    B.ファイル名とタイプの設定が可能
       PNG アルファ付 保存
    C.ベイク処理するオブジェクト > "プリセットを保存"
    D."個別設定" > "選択オブジェクト" に戻す
    E.ベイク処理するオブジェクト > "プリセット選択"
  レンダリング
7.MAX保存

photoshop

8.50枚でフォルダ分け
9.ファイル > スクリプト > ファイルをレイヤーとして読み込み
  表示レイヤを結合
  全て合成
  背景レイヤ黒追加
  FBXと同名保存

作成グループで繰り返し

マテリアル

3dsmax 20xx

1.グループ1つ選択
2.UVWアンラップ > チャネル 2 > 1(移動)
3.新規マテリアル グループと同名 ベイク画像設定
4.頂点連結 0.0cm
5.グループ解除
6.MAX保存
7.クリーニング
   FBX書き出し
   FBX読込み

GLB

3dsmax 20xx
GitHub - BabylonJS/Exporters
3DS MAX Plugin | Babylon.js Documentation
Draco compression | Babylon.js Documentation
Node.js
gltf-pipeline

マテリアル修正

スペキュラカラーとスペキュラレベルは、3dsMaxで2つの属性に分割され、Babylonでマージされます。
グローバル値の場合、鏡面反射色とレベルが乗算されて、Babylonで結果の鏡面反射色が得られます。

Babylon exporter01.jpg

Babylon Exporter

Output format: glb
Model path: *****
✓ Export Materials
✓ Export Textures
Texture quality: 50
✓ Use Draco compression
✓ Write Textures
✓ Overwrite Textures

LOD

WebGLビューワ向けに最適化、軽量化してみます。

モデル(main)にリダクションモデル(lod)を追加
テクスチャとマテリアルは共有
距離に応じてmainとlodを表示切替え

3dsmax 20xx
Babylon exporter02.jpg

1.親がダミーの子ジオメトリはグローバル座標計算コストが高い 全てのジオメトリを親に変更
2.全てを複製しグループmainとlod作成
3.lodの処理が重いのでlod下層で100個にグループ分け
4.lod下層グループ1つ選択
5.プロオプティマイザー
  ✓マテリアル境界を保持
  ✓テクスチャを保持
  □UV境界を保持
  > 計算 > 頂点34% 新宿ALLの場合 15万÷44万
6.lod下層グループで繰り返し
7.max保存
8.lod下層グループ解除 mainとlodに
9.GLB書き出し

Viewer LOD検証
メモ
距離​LODでなく見かけの大きさでLOD or アスペクト比でLOD距離変更?
ジオメトリ名で操作する場合lodグループは信用できない mainとlod紐付けしたい > 名前の一括変更スクリプトは?

three.js

        function animate() {
            if (scene.getObjectByName('main')) {
                scene.getObjectByName('main').traverse(function (child) {
                    if (child.isMesh) {
                        if (camera.position.distanceTo(child.position) > 10) {
                            child.visible = false;
                        } else {
                            child.visible = true;
                        };
                    };
                });
            };
            if (scene.getObjectByName('lod')) {
                scene.getObjectByName('lod').traverse(function (child) {
                    if (child.isMesh) {
                        if (camera.position.distanceTo(child.position) > 10) {
                            child.visible = true;
                        } else {
                            child.visible = false;
                        };
                    };
                });
            };
            renderer.render(scene, camera);
        };

データ

533945_shinjuku_fbx.zip
533945_shinjuku_glb_draco.zip

更新履歴

  • 2021.06.16 バウンディングボックス修正
  • 2021.06.05 Dracoに変更
  • 2021.05.21 見直し
  • 2021.04.04 公開