关于屏幕坐标转换为opengl坐标

hqyCoder 2011-04-28 04:15:51
我今天在做一道关于opengl画点的题;
要求在MFC里面 鼠标在客户区域 任意点击一下 画出一个点。画点函数必须要使用opengl的函数实现
我的做法如下:

void COpenGLView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
GLfloat x;
GLfloat y;
glVertex2f(x,y);
CView::OnLButtonUp(nFlags, point);
}
这样子 当然能客户区域 点击下鼠标会出现一个点 但是这个点不是在鼠标那里 ,也就是说 屏幕坐标和 opengl 不是使用的同一个坐标 我在网上找了一下,说可以通过获取客户区域坐标来搞,但是还是不行 请大家给个方法!谢谢
...全文
620 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamesclarke 2011-05-01
  • 打赏
  • 举报
回复
晕倒。。。1楼的D3D的东西,2楼的过于专业了。。。
你现在出现的情况是不是:鼠标点了一个位置,在同一垂直线上的另一处出现了绘制的点?
如果是这样,问题就很好解决。

这是因为,MFC采用的是左上角为(0,0),往右下方向增大的坐标系;而OpenGL采用的是左下角为(0,0),往右上方向增大的坐标系;因此你直接用MFC获得的鼠标坐标来绘制的话,横坐标二者是一致的,但是纵坐标正好相加等于该窗口的高,及_glCoordY = m_WindowHeight - _mfcCoordY;
peng_weida 2011-04-30
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhangci226/archive/2010/02/21/5314184.aspx
参考这个就OK!
CMT100 2011-04-29
  • 打赏
  • 举报
回复
对于从对象空间-》世界空间-》摄像机空间,都是可逆的。但是一旦进行了投影变换之后就不可逆了。
所以从数学角度来讲不可行。
换个思路,想3dmax那样刚开始就做一个平面,让后画模型的开始点就是鼠标点在那个平面的位置。
然后就是点的拾取问题了。
Ray GetPickRay(LPDIRECT3DDEVICE9 pD3DDevice,int nX,int nY){
float fPx = 0.0f;
float fPy = 0.0f;
D3DVIEWPORT9 vp;
pD3DDevice->GetViewport(&vp);//获取视口变换矩阵

D3DXMATRIX proj;
pD3DDevice->GetTransform(D3DTS_PROJECTION,&proj);//获取投影变换矩阵

fPx = (((2.0f*nX)/vp.Width) - 1.0f) /proj(0,0);
fPy = (((-2.0f*nY)/vp.Height) + 1.0f) /proj(1,1);

Ray ray;//射线包含原点和方向
ray.Origin = D3DXVECTOR3(0.0f,0.0f,0.0f);
ray.Dir = D3DXVECTOR3(fPx,fPy,1.0f);

D3DXMATRIX view,viewInverse;
pD3DDevice->GetTransform(D3DTS_VIEW,&view);//获取观察变换矩阵
D3DXMatrixInverse(&viewInverse,0,&view);//获取观察矩阵的逆矩阵

D3DXVec3TransformCoord(&ray.Origin,&ray.Origin,&viewInverse);//射线原点根据逆矩阵进行变换
D3DXVec3TransformNormal(&ray.Dir,&ray.Dir,&viewInverse);//射线向量根据逆矩阵进行变换
D3DXVec3Normalize(&ray.Dir,&ray.Dir);将射线向量归一化
return ray;
}
bool RayHitBall(Ray *ray,D3DXVECTOR3 pos,float fR){//射线与球的碰撞监测,用于拾取你要的点。参数为射线,点的位置,以该点为球心,fR为半径的球。
D3DXVECTOR3 v = ray->Origin - pos;//射线原点和要拾取点的坐标所形成的向量
//求出射线与向量在球心处地距离。如果大于球半径,就没有检测到,否则就拾取到。
float fB = 2.0f * D3DXVec3Dot(&ray->Dir,&v);
float fC = D3DXVec3Dot(&v,&v) - (fR * fR);

float fDis = (fB * fB) - (4.0f * fC);

if(fDis < 0.0f)return false;
fDis = sqrtf(fDis);
float fS0 = (-fB + fDis)/2.0f;
float fS1 = (-fB - fDis)/2.0f;

if(fS0 >= 0.0f || fS1 >= 0.0f)
return true;
return false;
}
这个是Direct3D9.0的代码,楼主可以根据注释做相应修改。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧