使用OpenGL中glVertex3f((GLfloat)(x),(GLfloat)(y),(GLfloat)(z));绘制的三维点,用glRotatef(xrof,1.0f,0.0f,0.0f);//x轴等实现旋转,glScalef(m_ScaleX,m_ScaleY,m_ScaleZ);实现缩放,
现在在屏幕上如何任意选取已经绘制的单元??
如何将屏幕的二维坐标转换为空间三维坐标??
有实例的话发到:[email protected],万分感谢?
现在在屏幕上如何任意选取已经绘制的单元??
如何将屏幕的二维坐标转换为空间三维坐标??
有实例的话发到:[email protected],万分感谢?
用gluproject 和 gluunproject 函数
CVector3 WINAPI GetMouseModelCoordinate(CVRRoomView* pView, CPoint point)
{
GLfloat fdepth;
GLdouble ObjectX, ObjectY, ObjectZ;
GLint iViewPort[4];
GLdouble dProjMatrix[16];
GLdouble dModelMatrix[16];
POINT iScreen;
int iScrToWinX, iScrToWinY;
long iError;
CVector3 pp; CClientDC ClientDC(pView);
wglMakeCurrent(ClientDC.m_hDC, pView->m_hGLContext); //使 RC 与当前 DC 相关联
glGetIntegerv(GL_VIEWPORT, iViewPort);
glPushMatrix();
glGetDoublev(GL_MODELVIEW_MATRIX, dModelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, dProjMatrix);
::GetCursorPos(&iScreen);
iScrToWinX = iScreen.x-point.x;
iScrToWinY = iScreen.y-point.y;
glReadPixels(point.x, iViewPort[3]-point.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &fdepth);
gluUnProject((GLdouble)point.x, (GLdouble)(iViewPort[3]-point.y), (GLdouble)fdepth, dModelMatrix, dProjMatrix, iViewPort, &ObjectX, &ObjectY, &ObjectZ);
if(ObjectX>=pView->m_pDoc->m_dModelMinX&&ObjectX<=pView->m_pDoc->m_dModelMaxX&&
ObjectY>=pView->m_pDoc->m_dModelMinY&&ObjectY<=pView->m_pDoc->m_dModelMaxY&&
ObjectZ>=pView->m_pDoc->m_dModelMinZ&&ObjectZ<=pView->m_pDoc->m_dModelMaxZ)
{
pp.x = ObjectX;
pp.y = ObjectY;
pp.z = ObjectZ;
}
else
{
pp.x = pView->m_pDoc->m_pRoamParameter->dMouseModelX;
pp.y = pView->m_pDoc->m_pRoamParameter->dMouseModelY;
pp.z = pView->m_pDoc->m_pRoamParameter->dMouseModelZ;
}
// pView->m_pDoc->m_pRoamParameter->dMouseModelX = (double)ObjectX;
// pView->m_pDoc->m_pRoamParameter->dMouseModelX = (double)ObjectY;
// pView->m_pDoc->m_pRoamParameter->dMouseModelX = (double)ObjectZ;
glPopMatrix();
iError = glGetError();
if(iError!=GL_NO_ERROR)
{
// Errinfo = gluErrorString(iResultCode);
::MessageBox(NULL, (LPCTSTR)gluErrorString(iError), "提示13:", MB_OK);
}
wglMakeCurrent(ClientDC.m_hDC, NULL);//释放 RC,以便其它 DC 进行绘图
return pp;
}