使用openGL ES更改摄像机位置

时间:2014-05-22 19:40:53

标签: ios opengl-es-2.0 glkit

我有一个iOS简单项目,我在其中显示一个形状。到现在为止还挺好。现在我正在尝试更改摄像机位置,以便以等轴测视角查看我的对象。我无法弄清楚如何使用OpenGL-ES 2.x移动/旋转相机。

当然,我可以旋转物体本身,从等角度的角度看它,但这似乎不是正确的设计。

是否有人可以分享一段Objective-C代码以帮助我正确定位相机?

更新使用回复中的提示:

我使用Cocos3D来帮助进行矩阵计算

CC3GLMatrix *camera = [CC3GLMatrix matrix];
[camera populateFromTranslation:CC3VectorMake(0, 0, 0)];
[camera rotateBy:CC3VectorMake(30, 0, 0)];
[camera rotateBy:CC3VectorMake(0, 45, 0)];  
glUniformMatrix4fv(_cameraUniform, 1, 0, camera.glMatrix);

然后在顶点添加相机

gl_Position = Projection * Modelview * Camera * Position;

2 个答案:

答案 0 :(得分:2)

就我在OpenGL ES中的有限知识而言,没有相机对象"。您必须相对于原点移动其他所有内容才能移动或旋转场景。您可以使用着色器执行此操作,如Taum所述。

答案 1 :(得分:2)

OpenGL ES,在2.x中更是如此,没有任何对象与世界对比相机与任何东西的概念。从广义上讲,它有一个输入顶点流,以某种方式排列以制作几何图形,根据某些统一状态单独处理,然后确定哪些片段需要绘制并单独执行计算以确定每个输出颜色片段。

您提供:

  • 顶点
  • 制服
  • 顶点着色器
  • 片段着色器

通常人们有顶点描述相对于模型中心的位置。

他们有一些状态描述了该模型在世界中的位置,其他状态描述了相机在该世界中的位置。他们将这些信息作为制服提供,通常合并为一个矩阵。

然后他们将有一个顶点着色器,或多或少,只是将制服应用于顶点。

最后,片段着色器将对一些纹理进行采样或绘制该面部所需的任何纹理。

因此,在您的情况下,您将为对象指定不同的变换,使其看起来是等距的。设计为第二段查询的原因并非如此,您可以将该转换计算为将状态发送到OpenGL的最后一步,同时考虑两个独立的输入。所以你要在程序中分别保存这两个东西,然后将它们组合成一个仅用于OpenGL的东西。