使用OpenGL对comet Wild 2形状数据进行基本渲染
我想学习OpenGL,并决定从一个非常简单的示例开始—根据星尘号航天器的测量结果绘制彗星Wild 2的形状(有关数据的详细信息,请参见:)。请记住,我对OpenGL一无所知。一些Google fu帮助我实现了下面给出的代码。尽管我尽了最大的努力,我的彗星还是很差劲 我希望它看起来更漂亮,但我不知道如何继续(除了阅读红皮书或类似书籍)。例如:使用OpenGL对comet Wild 2形状数据进行基本渲染,c,opengl,C,Opengl,我想学习OpenGL,并决定从一个非常简单的示例开始—根据星尘号航天器的测量结果绘制彗星Wild 2的形状(有关数据的详细信息,请参见:)。请记住,我对OpenGL一无所知。一些Google fu帮助我实现了下面给出的代码。尽管我尽了最大的努力,我的彗星还是很差劲 我希望它看起来更漂亮,但我不知道如何继续(除了阅读红皮书或类似书籍)。例如: 如何对形状进行非常基本的“线框”渲染 假设太阳沿“底部”方向(即沿-Y方向),如何添加灯光并看到另一侧的阴影 如何添加“鼠标事件”,以便旋转视图和放大/
- 如何对形状进行非常基本的“线框”渲染
- 假设太阳沿“底部”方向(即沿-Y方向),如何添加灯光并看到另一侧的阴影
- 如何添加“鼠标事件”,以便旋转视图和放大/缩小视图
#包括
#包括
#包括
#包括
//我添加了这个,以防您想将程序“复制/粘贴”到
//非Mac计算机
#苹果__
#包括
#否则
#包括
#恩迪夫
/*我硬编码数据并使用全局变量。我知道这很糟糕,但我在
匆忙*/
#定义NF 17518
#定义NV 8761
无符号整数fs[3*NF];
浮动vs[3*NV];
浮动角度=0.0f;
/*窗口更改大小时的回调(从Internet示例复制)*/
无效更改大小(整数w、整数h){
如果(h==0)h=1;
浮动比率=w*1.0/h;
glMatrixMode(GL_投影);
glLoadIdentity();
glViewport(0,0,w,h);
gluPerspective(45.0f,比率,0.2f,50000.0f);/*Y方向45度视场;50公里z剪裁*/
glMatrixMode(GLU模型视图);
}
/*这将渲染和更新场景(主要从Internet示例复制)*/
void renderScene(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glLoadIdentity();
gluLookAt(0.0f、0.0f、10000.0f,/*眼睛沿Z方向向下看10公里*/
0.0f,0.0f,0.0f,/*中心位于(0,0,0)*/
0.0f,1.0f,0.0f);/*沿自然y轴的y方向*/
/*只需添加一个简单的旋转*/
glRotatef(角度,0.0f,0.0f,1.0f);
/*使用镶嵌面和顶点在缓冲区中插入三角形*/
glBegin(GL_三角形);
无符号整数计数器;
用于(计数器=0;计数器
如何对形状进行非常基本的“线框”渲染
假设太阳沿“底部”方向(即沿-Y方向),如何添加灯光并看到另一侧的阴影
好的阴影是硬的,特别是在固定功能管道的情况下
但在此之前,你需要使用你的顶点,你可以计算
如何添加“鼠标事件”,以便旋转视图和放大/缩小视图
试试我做的鼠标处理程序。在OpenGL中,更改为线框渲染非常容易,您必须使用
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
并切换回填充渲染
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
关于灯光,OpenGL允许您最多使用8种不同的灯光,通过法线和材质生成最终渲染。您可以通过以下方式激活照明模式:
glEnable(GL_LIGHTING);
然后使用以下任一选项激活每个灯光:
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
要更改灯光属性(如其位置),请查看
如果使用glBegin()方法,则必须为定义的每个顶点设置法线。在VBO渲染中,这是相同的,但法线也包含在vram中。在glBegin()方法中,可以使用
glNormal3f(x, y, z); for example
对于定义的每个顶点
关于你能做什么的更多信息,红皮书是一个很好的开始
移动你的“场景”是OpenGL间接允许你做的另一件事。因为这一切都与matrix一起工作
你可以使用
glTranslate3f(x, y, z);
glRotate3f(num, x, y, z);
....
管理关键事件和鼠标事件(我几乎可以肯定)与OpenGL无关,它取决于您使用的库,例如glut/SDL/…所以您必须参考它们自己的文档
最后,关于你可以使用的一些功能的更多信息,还有一个教程部分,引导你到不同有趣的网站
希望这能有所帮助!虽然我喜欢说“从简单的事情开始”,但我认为,有时你需要“深入”了解,时间跨度很小!干得好
如果你想举个例子,请问。。。
我写了一份记录良好且高效的,
但是可读的纯Win32(无.NET或MFC)OpenGL FPS
虽然看起来其他人回答了你们大多数的问题。。。
如果你愿意,我可以帮你,也许可以做一个很酷的纹理(如果你没有)
要回答这个问题:
glBegin(GL_TRIANGLES);
unsigned int counter;
for(counter=0; counter<3 * NF; ++counter) {
glVertex3fv(vs + 3 * fs[counter]); /* here is where I'm loading
the data - why do I need to
load it every time? */
}
glEnd();
glBegin(GL_三角形);
无符号整数计数器;
例如(counter=0;counteryi:“决定从一个非常简单的例子开始”一个“简单的例子”是一个三角形,而不是一个复杂的网格。@NicolBolas:很好的一点-注意到了。不要使用即时模式。不要使用固定的函数管道。@CatPlusPlus谢谢,我会研究它。哈哈哈哈哈哈哈哈,同时对性能和即时模式胡说八道。顺便说一句,OpenGL通过在o、 使用WinAPI是因为它更容易移植到Android。请告诉我们,使用操作系统特定的API移植代码比使用已经支持Android(如freeGLUT,上一次更新是在一年前)或其他人很容易替换的库(仅供参考,称它们为“Header”并不使您非常可信)的代码更容易(GLEW对OpenGL4.3的支持也很好,最近一次更新是在几个月前,等等)
glBegin(GL_TRIANGLES);
unsigned int counter;
for(counter=0; counter<3 * NF; ++counter) {
glVertex3fv(vs + 3 * fs[counter]); /* here is where I'm loading
the data - why do I need to
load it every time? */
}
glEnd();