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

标签 ios

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

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

非常感谢!!

最佳答案

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

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

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

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

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

如果您不熟悉顶点投影和坐标系,这是一个庞大的主题,学习曲线相当陡峭。然而,网上有很多关于它的 Material ,这里有几个链接可以帮助您入门:

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

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

祝你好运//

关于ios - 在 Apple pARk 示例代码中使用数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9681298/

相关文章:

ios - 致命异常: NSInternalInconsistencyException how to find offending code?

ios - 在 iOS 中通过谷歌搜索图片

ios - 在 ios 7 中启用编辑时,UITableViewCell subview 不移动

ios - 如何从我的自定义正在进行的调用 UI 结束 callkit 上的调用 session ?

ios - 在 iOS 中发送 SPDY 请求导致 NSUrlSession 出现 "The request timed out"错误

iphone - iOS 中的两指滑动与一指拖动

android - 是否可以在 Flutter 应用程序中使用 C++ 进行网络编程?

ios - iOS 中 View 外内容的 Nativescript 布局不正确

ios - 上传 IMessage 扩展

iphone - UILabel 多组值