太阳系模型——OpenGL
2010-06-16 16:38
169 查看
OpenGL红宝书中一个例子——太阳系模型
先粘上源码:
#include "stdafx.h"
#define GLUT_DISABLE_ATEXIT_HACK
#include<windows.h>
#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glut.h>
static int year = 0, day = 0;
void init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glPushMatrix();
glutWireSphere(1.0,20.,16);
glTranslatef(2.0,0.0,0.0);
glRotatef((GLfloat)day,0.0,1.0,0.0);
glutWireSphere(0.2,10,8);
glPopMatrix();
glutSwapBuffers();
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLsizei)w/(GLsizei)h,1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
}
void keyboard(unsigned char k, int x, int y)
{
switch(k){
case 'd':
day = (day+10)%360;
glutPostRedisplay();
break;
case 'D':
day = (day -10) % 360;
glutPostRedisplay();
break;
case 'y':
year = (year + 5) % 360;
glutPostRedisplay();
break;
case 'Y':
year = (year - 5) % 360;
glutPostRedisplay();
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
由于最开始用的是_tmain(),编译出现了从“_TCHAR *[]”转换为“char **”出错。这个是2005默认的"使用 Unicode 字符集",解决是
"配置属性"——>"字符集"——>"使用多字节字符集"。
如果是用 main(),无需改动,改为多字符集反而出错。
改正后没有错误。但是在运行时出现找不到MSVCR80D.dll提示。解决方案:
1. 在“属性->配置属性->清单工具->常规“下有一个”使用FAT32解决办法。(注意:一定要先配置这个选项,然后再编译工程,要不然还是不好用:)
2. 找到你的工程的文件夹,如(myproject),找到其下的myproject/myproject/Debug/ myproject.rec,把它删掉(删掉整个Debug目录也可以),重新编译,搞定!
http://www.cppblog.com/LiBerTine/archive/2009/09/21/73323.html
最后效果如附件。
glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
x,y显示鼠标位置
glutKeyboardFunc sets the keyboard callback for the current window. When a user types into the window, each key press generating an ASCII character will generate a keyboard callback。
http://www.opengl.org/resources/libraries/glut/spec3/node49.html
先粘上源码:
#include "stdafx.h"
#define GLUT_DISABLE_ATEXIT_HACK
#include<windows.h>
#include<GL/gl.h>
#include<GL/glu.h>
#include<GL/glut.h>
static int year = 0, day = 0;
void init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glPushMatrix();
glutWireSphere(1.0,20.,16);
glTranslatef(2.0,0.0,0.0);
glRotatef((GLfloat)day,0.0,1.0,0.0);
glutWireSphere(0.2,10,8);
glPopMatrix();
glutSwapBuffers();
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLsizei)w/(GLsizei)h,1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
}
void keyboard(unsigned char k, int x, int y)
{
switch(k){
case 'd':
day = (day+10)%360;
glutPostRedisplay();
break;
case 'D':
day = (day -10) % 360;
glutPostRedisplay();
break;
case 'y':
year = (year + 5) % 360;
glutPostRedisplay();
break;
case 'Y':
year = (year - 5) % 360;
glutPostRedisplay();
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
由于最开始用的是_tmain(),编译出现了从“_TCHAR *[]”转换为“char **”出错。这个是2005默认的"使用 Unicode 字符集",解决是
"配置属性"——>"字符集"——>"使用多字节字符集"。
如果是用 main(),无需改动,改为多字符集反而出错。
改正后没有错误。但是在运行时出现找不到MSVCR80D.dll提示。解决方案:
1. 在“属性->配置属性->清单工具->常规“下有一个”使用FAT32解决办法。(注意:一定要先配置这个选项,然后再编译工程,要不然还是不好用:)
2. 找到你的工程的文件夹,如(myproject),找到其下的myproject/myproject/Debug/ myproject.rec,把它删掉(删掉整个Debug目录也可以),重新编译,搞定!
http://www.cppblog.com/LiBerTine/archive/2009/09/21/73323.html
最后效果如附件。
glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
x,y显示鼠标位置
glutKeyboardFunc sets the keyboard callback for the current window. When a user types into the window, each key press generating an ASCII character will generate a keyboard callback。
http://www.opengl.org/resources/libraries/glut/spec3/node49.html
相关文章推荐
- OpenGL实现太阳系模型 —— Juwend
- OpenGL编程指南10:组合运动示例1—创建太阳系模型
- 【循序渐进学图形学之】OpenGL绘制太阳系模型
- 【转】OpenGL实现太阳系模型
- java太阳系模型
- VS2010-MFC:用OpenGL在对话框中的PictureControl(图片控件)中绘制三维模型,可旋转、平移、缩放,可用于三维模型的预览
- OpenGL光照模型--四种光照效果
- Opengl_es模型矩阵位置:glFrustumx与glTranslatef参数的相互影响--立方体旋转特效
- opengl光照模型
- opengl加载obj模型
- OpenGl 加载渲染模型
- OpenGL光照的计算模型
- OpenGL导入的obj模型透明问题
- OpenGL模型视图变换
- OpenGL---加载obj模型
- Java实现的简易太阳系模型
- OpenGL 简易太阳系模拟 总结
- 简单理解OpenGL模型视图变换
- OpenGL中旋转平移缩放等变换的顺序对模型的影响
- OpenGL系统设计-高级3D模型接口之MD2模型(1)