Ios OpenGL ES使摄影机环绕对象旋转
我想在OpenGL中围绕对象旋转摄影机。不太可能。这是我的密码: 对象是标准立方体Ios OpenGL ES使摄影机环绕对象旋转,ios,opengl-es,opengl-3,glkit,Ios,Opengl Es,Opengl 3,Glkit,我想在OpenGL中围绕对象旋转摄影机。不太可能。这是我的密码: 对象是标准立方体 - (void)update { float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height); float radius = 10.0f; float startAngle = -3 * M_PI/4.0; float newX = 0.0f + radius *cos(p
- (void)update {
float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
float radius = 10.0f;
float startAngle = -3 * M_PI/4.0;
float newX = 0.0f + radius *cos(phi)*sin(theta);
float newY = 0.0f + radius *sin(phi)*sin(theta);
float newZ = 0.0f + radius *cos(theta);
GLKMatrix4 projectionMatrix = GLKMatrix4MakeLookAt(newX, 0.0, newZ
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
self.effect.transform.projectionMatrix = projectionMatrix;
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 0.0f);
self.effect.transform.modelviewMatrix = modelViewMatrix;
}
-(void) viewPanned:(UIPanGestureRecognizer *) sender
{
CGPoint curTouch = [sender locationInView:self.view];
if ([sender state] == UIGestureRecognizerStateBegan){
oldX = curTouch.x;
oldY = curTouch.y;
}
theta += (curTouch.x-oldX)*0.001f;
phi += (curTouch.y-oldY)*0.001f;
oldX = curTouch.x;
oldY = curTouch.y;
}
您的模型视图和投影矩阵设置不正确——在这两个矩阵之间有模型视图转换,但没有从眼睛空间到剪辑空间的投影 为了理解原因,它有助于研究坐标空间、变换及其在三维图形编程中的常见作用。。。这里有很多好的教程(这是为桌面GL编写的,使用C++ GLM库,在iOS中,你最好使用GLKIT数学,但是概念是相同的),但是这里有一个快速的概述。
在传统图形管道(由建模)中,您可能会关心四个坐标空间:
- 模型空间是定义顶点数据的任意坐标系。例如,如果要绘制具有大量长方体形状的场景,只需定义一个以原点为中心的单位立方体,然后使用变换将其拉伸、移动和旋转到场景中的不同位置
- 世界空间是设计场景时使用的任意坐标系。例如,如果要使用该立方体绘制城市景观,可以将原点放在街角,然后在X和Z方向平移立方体以生成建筑
- 眼睛(或摄影机或视图)坐标空间是根据您查看场景的方式定义的。前两个空间可以用任何方便的方式定义,但有了这个空间,就有了空间如何开始映射到屏幕的规则。在眼睛空间中,X轴向右增加,Y轴向上增加,Z轴指向你的后面——也就是说,相机在负Z方向上观看
- Clip空间是橡胶与道路相交的地方——OpenGL(ES)在这里选择要绘制的内容以及它在屏幕上的位置。因此,它的定义非常严格:立方体中在所有三个轴上从
扩展到-1.0
的任何内容都会显示在屏幕上。(立方体之外的任何物体都会被“剪裁”。)与眼睛空间一样,+X是正确的,+Y是向上的,+Z更接近观察者1.0
glkbaseffect
即a),该矩阵本身可能是多个变换的串联
- 模型矩阵从模型转换到世界空间。那个城市景观的例子?对于每个建筑,您可以在一个方向上缩放立方体以形成摩天大楼,然后在X和Z方向上平移立方体以将其放置在世界中--这是一个模型变换
- 视图矩阵从世界变换到眼睛空间。您可以通过平移和旋转构建视图矩阵(毕竟,移动摄影机与向相反方向移动世界是一样的),但大多数三维数学库为您提供了方便,如
,允许您根据a)摄影机的位置,b)正在查看的点,和c)哪个方向应为“向上”GLKMatrix4MakeLookAt
- 投影矩阵从眼睛空间变换到剪辑空间。通常使用透视投影(
),该投影定义了可以根据视角、纵横比以及远近限制看到的内容。(换句话说,你能看到的区域适合从你的眼睛向外扩展到无穷大的棱锥体,我们从棱锥体上切下一个截面或平截头体,以定义实际在屏幕上绘制的深度范围。)GLKMatrix4MakePerspective
glkbaseffect
时,您将提供一个模型视图矩阵和一个投影矩阵,并根据需要将它们相乘或反转
还在吗?:) 你得到的是从模型空间到眼睛空间的转换。(在像您这样的简单场景中,模型空间和世界空间通常是相同的。)您没有剪辑空间的投影变换,因此OpenGL ES将您的眼睛空间解释为剪辑空间。根据顶点坐标的不同,所有几何体可能位于-1:1立方体之外,因此您将看不到任何东西
到目前为止,所有转换都应该相乘,并作为ModelView矩阵提供给
GLKBaseEffect
。然后,使用已经计算的纵横比创建透视投影(GLKMatrix4MakePerspective
),并将其作为投影矩阵提供给GLKBaseEffect
。我没有看到从(通过theta
/phi
旋转)眼睛坐标转换为剪辑坐标的投影矩阵。这可能是你的问题的一部分。。。除此之外,它可能有助于澄清“不完全发生”;这是一个投影矩阵?还是我遗漏了什么?同样,在这种情况下,不完全发生意味着白色屏幕上什么也没有。谢谢,我想我现在明白了。将开始实施。