SyntaxHighlighter

2010-05-06

OpenGL

OpenGLをhttp://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.htmlで勉強中に、勝手にロボットハンドの演習に挑戦してみました。。。
画面中でマウスを左クリックすると、ロボットハンドの一番上の四角い部分がマウスカーソルを追従するようにしてみました。単純実装なので、マウスカーソルにアームが届かないと、アームがぐるぐる回ってしまいますが。。。

アームを追従するために、モデル座標系にある点を画面上の位置を求めますが、http://m-forest.ddo.jp/wiki_college/wiki.cgi?page=%BA%C2%C9%B8%B7%CF%CA%D1%B4%B9を参照しました。
ここによると、
オブジェクト座標系 →世界座標系 → 眼点座標系 → クリップ座標系 → 正規化デバイス座標系 → ウィンドウ座標系
順に計算していくらしい。

プログラム的にはここ。

void calcHandCenter() {
GLfloat m[16];
GLfloat p[4];
glGetFloatv(GL_MODELVIEW_MATRIX, m);
p[0] = m[12];
p[1] = m[13];
p[2] = m[14];
p[3] = m[15];
glGetFloatv(GL_PROJECTION_MATRIX, m);
GLfloat clip[4];
clip[0] =m[0]*p[0] + m[4]*p[1] + m[8]*p[2] + m[12]*p[3];
clip[1] =m[1]*p[0] + m[5]*p[1] + m[9]*p[2] + m[13]*p[3];
clip[2] =m[2]*p[0] + m[6]*p[1] + m[10]*p[2] + m[14]*p[3];
clip[3] =m[3]*p[0] + m[7]*p[1] + m[11]*p[2] + m[15]*p[3];
clip[0] /= clip[3];
clip[1] /= clip[3];
clip[2] /= clip[3];
clip[3] /= 1.0f;
float leftF = -1.0;
float ratio = (float)centerRow/(float)centerCol;
targetCol = (clip[0] - leftF) * centerCol;
targetRow = (1.0 - (clip[1] * ratio)) * centerRow;
}
m: 行列
p: 三次元点
targetCol, targetRow: アームの立方体中心部分の投影点


マウスをクリックした時に、アームの投影点とマウスの位置からアームの回転量を計算してます。

void changeArmsParam() {
baseR += 0.05*((double)deltaCol - (double)targetCol)/(double)centerCol*360.0;
handR += 0.05*((double)deltaRow - (double)targetRow)/(double)centerRow*360.0;
}
baseR: 台座の回転量(左右方向の移動)
handR: 関節の回転量(上下方向の移動)
deltaCol、deltaRow: マウスの位置
targetCol, targetRow: アームの立方体中心部分の投影点
centerCol, centerRow: 画面サイズの半分(移動量調整のため)


テキストの表示もどこかのサイトを参考にしたはずですが、失念してしまいました。すいません・・・・

プログラム

・・・全く分からないでしょうけど

アートのための数学

図書館で見つけた本。

カメラや音楽、CGを扱う上で知っておくと良い情報をまとめたような本でした。どちらかというと今更聞けない系かも知れません。カメラのF値?テレビのパンフレットについているxy色度図?音階ってどう決めているの?などが書かれているのがためになりました。
数学と書いてあってもそれほど難しい内容じゃなかったです。

アートのための数学アートのための数学
価格:¥ 2,100(税込)
発売日:2008-05
Related Posts Plugin for WordPress, Blogger...