Toucanバーチャル博物館
VRML図鑑 3DCG 展示室   開発日誌 お問い合わせ

トコちゃんの修行日誌 2025年9月

お仕事中デスクトップ

お仕事中デスクトップ

9月17日 ChatGPT-5に丸投げ

ボクセルデータで衝突判定

複雑な処理なのでGPT-5に丸投げではこんな感じです。地面には衝突しているので、法線に問題があるのかな?

処理は1FPS(1秒1描画)まで落ちました。

<追記>

若干の湧き水

若干の湧き水のような水底の流れが発生していますが、まあこのぐらいならいいでしょう。地面との摩擦(粘性抵抗のようなものだろうか)あっても良さそうなので残すことにしました。

GPT-5がボクセル値が負の場合を地面と勘違い(と言うかそこまで指定していなかったのですが)しただけでした。法線の計算もそのため反転していました。

昨日のHeightマップ版をみると、だいぶ水漏れしていたようです。ポリゴンが粗いので深いところが潰れてしまっているのかもしれませんが、地形のボクセル値を使って衝突判定しているので、地面にしっかり沿っています。

自分でコーディングしていたらたぶん数日はかかっただろう。これで一カ月1600円は安い。

9月16日 Heightマップで衝突判定

Heightマップ(高さ画像)で衝突判定してみました。

7FPS(1秒7描画)で動いています。

地面の法線(傾き)は計算コストを下げるため、Heightマップから事前に計算して法線マップを作成しています。

判断材料が高さだけなので真上から見た状態で衝突をしらべることになります。なので崖を横に移動すると、位置が大きく上がったり下がったりします。

それが原因だと思われますが、水中なのに斜面を水が下り、底中央で湧きあがります。深いところで大きく盛り上がっている。

摩擦無し

対策として地面との摩擦を加えてみました。

摩擦有り

だいぶ抑えられ、水面が平らになったのですが、滝ができてしまった。

なんとかなりそうです。 

もう一つ、地形を作成しているボクセルデータで衝突判定する方法を試してみます。データはHeightマップより粗くなりますが、立体なので今回のような問題は発生しないと思います。若干処理が重くはなりますが・・・

9月15日 GameObject (Hybrid) 前途多難

Hybrid

地形の衝突判定をEnitityのコライダーで処理しようと、色々と試したのですが(GPT-5君に頼んで)、どうしてもHitせず(地形として認識しない)、数日1行もプログラムが進みませんでした。

もう、あきらめようかとも思ったのですが、一番簡単な手順、GameObjectで地形をプレハブとして保存、それをサブシーンに配置して自動でEnitityに変換してテストしたら、なんとか動きました。

あまりに処理が重いので20分の1にパーティクル数をへらし、水たまりができました。1フレーム10秒ほどかかります。

前途多難

地形のような複雑なポリゴンで数万個のパーティクルとの衝突を計算するのは無理のようです。

勉強をかねてEnitityでの物理演算unity.physicsを理解しておこうと思いますが、違う方法で考えます。 

<追記>

Enitity用のPhysicsColliderへ地面のメッシュを登録する度に物理演算用の事前処理が必要なのでしょう。スムーズなスクロールができません。Unity組み込みのPhysXの方が軽いです。

物理演算をEnitity用のunity.physicsへ移行を考えていましたがあきらめました。

コンポーネント

地形をプレハブから表示を削除してコライダーだけにしても、自動的に追加されるコンポーネントがこれだけあります。自前のはLandColliderTagだけです。地面水面を種別する目的。

コードだけで作成していたときはLocalTransformとPhysicsColliderの二つだけで試していて失敗していました。プログラムの流れは合っていたようなので、SimullateとかPhysicsWorldIndexとかが必要だったのかもしれません。 

9月10日 CPUからC#へ

ボールプール

まるでボールプールですね。

Copilot+GPT-5にお願いして、GPU(コンピュータシェーダ)の処理をC#に書き直してもらいました。ほぼ完璧に書き直してくれます。7つのステップで処理されてて1つ1つC#に変換してテストしてみました。

C#だと軽い処理で150ms、重い処理だと1000ms(1秒)以上処理に時間がかかります。GPUだと7ステップ全部で0.5ms。GPU処理はとんでもなく速いんですね。

あまりに重い処理なので全部C#で実行してみてはいませんが、たぶん5000ms(5秒)はかかるでしょう。GPUが1万倍速いわけです。

幸いなことに密度や圧力、粘性などの計算のあと、最後に速度から位置を計算して衝突判定しています。ここだけC#のバーストコンパイルで高速化すれば、経験上100倍ほど速くなるので、150msが1.5msに短縮されるでしょう。地形との衝突で処理が重くなっても、なんとかなりそうな気がします。

GPUで処理し、衝突判定だけC#で処理。こんな方針で進めてみます。

衝突判定に必要なUnity組み込みの物理演算PhysXはバーストジョブから使用できず、Unity.Physicsパッケージを使用するようです。Entityとしてメッシュコライダーなど登録する必要があるようで、プレイヤーの移動を改良する必要がでてきました。幸いなことにCharacterControllerの機能はほとんど使っていないので、なんとかなるかな。

まだ作っていない木や岩などの配置もEntityベースになりそうです。草はEntityで配置しています。

9月9日 造成 Landscaping

造成

アクションメニューを選択して、地形の造成ができるようになりました。マーチング四面体用のボクセルデータ用と、高さマップ(HeightMap)や流れマップ(FlowMap)の2Dデータ用。

マップが狭く感じます。すぐにクリップ面にとどいて編集できなかったりします。ゲームの要素として扱うには色々と工夫が必要そうです。

リアルタイムの水の流れのシミュレーションに挑戦してみようかと思います。参考にするのは

Fluidシミュレーション

Coding Adventure: Simulating Fluids

GPU(HLSL)でシミュレーションされていて0.5ms程度で動作しています。すごい。

ボックスのような単純な形ではないので、工夫が必要です。後の続編で小さな地球の海をシミュレーションするときに、地形を3Dテクスチャに変換していました。

そこまですると色々とややこしい。ただでさえ、流れ込み、流れ出し部分でかなりの補正が必要になりそうです。

マップがスクロールしなければ時間的に余裕ができるので、ジョブシステムで同様の計算で試してみようかと思います。目標はこのぐらいの解像度(パーティクル)で15ms。

DOTS(Data-Oriented Technology Stack)なんかも利用することになるのかな?

9月8日 健康診断診察

逆流性食道炎GradeM

胃底腺ポリープ

便潜血検査陽性で、大腸CTを受けました。

そのCT結果

大腸:盲腸にポリープ疑い

肝臓:嚢胞疑い

左副腎:副腎皮質線種疑い、ハゲの進行はこれが原因?

・・・執行猶予で来年、腹部CT+ホルモン採血予定。 

../toucan/TocoDiaryJ.html