MFC OpenGL gluLookAt

magic_an 2011-05-26 03:30:40
想做一个基于MFC的漫游,在OnKeyDown中响应改变gulLookAt视角和视点从而实现漫游功能,但是发现按键时,视角并没有改变,不知道是什么原因,程序如下:
void CWanderView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
float speed=0.2f; //步长
if(VK_SHIFT==nChar) speed=speed*4; //按下SHIFT键,步长乘以4

if (VK_LEFT==nChar)
{
g_angle-=speed*2; //左转
}
if(VK_RIGHT==nChar)
{
g_angle+=speed*2; //右转
}
rad_xz =float(pi*g_angle/180.0f); //计算SIN和COS函数中需要的参数。
///////////////////////观察点的设置/////////////////////
if(VK_UP==nChar)
{
g_eye[2]+=(float)(sin(rad_xz)*speed); // 前进
g_eye[0]+=(float)(cos(rad_xz)*speed);

}
if(VK_DOWN==nChar)
{
g_eye[2]-=(float)(sin(rad_xz)*speed); // 后退
g_eye[0]-=(float)(cos(rad_xz)*speed);
}
g_eye[1]=1.8f;
/////////////////////////设置摄像机,即目标点的位置/////////////
g_look[0]=(float)(g_eye[0]+100*cos(rad_xz));
g_look[2]=(float)(g_eye[2]+100*sin(rad_xz));
g_look[1]=g_eye[1];

// DrawScene(); //场景函数,画网格地面等
glLoadIdentity();
gluLookAt(g_eye[0],g_eye[1],g_eye[2],g_look[0],g_look[1],g_look[2],0.0,1.0,0.0);
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
程序应该没有问题,基本上都是唐明里那本书里面的,但是我不明白为什么我的gluLookAt函数没有作用呢?我调试过,OnKeyDown消息处理没有问题,对应的按键按下时,会有g_eye和g_look的改变,希望高手给我解答一下,我新手,也没有分。。等有分了一定给大家。。。谢谢
...全文
164 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mystery1986 2012-03-14
  • 打赏
  • 举报
回复
我记得MFC中的那些特殊键是要改个东西的,你如果用ABCD什么的没事
Dickence 2012-02-22
  • 打赏
  • 举报
回复
楼主这个问题解决了吗?我现在也遇到这个问题了……
magic_an 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dizuo 的回复:]
按键以后,你改变窗口大小,试试有没反应。。。
[/Quote]
没有反应。。。
ryfdizuo 2011-05-26
  • 打赏
  • 举报
回复
按键以后,你改变窗口大小,试试有没反应。。。
magic_an 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dizuo 的回复:]
opengl的绘制函数你怎么调用的?
设置时钟了吗?
[/Quote]
这个不需要设置时钟吧,因为我要用UP DOWN LEFT RIGHT 这四个方向键直接控制视角,每一次按键都会变换一定的角度。
最主要的两个函数是一个画场景的,和OnSize两个函数分别如下:
//////////////当窗口大小发生变化时
void CWanderView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if (0 == cy) // 防止被零除
{
cy = 1; // 将Height设为1
}

glViewport(0, 0, cx, cy); // 重置当前的视口
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵

// 设置视口的大小
gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,10000.0f);
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵


gluLookAt(g_eye[0],g_eye[1],g_eye[2],g_look[0],g_look[1],g_look[2],0.0,1.0,0.0);
}
//////主要的画场景的函数
BOOL CWanderView::DrawScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
///////////////////////////////灯光、材质设置////////////////////////////

GLfloat light_position[]={0.0,5.0,1.0,0.0};
GLfloat mat_amb_diff[]={1.0f,0.0f,0.0f};
GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
GLfloat mat_shininess[]={50.0};

glLightfv(GL_LIGHT0,GL_POSITION,light_position);

glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
glPushMatrix();
glTranslatef(0,0,-9050.0f);
glRotatef(60,0,1.0,0);

glCallList(load_tank); //载入3D模型
glPopMatrix();

DrawGroud();
gluLookAt(g_eye[0],g_eye[1],g_eye[2],g_look[0],g_look[1],g_look [2],0.0,1.0,0.0);
glFlush(); // 更新窗口
SwapBuffers(m_pDC->GetSafeHdc()); // 交换缓冲区
return TRUE;

}
始终找不出原因来
ryfdizuo 2011-05-26
  • 打赏
  • 举报
回复
opengl的绘制函数你怎么调用的?
设置时钟了吗?
magic_an 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]
是不是按键的时候没有重绘。
Invalidate一下。
[/Quote]不是啊,我已经禁止了windows进行窗口的重绘工作,而用OPenGL进行更新窗口,我的情况是加上了gluLookAt好像跟没加一样,还是原来的视角,而且不会变化
ryfdizuo 2011-05-26
  • 打赏
  • 举报
回复
是不是按键的时候没有重绘。
Invalidate一下。

19,469

社区成员

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

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