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

4

回転体を作る関数なので、回転軸をずらせば球ではなくトーラスになる。ここからトーラスの法線を求めるべく悪戦苦闘が始まるのだった

白山風露 @kazatsuyu

シェーダーで陰影をつけれるように頂点バッファが法線ベクトルを持つように設定変更したけど頂点情報もピクセルシェーダーの計算も作ってないからとりあえず座標と同じ物をぶちこんだらカラフルドーナッツになった pic.twitter.com/4rpBcBXtlf

2023-12-17 02:34:19
拡大
白山風露 @kazatsuyu

今日は一日微分何も分からないをやっていました。

2023-12-17 21:08:28
白山風露 @kazatsuyu

微分何も分からなすぎて一日かけて {f(x)g(x)}' = f'(x)g(x) + f(x)g'(x) を導出しかけて、「なんか見たことあるなこれ」ってなった。積の微分公式だった

2023-12-17 21:11:53
白山風露 @kazatsuyu

NURBSの面上の法線ベクトルが欲しい ↓ 法線ベクトルを得るには接面の情報がいる ↓ 接面を求めるには偏微分が必要 ↓ 偏微分をするには有理基底関数の微分が必要 ↓ 有理基底関数は漸化式なので漸化式を微分する方法が必要 ↓ 漸化式は関数の積と和で表されているので積の微分公式が必要

2023-12-17 21:20:07
白山風露 @kazatsuyu

積の微分公式を覚えていたら話は簡単だったんだけど、何も覚えてなかったのでググれば一発で出てくる情報を手探りで探す必要があった

2023-12-17 21:22:59

このリプが神すなわちゴッド

白山風露 @kazatsuyu

@suzuki_ith 二重数って微分に使えるのか。良く理解してないけど二乗の項が消えるのがいいんですかね

2023-12-17 21:32:56
suzuki_ith @suzuki_ith

@kazatsuyu 私もよく知りませんが微分に使っていました。 kamino.hatenablog.com/entry/dual_num…

2023-12-17 21:49:21
白山風露 @kazatsuyu

@suzuki_ith なるほど、値と導関数を同時に計算できるのか。原理は理解してないけどやり方は分かりました

2023-12-17 22:02:50
suzuki_ith @suzuki_ith

@kazatsuyu (NURBS の計算に限定するのであれば、基底関数の導関数をゴリゴリ書いたほうが効率的な計算ができると思いますが)

2023-12-17 22:04:23
白山風露 @kazatsuyu

@suzuki_ith まあ現時点で全然計算は最適化されてない(公式をナイーブに実装したので全探索して係数0の項を拾ってたりする)のでそういうのは後で考えます。とりあえず正確な値が出てくれば良い

2023-12-17 22:09:31
白山風露 @kazatsuyu

二重数の拡張、色々あるみたいだな

2023-12-18 03:31:19
白山風露 @kazatsuyu

二階微分したければそれ用の項を導入すればいいし、偏微分したければやっぱりそれ用の項を導入すればいいと……

2023-12-18 03:33:54
白山風露 @kazatsuyu

一変数関数の微分で使う二重数は a + bε だけど、2変数関数の微分では a + bε + cζ (ε^2 = ζ^2 = εζ = 0) と表現する数を使って、 f(x, y) に対して f(x1 + ε, y1 + ζ)を求めると、εの係数が ∂/∂x{f(x, y)} の(x1, y1) での値になって、 ζの係数が ∂/∂y{f(x, y)} の (x1, y1) での値になると……

2023-12-18 03:44:36
白山風露 @kazatsuyu

概ね同じ方向の面が同じような色になっているので法線ベクトルっぽいものは計算できてるみたいなんだけどなんかおかしいんだよな……。なんでこんなウロコみたいな模様になっちゃうのか pic.twitter.com/HHG83gExND

2023-12-19 00:54:37
拡大
白山風露 @kazatsuyu

VertexBufferLayout::offset の意味を勘違いしてたって訳 pic.twitter.com/bJCkOnZa3p

2023-12-19 01:09:25
拡大

VertexBufferLayout::offsetは、一つの頂点バッファに複数の情報を入れる時、2つ目以降の頂点情報へのオフセットを表すものなのですが、今のところ頂点座標と法線は別の頂点バッファに入れているので0で良かったのにわざわざオフセットを指定したためずれが生じていたというオチでした

そしてここからこのシワとの格闘が始まる

白山風露 @kazatsuyu

陰影が付いた。けどなんか奥の所皺寄ってるみたいになってるの変なんだよな。多分ここNURBSの切れ目なんだけど。切れ目と言っても点は重ねているので違う結果になるのはなんかおかしい pic.twitter.com/Uj1KT96YCI

2023-12-19 01:20:52
拡大
白山風露 @kazatsuyu

シェーダー書き間違えるといちいちパニックするのがウザかったのでbuild.rsでnagaのパースとバリデーションを走らせることで解決した

2023-12-19 21:47:54
白山風露 @kazatsuyu

接合箇所に生まれた皺を取り除こうとした結果、全ての二重点に皺が生まれてしまった pic.twitter.com/s6YZH9B2ZL

2023-12-21 01:02:09
拡大
白山風露 @kazatsuyu

まあ、ある意味進展ではある。どういう所に問題がありそうかはなんとなく分かってきたので……

2023-12-21 01:02:52
白山風露 @kazatsuyu

ポリゴン数増やして二重点に重ならないよう微妙にずらす処理を入れた所変な皺はなくなったのでやはり二重点の計算のみが問題なんだなあ pic.twitter.com/t2YmlFATyS

2023-12-21 21:43:12
拡大