在Apple pARk示例代码中使用数学

时间:2012-03-13 09:23:38

标签: ios

我研究过pARK示例项目(http://developer.apple.com/library/IOS/#samplecode/pARk/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011083)所以我可以在我正在开发的应用程序中应用它的一些基础知识。我几乎了解所有事情,除了:

  • 必须计算是否必须出现兴趣点的方式。它得到了姿态,将它与投影矩阵相乘(以获得GL坐标中的旋转?),然后将该矩阵与感兴趣点的坐标相乘,最后,查看该矢量的最后一个坐标以找出如果必须显示兴趣点。这是什么数学基础?

非常感谢!!

1 个答案:

答案 0 :(得分:11)

我假设您指的是以下方法:

- (void)drawRect:(CGRect)rect
{
     if (placesOfInterestCoordinates == nil) {
         return;
     }

    mat4f_t projectionCameraTransform;
    multiplyMatrixAndMatrix(projectionCameraTransform, projectionTransform, cameraTransform);

    int i = 0;
    for (PlaceOfInterest *poi in [placesOfInterest objectEnumerator]) {
        vec4f_t v;
        multiplyMatrixAndVector(v, projectionCameraTransform, placesOfInterestCoordinates[i]);

        float x = (v[0] / v[3] + 1.0f) * 0.5f;
        float y = (v[1] / v[3] + 1.0f) * 0.5f;
        if (v[2] < 0.0f) {
            poi.view.center = CGPointMake(x*self.bounds.size.width, self.bounds.size.height-y*self.bounds.size.height);
            poi.view.hidden = NO;
        } else {
            poi.view.hidden = YES;
        }
        i++;
    }
}

这是在感兴趣的地方执行类似顶点转换的OpenGL,以检查它们是否在可见的视锥体中。截锥体在以下行中创建:

createProjectionMatrix(projectionTransform, 60.0f*DEGREES_TO_RADIANS, self.bounds.size.width*1.0f / self.bounds.size.height, 0.25f, 1000.0f);

这设置了一个平截头体,其视角为60度,近剪裁平面为0.25,远剪裁平面为1000.任何远离1000个单位的兴趣点都将不可见。

因此,要逐步执行代码,首先是设置平截头体的投影矩阵,以及相对于相机旋转对象以使其相对于相机正确向上的相机视图矩阵相乘。然后,对于每个感兴趣的地方,其位置乘以viewProjection矩阵。这会将感兴趣的地方的位置投影到视锥体,应用旋转和透视。

接下来的两行然后将地点的变换位置转换为什么称为标准化设备坐标。需要将4分量矢量折叠到3维空间,这是通过将矢量除以其w分量v [3]将其投影到平面w == 1上来实现的。然后可以通过检查其坐标是否位于边长为2且具有原点[0,0,0]的立方体中来确定该点是否位于投影平截头体内。在这种情况下,x和y坐标偏离范围[-1 1]到[0 1]以匹配UIKit坐标系,加1并除以2.

接下来,检查v [2]分量z是否大于0.这实际上是错误的,因为它没有偏差,应该检查它是否大于-1。这将检测感兴趣的地方是否在投影平截头体的前半部分,如果是,那么该物体被视为可见并显示。

如果您不熟悉顶点投影和坐标系,这是一个很大的主题,学习曲线相当陡峭。然而,网上有很多材料可供选择,以下是一些可以帮助您入门的链接:

http://www.falloutsoftware.com/tutorials/gl/gl0.htm

http://www.opengl.org/wiki/Vertex_Transformation

祝你好运//