[GIS] ラスタ→STLを目指せ #2 右ネジ規則を確保する

id:yellow_7320130415 の続き。今回は「右ネジ」規則を確保する方法です。

STLは前述の通り「右ネジ」にしないといけませんが、場合によってはポイント順序を逆にしなければなりません。

外から見れば「左回り」

法線ベクトルは物体内側から物体外側に出て、右ネジになるので、外から表面を見た場合は「左回り」です。

ラスタだと逆になる

ラスタファイルの場合、左上から右下に向かう、左手系になることが多いです。

右手系だと(0,0)->(1,0)->(1,1)->(0,1)->(0,0)は左回りですが、

左手系だと(0,0)->(1,0)->(1,1)->(0,1)->(0,0)を右手系に変換したあとは、右回りです。


座標変換のパラメータ

ところで、GDALでは座標変換のパラメータを取得することができます。

double trans[6];

GDALGetGeoTransform(dataset, trans)

パラメータは次のように使います。

/* col, row はラスタのピクセル位置 */
x = trans[0] + trans[1] * col + trans[2] * row;
y = trans[3] + trans[4] * col + trans[5] * row;

このx,yは、普通は右手系になります*1

右手系・左手系の違いは行列式(たぶん)

だいたいY方向で逆転してX方向はそのまま、というのが多いんですが、TIFFなんかで回転が入ってきたりするとそのままでは対応できないので、行列式の方がいいと思う。

trans[1]*trans[5]-trans[2]*trans[4]

これが正なら右手系なのでポイントの順序はそのまま、負なら左手系なのでポイントの順序を入れ替え、とします。

*1:左手系を貫く空間参照系は知らないだけかも知れないので「普通は」としました