天球中恒星的OpenGL可视化

时间:2016-02-16 19:06:57

标签: ios objective-c iphone opengl-es

我对iOS上的OpenGL ES相当新,并且有一个宠物项目,最好的描述是基本上试图在iOS上创建更精彩的Stellarium版本。

我设法加载约。 9000个顶点(每个顶点代表星星在夜空中可见的当前位置),并通过将正确的模型旋转矩阵传递到顶点着色器,它们根据一天中的时间和位置实时移动。用户。换句话说,数学不是问题,也不是EAGLView的基本设置,各种缓冲区和着色器编译等,我基本上都遵循Ray Wenderlich的this教程。

计算顶点位置,使它们全部位于一个不可见球体的表面上,任意半径围绕位置(0,0,0),模拟夜空。

最后,我希望能够实现基本的拖动/捏合手势来移动观察者的视点(位于位置0,0,0)和"缩放"更靠近球体以查看更多细节,例如星名。

我挣扎的部分如下

1)投影矩阵:根据上述场景选择哪个投影的专家建议?我很难理解视锥体,但认为这是要走的路。我将如何实现"缩放"接近?

2)每颗星的形状:目前,这是一个单一的顶点,在屏幕上产生一个点。什么是应用星形纹理的最佳方法?

3)我的顶点阵列中最终将会有一些顶点保持静止,例如天体网格,显示方位角和高度,即它们不应像星星那样旋转。如何将旋转矩阵应用于某些顶点,而不是其他顶点?这可以通过将glDrawElements()分成几个部分来实现吗?

1 个答案:

答案 0 :(得分:1)

  1. 投影矩阵通常使用辅助函数计算。例如,gluPerspective。如果您想要实现缩放,可以调整FOV(较小/较大的值将放大/缩小)。通常,通过修改视图矩阵(同样,通常使用辅助函数计算)来实现缩放,它取决于您使用哪种方法(或组合)。

  2. 要应用纹理,GL有一个名为gl_PointCoord的特殊片段着色器输入变量,可用于在GL_POINT基元上轻松映射纹理(请参阅GL ES 2.0规范,第3.3节'点')。您还可以编写一个几何着色器,将点转换为四边形,并编写一个标准'片段着色器 - 虽然这可能还有很多工作。

  3. 将使用不同的统一数据(例如,模型/视图/投影矩阵)处理的几何体分割成单独的绘制调用可能更容易。这通常是大多数游戏引擎渲染对象的方式,除非预期的绘制调用数量变大,然后它们经常实现某种批量绘制。但是,如果你只有两套,那不应该是一个大问题。