是否有Cocoa类型用于表示3D点

时间:2011-05-16 12:10:27

标签: objective-c cocoa

Cocoa中,有一个NSPoint类型来表示二维空间中的点。我找不到表示3D类型的方法。是否有一个,在这种情况下它叫什么?或者我应该自己滚动?

3 个答案:

答案 0 :(得分:5)

是的,自己动手吧。我使用这样的东西:

typedef struct Point3D_ {
  CGFloat x, y, z;
} Point3D;

答案 1 :(得分:3)

这样做可以更容易地创建Point3D:

Point3D Point3DMake( CGFloat xx, CGFloat yy, CGFloat zz ){
  Point3D p;  
  p.x = xx; p.y = yy; p.z = zz;
  return p;
}

答案 2 :(得分:3)

虽然我还没有记住或发现AppKit或Cocoa核心中与CGPoint直接相关的东西,但Apple确实在“额外”框架内提供了一些类型。这是迄今为止我所拥有的一系列作品。

SceneKit

Apple的SceneKit提供了一个SCNVector3类型,documented是一个简单的结构:

typedef struct SCNVector3 { CGFloat x, y, z; } SCNVector3;

SCNVector3Make SCNVector3EqualToVector3union _GLKVector3 { struct { float x, y, z; }; struct { float r, g, b; }; struct { float s, t, p; }; float v[3]; }; typedef union _GLKVector3 GLKVector3; ,还有一个要在GLKit向量之间进行转换。

GLKit

Apple的GLKit提供了一个类型a few helper functions,具有更多功能和帮助函数。

GLKVector3Make

正如您所看到的,它是多种类型的联合,包括一个简单的x / y / z结构和一个可转换的浮点数组 - 所以一旦你创建了一个,你就可以通过许多不同的方式方便地访问它的值。在你的背景下有意义。

除了简单的GLKVector3Length之外,还有许多几何计算助手,例如: GLKVector3DotProductGLKVector3Lerp以及vector_float3

如果您不介意拉入GLKit,这个似乎很好用。

SpriteKit

Apple的SpriteKit定义typedef __attribute__((__ext_vector_type__(3))) float vector_float3; GLKVector3

{{1}}

这使用a bit messier(Clang也许也是GCC?)将其定义为SIMD友好类型。但除此之外,它似乎并不特别适合开发人员。

CoreLocation

我猜这在大多数情况下不是一个好选择,但Apple的CoreLocation为位置提供了专门的多维类型。 compiler extension具有纬度/经度/海拔高度的属性(除了时间戳,精度值,速度,航向等)。因此您可以将此用于3D数据,但仅在数据相对于地球表面时才建议使用!