为什么显示不了

ns22020426 2008-12-11 05:12:03
用OpenGL 写了一个显示球的函数,
int InitGL(GLvoid) //初始化函数
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
return TRUE;
}




GLvoid ReSizeGLScene(GLsizei width, GLsizei height) //响应WM_SIZE的函数
{

glViewport(0,0,width,height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f,0.0f,0.0f,0.0f,0.0f,-5.0f,0.0f,1.0f,0.0f);


}



void DrawGLScene(GLvoid) //画图函数
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0f,0.0f,1.0f);
glTranslatef(-1.5f,0.0f,-6.0f);
glutSolidSphere(1.0,20,16);
}


为什么不能正常显示呢???只是在屏幕上闪了一下就没了。谁知道怎么回事??
...全文
129 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Show_Mike 2008-12-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ns22020426 的回复:]
谢谢 是不是不管物体移动还是视点移动都属于模型矩阵变化吗?? gluLookAt(0.0f,0.0f,0.0f,0.0f,0.0f,-5.0f,0.0f,1.0f,0.0f) 是不是默认物体位于原点呢?
[/Quote]
是啊.但也可以设置改变.
ns22020426 2008-12-14
  • 打赏
  • 举报
回复
自己顶一下!
ns22020426 2008-12-13
  • 打赏
  • 举报
回复
谢谢 是不是不管物体移动还是视点移动都属于模型矩阵变化吗?? gluLookAt(0.0f,0.0f,0.0f,0.0f,0.0f,-5.0f,0.0f,1.0f,0.0f) 是不是默认物体位于原点呢?
zzz822163 2008-12-12
  • 打赏
  • 举报
回复
glTranslatef是在现有基础上移动,估计你的图象被移动到看不到的地方了
zzz822163 2008-12-12
  • 打赏
  • 举报
回复
glClear之后加个glLoadIdentity(); 试试
zzz822163 2008-12-12
  • 打赏
  • 举报
回复
我们观察一个物体可以把他拿到眼前让模型动,
也可以把眼睛移到他的面前让视点动
zzz822163 2008-12-12
  • 打赏
  • 举报
回复
视点和模型是相对的概念,就像我们人和物体一样,不管哪一方动了,一切位置就都改变了,看到的就变化了
总之就是不管视点动还是模型动都可以达到相同的效果.
ns22020426 2008-12-12
  • 打赏
  • 举报
回复
我找到原因了 ,是每次都执行一次glTranslatef 几次后就移到看不到的区域了。 有一个问题 gluLookAt 为什么属于模型矩阵,这不是设置视点吗???
ns22020426 2008-12-11
  • 打赏
  • 举报
回复
#include <windows.h>
#include <gl\gl.h>
#include <gl\glut.h>
#include <gl\glu.h>
#include <gl\glaux.h>


HDC hDC=NULL;
HGLRC hRC=NULL;
HWND hWnd=NULL;
HINSTANCE hInstance;

bool keys[256];
bool active=TRUE;
bool fullscreen=TRUE;
GLfloat rtri;
GLfloat rquad;



LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
{
if (height==0)
{
height=1;
}

glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f,0.0f,0.0f,0.0f,0.0f,-5.0f,0.0f,1.0f,0.0f);


}

int InitGL(GLvoid)
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
return TRUE;
}

int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glTranslatef(0.0f,0.0f,-6.0f);
glutSolidSphere(1.0,20,16);

return TRUE;
}



int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
BOOL done=FALSE;

if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=FALSE;
}

if (!CreateGLWindow("NeHe's Solid Object Tutorial",640,480,16,fullscreen)) //CreateGLWindow函数省略了,功能是创建窗口执行InitGL()函数。
{
return 0; }

while(!done) {
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
done=TRUE; }
else {
TranslateMessage(&msg); DispatchMessage(&msg);
}
}
else
{

if ((active && !DrawGLScene()) || keys[VK_ESCAPE]) //在这执行DrawGLScene() {
done=TRUE; }
else {
SwapBuffers(hDC);





}



}
}


KillGLWindow(); //销毁窗口的函数
return (msg.wParam);
}

ns22020426 2008-12-11
  • 打赏
  • 举报
回复
呵呵 全部贴出来太长了 很少有人愿意看的。DrawGLScene()就是系统没用消息要响应的时候执行,就是PeekMessage(&msg,NULL,0,0,PM_REMOVE)返回值为0的时候执行。我把glMatrixMode(GL_MODELVIEW); glLoadIdentity();
gluLookAt(0.0f,0.0f,0.0f,0.0f,0.0f,-5.0f,0.0f,1.0f,0.0f); 放在DrawGLScene()函数里画面显示正常,可是放到
ReSizeGLScene里面,画面一闪一下就没了。
zzz822163 2008-12-11
  • 打赏
  • 举报
回复
DrawGLScene()放在哪个位置的?把全部代码贴来看看

19,464

社区成员

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

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