Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.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
Ios OpenGL ES使摄影机环绕对象旋转_Ios_Opengl Es_Opengl 3_Glkit - Fatal编程技术网

Ios OpenGL ES使摄影机环绕对象旋转

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

我想在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(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
    扩展到
    1.0
    的任何内容都会显示在屏幕上。(立方体之外的任何物体都会被“剪裁”。)与眼睛空间一样,+X是正确的,+Y是向上的,+Z更接近观察者

顶点处理使用最多三个变换(通常连接在一起)来获取顶点数据(在模型空间中指定),一直到剪裁空间,以便OpenGL(ES)可以绘制它。每个变换都由一个4x4矩阵指定(带有
glkbaseffect
即a),该矩阵本身可能是多个变换的串联

  • 模型矩阵从模型转换到世界空间。那个城市景观的例子?对于每个建筑,您可以在一个方向上缩放立方体以形成摩天大楼,然后在X和Z方向上平移立方体以将其放置在世界中--这是一个模型变换

  • 视图矩阵从世界变换到眼睛空间。您可以通过平移和旋转构建视图矩阵(毕竟,移动摄影机与向相反方向移动世界是一样的),但大多数三维数学库为您提供了方便,如
    GLKMatrix4MakeLookAt
    ,允许您根据a)摄影机的位置,b)正在查看的点,和c)哪个方向应为“向上”

  • 投影矩阵从眼睛空间变换到剪辑空间。通常使用透视投影(
    GLKMatrix4MakePerspective
    ),该投影定义了可以根据视角、纵横比以及远近限制看到的内容。(换句话说,你能看到的区域适合从你的眼睛向外扩展到无穷大的棱锥体,我们从棱锥体上切下一个截面或平截头体,以定义实际在屏幕上绘制的深度范围。)

要将顶点数据渲染到屏幕上,它必须经过所有三个变换——通常将它们相乘,以创建ModelViewProjection矩阵,然后提供给GPU用于变换每个顶点位置。照明计算通常在眼睛空间中完成,因此通常会单独向GPU提供ModelView矩阵(或者相反,它的逆转置,用于变换曲面法线)

当您使用
glkbaseffect
时,您将提供一个模型视图矩阵和一个投影矩阵,并根据需要将它们相乘或反转


还在吗?:)

你得到的是从模型空间到眼睛空间的转换。(在像您这样的简单场景中,模型空间和世界空间通常是相同的。)您没有剪辑空间的投影变换,因此OpenGL ES将您的眼睛空间解释为剪辑空间。根据顶点坐标的不同,所有几何体可能位于-1:1立方体之外,因此您将看不到任何东西


到目前为止,所有转换都应该相乘,并作为ModelView矩阵提供给
GLKBaseEffect
。然后,使用已经计算的纵横比创建透视投影(
GLKMatrix4MakePerspective
),并将其作为投影矩阵提供给
GLKBaseEffect

我没有看到从(通过
theta
/
phi
旋转)眼睛坐标转换为剪辑坐标的投影矩阵。这可能是你的问题的一部分。。。除此之外,它可能有助于澄清“不完全发生”;这是一个投影矩阵?还是我遗漏了什么?同样,在这种情况下,不完全发生意味着白色屏幕上什么也没有。谢谢,我想我现在明白了。将开始实施。