opengl显示窗口中,可以将屏幕坐标转换成opengl坐标吗?

WYHVC 2009-08-20 10:32:55
如题
gluUnProject计算出来的坐标是不是没有做平移旋转的时候有效?
...全文
1356 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
张赐 2009-08-20
  • 打赏
  • 举报
回复
modelview, projection, viewport里应该有值才对

WYHVC 2009-08-20
  • 打赏
  • 举报
回复
CClientDC clientDC(this);
wglMakeCurrent(clientDC.m_hDC,hglrc);
这两句删掉就什么都画不出来了

onSize()进去过,在启动时攻进去四次
程序是不是哪里有问题?
void CtextureView::OnDraw(CDC* pDC)
{
CtextureDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码
wglMakeCurrent(pDC->m_hDC,hglrc);
drawscene();
wglMakeCurrent(pDC->m_hDC,NULL);
SwapBuffers(pDC->m_hDC);
}
void CtextureView::drawscene()
{
glClearColor(float(m_Bred)/255.0f,float(m_Bgreen)/255.0f,float(m_Bblue)/255.0f,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glBindTexture(GL_TEXTURE_2D,intexture[0]);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE,GL_DECAL);
glEnable(GL_TEXTURE_2D);

glEnable(GL_LINE_SMOOTH);//反走样
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//alpha模式下反走样
glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);

glShadeModel(GL_SMOOTH);//
glPushMatrix();
glTranslatef(m_fMoveX,m_fMoveY,-3.5);
glRotatef(m_fAngleX,1.0,0.0,0.0);
glRotatef(m_fAngleY,0.0,1.0,0.0);
glRotatef(m_fAngleZ,0.0,0.0,1.0);
glScalef(m_fGlobalScale,m_fGlobalScale,m_fGlobalScale);
draw();
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,intexture[1]);
glEnable(GL_TEXTURE_2D);
drawPic();
glDisable(GL_TEXTURE_2D);
if(m_Corrd==1)
drawCoord(-2.0f,bmpPicY,2.0f,4.1f,5.0f,4.1f);//分别是坐标轴零点的openGL坐标值和对应坐标轴长度(xyz)

glPopMatrix();
glFlush();
// glDisable(GL_TEXTURE_2D);
WYHVC 2009-08-20
  • 打赏
  • 举报
回复
好像跟chogimoga昨天的需求一样
是不是因为我画图函数中画图前后有pushMatrix()和popMatrix()?
xingzhe2001 2009-08-20
  • 打赏
  • 举报
回复
CClientDC clientDC(this); 
wglMakeCurrent(clientDC.m_hDC,hglrc);

这两句不放在OnSize里看看。

另外onSize可能没被系统调用?下个断点看是否走过这里。
WYHVC 2009-08-20
  • 打赏
  • 举报
回复
我在窗口内y值一定的地方划了一个平面,想用鼠标框选平面上一个矩形,然后在鼠标起止点处画矩形,当然这个矩形是经过坐标平移和旋转后的
WYHVC 2009-08-20
  • 打赏
  • 举报
回复
我在OnSize()设的正交变换,
void CtextureView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码
GLsizei w=cx;
GLsizei h=cy;
if(!h)
return;
CClientDC clientDC(this);
wglMakeCurrent(clientDC.m_hDC,hglrc);
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w>=h)
glOrtho(-halfViewPort*(GLfloat)w/(GLfloat)h,halfViewPort*(GLfloat)w/(GLfloat)h,-halfViewPort,halfViewPort,-10.0f,10.0f);
else
glOrtho(-halfViewPort,halfViewPort,-halfViewPort*(GLfloat)h/(GLfloat)w,halfViewPort*(GLfloat)h/(GLfloat)w,-10.0f,10.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
没用gluLookAt()
在OnSize中调这个函数就能得到那三个值,放在OnLButtonDown内就的不出来值
xingzhe2001 2009-08-20
  • 打赏
  • 举报
回复

void getglpos(point.x,point.y)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;

glMatrixMode(GL_MODELVIEW_MATRIX);
glLoadIdentity();
gluLookAt(g_eye[0],g_eye[1],g_eye[2],g_look[0],g_look[1]+g_elev,g_look[2],0.0,1.0,0.0);

glGetDoublev(GL_MODELVIEW_MATRIX, modelview); //行1
glGetDoublev(GL_PROJECTION_MATRIX, projection); //行2
glGetIntegerv(GL_VIEWPORT, viewport); //行3

winX = (float)mouse_x;
winY = (float)viewport[3] - (float)mouse_y;
glReadPixels(int(winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

}


这样看看
怎么可能什么值都没有?好歹有单位矩阵阿?
WYHVC 2009-08-20
  • 打赏
  • 举报
回复
我还是没看懂,比如我在OnLButtonDown()内调用这个函数
void getglpos(point.x,point.y)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;

glGetDoublev(GL_MODELVIEW_MATRIX, modelview); //行1
glGetDoublev(GL_PROJECTION_MATRIX, projection); //行2
glGetIntegerv(GL_VIEWPORT, viewport); //行3

winX = (float)mouse_x;
winY = (float)viewport[3] - (float)mouse_y;
glReadPixels(int(winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

}

posX,posY,posZ是不是转换后的坐标?
我看行1,2,3执行后modelview, projection, viewport的值都没有得到
xingzhe2001 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 wyhvc 的回复:]
如题
gluUnProject计算出来的坐标是不是没有做平移旋转的时候有效?
[/Quote]
看你传进去的modeview是什么了,最好就是摄像机矩阵,就是gluLookat之后马上glgetfloat得到的矩阵,那样gluUnProject算出来的是世界坐标系的点。
WYHVC 2009-08-20
  • 打赏
  • 举报
回复
谢谢二位,我去试试
chogimoga 2009-08-20
  • 打赏
  • 举报
回复
张赐 2009-08-20
  • 打赏
  • 举报
回复
旋转后也是有效的,昨天还有个帖子说这个的

这个是我的一个方法


GVector screen2world(int x, int y)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;

glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);

winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels(x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

GVector v(4, posX, posY, posZ, 1.0);
return v;
}
WYHVC 2009-08-20
  • 打赏
  • 举报
回复
非常感谢行者
可以了,求出来后我在Ondraw里画的,就是一个在所选平面上的矩形(如果有变换就是平行四边形),只是如果一旦鼠标拖到了平面外后,框选的矩形就突然画的不知道什么坐标了,我再查查好了。
xingzhe2001 2009-08-20
  • 打赏
  • 举报
回复
wglMakeCurrent调用太多,调用一次就好了,你每次draw完都wglMakeCurrent(pDC->m_hDC,NULL); 那么这之后的gl函数就可能无效了。就是说你在render函数之外的gl函数无效了。

在初始化的时候,比如OnCreate调用一次wglMakeCurrent就可以了。

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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