在Apple pARk示例代码中使用math

我研究了pARK示例项目(http://developer.apple.com/library/IOS/#samplecode/park/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011083),所以我可以申请一些它的基础在我正在开发的应用程序中。 我明白几乎所有的东西,除了:

  • 必须计算一个兴趣点是否必须出现的方式。 它得到的态度,乘以投影matrix(以获得在GL坐标旋转?),然后乘以该matrix与感兴趣的点的坐标,最后,看看该vector的最后一个坐标来找出如果兴趣点必须显示。 这是math基础?

非常感谢!!

我假定你指的是以下方法:

- (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,以检查它们是否处于可视的视锥体中。 平截头体是在以下行中创build的:

 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个单位的兴趣点将不可见。

因此,为了遍历代码,首先将构成平截头体的投影matrix和相对于相机简单地旋转对象的摄像机视图matrix相乘,然后相乘。 然后,对于每个感兴趣的地点,其位置乘以viewProjectionmatrix。 这将把感兴趣的地点的位置投影到视锥体中,应用旋转和透视。

接下来的两行然后将该地点的变换位置转换成被称为标准化设备坐标的东西。 4分量vector需要折叠到3维空间,这是通过将vector除以其w分量v [3],将其投影到平面w == 1上来实现的。 然后可以通过检查其坐标是否位于具有原点[0,0,0]的边长为2的立方体中来确定该点是否位于投影平截头体内。 在这种情况下,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

祝你好运//