回転体を作る関数なので、回転軸をずらせば球ではなくトーラスになる。ここからトーラスの法線を求めるべく悪戦苦闘が始まるのだった
シェーダーで陰影をつけれるように頂点バッファが法線ベクトルを持つように設定変更したけど頂点情報もピクセルシェーダーの計算も作ってないからとりあえず座標と同じ物をぶちこんだらカラフルドーナッツになった pic.twitter.com/4rpBcBXtlf
2023-12-17 02:34:19微分何も分からなすぎて一日かけて {f(x)g(x)}' = f'(x)g(x) + f(x)g'(x) を導出しかけて、「なんか見たことあるなこれ」ってなった。積の微分公式だった
2023-12-17 21:11:53NURBSの面上の法線ベクトルが欲しい ↓ 法線ベクトルを得るには接面の情報がいる ↓ 接面を求めるには偏微分が必要 ↓ 偏微分をするには有理基底関数の微分が必要 ↓ 有理基底関数は漸化式なので漸化式を微分する方法が必要 ↓ 漸化式は関数の積と和で表されているので積の微分公式が必要
2023-12-17 21:20:07このリプが神すなわちゴッド
@kazatsuyu 私もよく知りませんが微分に使っていました。 kamino.hatenablog.com/entry/dual_num…
2023-12-17 21:49:21@kazatsuyu (NURBS の計算に限定するのであれば、基底関数の導関数をゴリゴリ書いたほうが効率的な計算ができると思いますが)
2023-12-17 22:04:23@suzuki_ith まあ現時点で全然計算は最適化されてない(公式をナイーブに実装したので全探索して係数0の項を拾ってたりする)のでそういうのは後で考えます。とりあえず正確な値が出てくれば良い
2023-12-17 22:09:31一変数関数の微分で使う二重数は 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概ね同じ方向の面が同じような色になっているので法線ベクトルっぽいものは計算できてるみたいなんだけどなんかおかしいんだよな……。なんでこんなウロコみたいな模様になっちゃうのか pic.twitter.com/HHG83gExND
2023-12-19 00:54:37VertexBufferLayout::offset の意味を勘違いしてたって訳 pic.twitter.com/bJCkOnZa3p
2023-12-19 01:09:25VertexBufferLayout::offsetは、一つの頂点バッファに複数の情報を入れる時、2つ目以降の頂点情報へのオフセットを表すものなのですが、今のところ頂点座標と法線は別の頂点バッファに入れているので0で良かったのにわざわざオフセットを指定したためずれが生じていたというオチでした
そしてここからこのシワとの格闘が始まる
陰影が付いた。けどなんか奥の所皺寄ってるみたいになってるの変なんだよな。多分ここNURBSの切れ目なんだけど。切れ目と言っても点は重ねているので違う結果になるのはなんかおかしい pic.twitter.com/Uj1KT96YCI
2023-12-19 01:20:52シェーダー書き間違えるといちいちパニックするのがウザかったのでbuild.rsでnagaのパースとバリデーションを走らせることで解決した
2023-12-19 21:47:54接合箇所に生まれた皺を取り除こうとした結果、全ての二重点に皺が生まれてしまった pic.twitter.com/s6YZH9B2ZL
2023-12-21 01:02:09ポリゴン数増やして二重点に重ならないよう微妙にずらす処理を入れた所変な皺はなくなったのでやはり二重点の計算のみが問題なんだなあ pic.twitter.com/t2YmlFATyS
2023-12-21 21:43:12