問題タブ [lerp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 対称的な Lerp とコンパイラの最適化
私は機能を持っていました:
見たことがない人にとってはx0 + (x1-x0)
* alpha、後者はそれを保証しないため、これよりも望ましいlerp(1.0f, x0, x1) == x1.
ここで、lerp関数に追加のプロパティが必要です: I'd like lerp(alpha, x0, x1) == lerp(1-alpha, x1, x0). (理由については、これはより複雑な関数のおもちゃの例です。)私が思いついた、うまくいくように見える解決策は
この二重減算には、0 付近と 1 付近を丸める効果がalpha = std::nextafter(0)あり1 - alpha == 1ます1 - (1-alpha) == 0。私が知る限り、それは常に真実です1.0f - x == 1.0f - (1.0f - (1.0f - x))。という効果もあるそうですw0 + w1 == 1.0f。
質問:
- これは合理的なアプローチですか?
- 自分のコンパイラが自分のやりたいことをやってくれると信頼できますか? 特に、Windows では、部分的な結果に対してより高い精度を使用することがあることを知っています。また、コンパイラが代数を実行できることも知っています。代数的に明らかに 1-(1-x)==x です。
これは、Clang、VisualStudio、および gcc を使用した C++11 です。
c++ - C++/OpenGL で Eigen を使用した四元数による形状補間
Alexa、Cohen-Or、および Levin による2000 年の論文As-rigid-as-possible shape interpolationで説明されているように、クォータニオンを使用して 2 つの三角形間の形状補間を実装しようとしています。
三角形 1 に点 A、B、C があり、三角形 2 に点 M、N、O があるとします。対応する 2 つの行列 (それぞれ T1 と T2) は次のとおりです。
次に、T1 の逆数を取り、それを T2 で乗算して特異値分解を実行し、行列 SVD を取得して、回転行列とスケーリング行列を見つけます。
次に、このクォータニオンと sMatrix を補間に使用します。注: タイマーは 0.0f で開始し、1.0f に達するまで 0.0001f (いくつかの小さな定数) ずつ増加します。変換をアニメーション化します。
次に、元の三角形の各点 P を独自の 3x1 ベクトルに変換し、それを A で乗算します。
最後に、新しい v(0) と v(1) に点を描き、三角形の他の 2 つの頂点について繰り返します。
タイマーが非常に小さい (0 に近い) 場合、元の三角形 (T1) の位置に新しい三角形を取得しますが、タイマーが増加すると、新しい三角形はスケーリングされ、T1 から離れて移動しますが、最後の三角形に向かって移動しません。 (T2)。
T1.inverse() を取得して T2 を掛けて計算した行列を使用するだけで、線形補間が機能するようです。したがって、私の問題は slerp の実装または SVD にあると思いますが、よくわかりません。
どこが間違っていたのかを判断するのに役立つ、他に含める必要があるものはありますか?
編集: Stime 行列を追加し、V 行列で転置の呼び出しを切り替えました。