座標から角度を求めるatan2
フラグメントシェーダーを使っててある場所とある場所の角度を求めたい時がある。今回はGLSLなんだけど、atanを使えばいいのかな?と思ってやってみると円の反対側も同じ値が返ってきてしまうので微妙に使えない。C言語系統でいうatan2だといけるのだが、GLSLにatan2はないのでググって出てきたスタックオーバーフローの実装を使った。
c++ - Robust atan(y,x) on GLSL for converting XY coordinate to angle - Stack Overflow
float PI = 3.141592653589793; float atan2(in float y, in float x) { return x == 0.0 ? sign(y)*PI/2 : atan(y, x); }
角度をラップする関数
角度って難しいので常に-180度 ~ 180度に収めるための関数をopenFrameworksのofWrapDegreesを参考に実装。atan2とあわせて色々ゴニョゴニョとやっていた。
https://github.com/openframeworks/openFrameworks/blob/master/libs/openFrameworks/math/ofMath.cpp
float wrapDegrees(in float value){ float from = -180; float to = 180; float cycle = to - from; return value - cycle * floor((value - from) / cycle); }
おわりに
オープンソースのプロジェクトは言語が異なってもコピペで持ってこれることがあるので大変ありがたいですね。みなさんも素敵なシェーダーライフをお送りください。
OpenGL 4.0 シェーディング言語 -実例で覚えるGLSLプログラミング-
- 作者: David Wolff,加藤諒,中本浩
- 出版社/メーカー: ボーンデジタル
- 発売日: 2012/11/01
- メディア: 大型本
- 購入: 3人 クリック: 6回
- この商品を含むブログ (4件) を見る