答案 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确实在“额外”框架内提供了一些类型。这是迄今为止我所拥有的一系列作品。
Apple的SceneKit提供了一个SCNVector3
类型,documented是一个简单的结构:
typedef struct SCNVector3 { CGFloat x, y, z; } SCNVector3;
SCNVector3Make
有
SCNVector3EqualToVector3
和union _GLKVector3 {
struct { float x, y, z; };
struct { float r, g, b; };
struct { float s, t, p; };
float v[3];
};
typedef union _GLKVector3 GLKVector3;
,还有一个要在GLKit向量之间进行转换。
Apple的GLKit提供了一个类型a few helper functions,具有更多功能和帮助函数。
GLKVector3Make
正如您所看到的,它是多种类型的联合,包括一个简单的x / y / z结构和一个可转换的浮点数组 - 所以一旦你创建了一个,你就可以通过许多不同的方式方便地访问它的值。在你的背景下有意义。
除了简单的GLKVector3Length
之外,还有许多几何计算助手,例如: GLKVector3DotProduct
和GLKVector3Lerp
以及vector_float3
。
如果您不介意拉入GLKit,这个似乎很好用。
Apple的SpriteKit定义typedef __attribute__((__ext_vector_type__(3))) float vector_float3;
,GLKVector3:
{{1}}
这使用a bit messier(Clang也许也是GCC?)将其定义为SIMD友好类型。但除此之外,它似乎并不特别适合开发人员。
我猜这在大多数情况下不是一个好选择,但Apple的CoreLocation为位置提供了专门的多维类型。 compiler extension具有纬度/经度/海拔高度的属性(除了时间戳,精度值,速度,航向等)。因此您可以将此用于3D数据,但仅在数据相对于地球表面时才建议使用!