« 仕事は唐突に | メイン | やはり気持ち次第 »

2008年11月26日

簡単そうなのにすぐに思い付かない

円柱をポリゴンで描画したいと思った。
が、すぐに思い付かない。
特定の軸を中心として描くのは簡単。
以下の媒介変数方程式を使い位置を求めて、トライアングルストリップでつなげていけばよい。
x = rcosθ
y = rsinθ
θを変更して sin と cos 毎回計算していると重いので、360°を分割数で割った単位角度で最初に値を求め、以後は加法定理で加算していけば、sin と cos は最初の1回で済む。(分割数を固定にするのなら値を定数にすることで sin と cos 自体実行時に計算しなくて良い)
cos( α + β ) = cosα*cosβ - sinα*sinβ
sin( α + β ) = sinα*cosβ + cosα*sinβ
まずはこれが基本。
これは何の問題もない。

描きたいのはある二点abと半径rを指定した場合の円柱。
a - b で求めたベクトルを正規化したものは、bの側の円柱の円の法線を表す。
法線がわかれば b と内積することで、平面方程式に必要な値は求まる。
で、この平面上で b を中心とする円を描ければ出来たも同然なんだけどよくわからなくなる。
出来そうで出来ない。

面の傾きという方向から検索してみて気付いた。
法線と例えば Y 軸を内積すれば、その角度がわかる ( acos も必要)。
これで何とか出来そう……
法線と Y 軸の内積から角度を求める。
法線と Y 軸の外積から2軸に垂直なベクトルを求める。
求めたベクトルと角度からクォータニオンを求め、X 軸と Z 軸を回転させる。
これで円柱の底面を基準とした各座標軸のベクトルが求まる。
後は最初に出した媒介変数方程式の意味をよく考えればわかる。
vx = rcosθ * X 軸ベクトル
vy = rsinθ * Z 軸ベクトル
とすれば、円柱の底面を基準とした座標系での X と Y のベクトルが求まる。
ここまでくればその位置を求めるのは簡単。
p = vx + vy + b
で位置が求まる。
b は中心点の座標となっているので加算する。
a 側の座標は、a を加算すればよい。
後はθを変更していくことで座標を求めていける(加法定理で求める)。

これである二点abと半径rを指定した場合の円柱を描けるはず。
他に移動と回転からマトリックスを求めて、円柱は軸に沿ったもので求めるという手もあるけど、その場合頂点ごとに行列演算が入るのが重そう。
GPU 任せにすればそれほど問題ないだろうけど。

投稿者 Takenori : 2008年11月26日 16:51


トラックバック

このエントリーのトラックバックURL:
http://kaede-software.com/mt/tb-ping.cgi/1800


Total : Today : Yesterday :