1

カメラが3D空間の静止した2D平面上を移動するopenframeworksでゲームを構築しています。カメラは常に動いているため、フレームごとに 5 つの座標を選択する必要があります (1 つはマウス用、4 つはビューポートの角用で、何を描画するかを調整します)。しかし、gluUnproject 関数が遅すぎることがわかりました。現在 Z = 0 の静止平面でのみ座標を選択しているため、カメラ クラスのモデルビューと射影行列を使用して座標をかなり安価に計算できるはずですが、うまくいきません。計算方法。

要約すると、私は

カメラ - MODELVIEW および PROJECTION マトリックス、VIEWPORT 平面は z 軸に位置合わせされ、次元は world_dims.x、world_dims.y です。

gluUnproject を使用せずに、画面座標を平面上の非投影座標に変換したい。

私がgluUnprojectに頭が悪いので、そのビットのコードをここに示します

ofVec3f ofxGrabCam::pickCoordinate(ofVec2f t_mouseP) {
//read z value from depth buffer at mouse coords

ofVec3f t_mouseW(t_mouseP.x, t_mouseP.y, 0);

glReadPixels(t_mouseW.x, ofGetScreenHeight()-1-t_mouseP.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &t_mouseW.z);

if (t_mouseW.z == 1.0f){
    return ofVec3f(-99,-99,-99); //represents point not found
}

GLdouble c[3];

gluUnProject(t_mouseW.x, ofGetScreenHeight()-1-t_mouseW.y, t_mouseW.z, matM, matP, viewport, c, c+1, c+2);

ofVec3f mouseW(c[0],c[1],c[2]);

return mouseW;

}

4

1 に答える 1

3

ただし、gluUnproject関数が遅すぎることがわかりました。

5つの座標だけを逆変換することは、パフォーマンスのボトルネックにはなりません。

gluUnprojectを使用せずに、画面の座標を平面上の投影されていない座標に変換したいと思います。

逆変換パスを決定する必要があります。つまり、モデル空間からビュー空間への道を表す行列を反転し(そして、ある時点で遠近法の分割を反転し)、座標をその中に渡します。ただし、これはまさにgluUnprojectが行うことです。

于 2012-03-09T14:14:43.753 に答える