カメラが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;
}