マウスでオブジェクトを移動しようとしています:
実際の行列を取得し、gluUnProject を使用して、マウスの位置 dx と dy から実際の x、y、z を取得します。カメラを動かさない限り、すべて正常に機能します。カメラが X から 45,225 度にある場合、正常に機能します軸。
しかし、x(+-)\z(+-) 軸に近づくと、それが動作になります (オブジェクトが移動する計画が正しく更新されません)。
マウスクリックイベントで私がすること:
gluUnProject(event->x(), -event->y(), 0, model_matrix, proj_matrix, view_matrix, &newx, &newy, &newz);
//dx and dy = mouse coords
if (dy<dx){
if (event->x()>mNewMousePosition.x()){
emit SignalPreviewMouseChanged((float)(mNewx/1500)*acc,0,(float)(-mNewz/1500)*acc);
}
else {
emit SignalPreviewMouseChanged((float)(-mNewx/1500)*acc,0,(float)(mNewz/1500)*acc);
}
}
else{
if (event->y()<mNewMousePosition.y())
emit SignalPreviewMouseChanged(0,(float)(mNewy/750)*acc,0);
else {
emit SignalPreviewMouseChanged(0,(float)(-mNewy/750)*acc,0);
}
}
それが render メソッドです:
void PaintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glViewport (0, 0, mScreenWidth, mScreenHeight);
if (mRotateAroundYAxis){
gluLookAt(mObjCamera->Pos().x, mObjCamera->Pos().y, mObjCamera->Pos().z,
0, mObjCamera->View().y, 0,
mObjCamera->Up().x, mObjCamera->Up().y, mObjCamera->Up().z);
}else{
gluLookAt(mObjCamera->Pos().x, mObjCamera->Pos().y, mObjCamera->Pos().z,
mObjCamera->View().x, mObjCamera->View().y, mObjCamera->View().z,
mObjCamera->Up().x, mObjCamera->Up().y, mObjCamera->Up().z);
}
glGetDoublev(GL_MODELVIEW_MATRIX, model_matrix);
glGetDoublev(GL_PROJECTION_MATRIX, proj_matrix);
glGetIntegerv(GL_VIEWPORT, view_matrix);
for (int k=0;k<mIndexSize/2;k++) {
glCallList(mIndexSize-k);
}
DrawGrid();
DrawAxis();
}