Rust(wgpu)でNURBS曲面を描画できるようになるまで

4

とりあえず2次元のNURBS構造体を定義して、そこから頂点座標を取り出し、頂点座標はそのまま、色は単色のシェーダーで表示したところ。なぜか点線になる

白山風露 @kazatsuyu

なんか描画は点線になってておかしいけどNURBS曲線の座標計算はおかしくないようなのでヨシ! 描画の方もとりあえず頂点バッファに渡した座標がシェーダーまで渡っているのでヨシ! pic.twitter.com/9pF0pq6FTE

2023-12-12 02:29:57
拡大
白山風露 @kazatsuyu

まあwgpuのデフォルトがVulkanってだけなのでDirectXにもできるけど

2023-12-12 02:34:28
白山風露 @kazatsuyu

DirectX12だとこう。見た所なにも変わらんけど(それはそう)(そう簡単に変わってもらっちゃ困る) pic.twitter.com/zL8xQ06gy7

2023-12-12 02:38:33
拡大
白山風露 @kazatsuyu

プリミティブの設定変えたらちゃんと線になった pic.twitter.com/meUxeYh6Pm

2023-12-12 03:33:46
拡大
白山風露 @kazatsuyu

NURBS、数式をナイーブにプログラムに落とし込んでとりあえず動くようにはなったけど、ほとんど0になる項の総和を取ってるから多分かなり無駄が多いんだよな

2023-12-13 01:55:44

2次元はうまく行ったので3次元に拡張して、曲面を表す構造を作り、円柱を表示したところ

白山風露 @kazatsuyu

よし、NURBS曲面の構造体から思った通りのポリゴンが作れた pic.twitter.com/TLc6qxcqte

2023-12-13 03:48:08
拡大

ここでようやくカメラを設定して、シェーダーを多少進化させた。線の色が黒くなったりしているのは、z座標を可視化しようとした名残

白山風露 @kazatsuyu

回転体らしきものを作ったつもりなんだがポリゴンの計算がおかしくて暴れているな……。制御点の枠(白いやつ)はみ出してるし…… pic.twitter.com/C0ASPYFSfq

2023-12-13 23:41:44
拡大
白山風露 @kazatsuyu

カメラ動かせないとデバッグしづらいし、カメラ以外でも色々数値をいじれるようにと思ってeguiを導入したら動くようになるまで大変だった

2023-12-16 01:34:04
白山風露 @kazatsuyu

カメラ動かすだけならマウスでもいいのだが

2023-12-16 01:37:06
白山風露 @kazatsuyu

ウニとか言われたけどカメラを動かせるようにして観察すると実際は「何この……何?」みたいな形になっていることが分かった pic.twitter.com/P0T41Jaugm

2023-12-16 10:20:32
拡大
白山風露 @kazatsuyu

円を直径を中心にして回転させたつもりなので制御点が立方体になっているのは正しくて、ポリゴン化の際の頂点座標計算が間違っているはず

2023-12-16 10:27:44
白山風露 @kazatsuyu

ポリゴンが暴れるのは抑えたけど思ってたのと形が違う pic.twitter.com/WQfBqibcON

2023-12-16 13:25:31
拡大

ついに思った通りの形(球)が表示できたところ。「球を作る専用の関数」を実装したわけではなく、「円を作る関数」と「線から回転体を作る関数」の組み合わせで球にしている

白山風露 @kazatsuyu

何を間違えていたかと言うと、制御点のはじまりを正方形の辺の中心にしなければいけないところを角にしてしまったところ

2023-12-16 14:12:36
白山風露 @kazatsuyu

一旦シェーダーに環境光導入して陰影くらい付けるか

2023-12-16 15:12:43
白山風露 @kazatsuyu

自分の書いた3Dのコードでカメラ動かせるようになると無限に遊んでしまって作業が進まない

2023-12-17 01:51:43