Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenGL对comet Wild 2形状数据进行基本渲染_C_Opengl - Fatal编程技术网

使用OpenGL对comet Wild 2形状数据进行基本渲染

使用OpenGL对comet Wild 2形状数据进行基本渲染,c,opengl,C,Opengl,我想学习OpenGL,并决定从一个非常简单的示例开始—根据星尘号航天器的测量结果绘制彗星Wild 2的形状(有关数据的详细信息,请参见:)。请记住,我对OpenGL一无所知。一些Google fu帮助我实现了下面给出的代码。尽管我尽了最大的努力,我的彗星还是很差劲 我希望它看起来更漂亮,但我不知道如何继续(除了阅读红皮书或类似书籍)。例如: 如何对形状进行非常基本的“线框”渲染 假设太阳沿“底部”方向(即沿-Y方向),如何添加灯光并看到另一侧的阴影 如何添加“鼠标事件”,以便旋转视图和放大/

我想学习OpenGL,并决定从一个非常简单的示例开始—根据星尘号航天器的测量结果绘制彗星Wild 2的形状(有关数据的详细信息,请参见:)。请记住,我对OpenGL一无所知。一些Google fu帮助我实现了下面给出的代码。尽管我尽了最大的努力,我的彗星还是很差劲

我希望它看起来更漂亮,但我不知道如何继续(除了阅读红皮书或类似书籍)。例如:

  • 如何对形状进行非常基本的“线框”渲染
  • 假设太阳沿“底部”方向(即沿-Y方向),如何添加灯光并看到另一侧的阴影
  • 如何添加“鼠标事件”,以便旋转视图和放大/缩小视图
我怎样才能让这个怪物看起来更漂亮?有在线教程或代码示例的参考资料吗

我将源代码、数据和makefile(对于OS X)放在bitbucket中:

hg克隆

该数据由8761个三元组(固定框架中的顶点)和17518个三角形组成(每个三角形是指8761个顶点三元组之一的整数三元组)

#包括
#包括
#包括
#包括
//我添加了这个,以防您想将程序“复制/粘贴”到
//非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();