在Swift中使用GLKit中的GLKMath

12

所以我正在使用《iOS游戏教程》这本书,作者是Ray Wenderlich,并尝试利用其中的Objective-C代码使我的游戏中的加速计控制角色。不过,我想使用Swift代替Objective-C。当我尝试创建一个GLKVector3类型的变量时(它表示一个三维向量),我遇到了问题。当我输入以下内容时:

var raw:GLKVector3 = GLKVector3Make(irrelevant stuff)

我遇到了以下错误:

使用GLKVector3模块作为类型。

我的Swift文件顶部有一个导入GLKit的语句:

import GLKit

你有什么想法可以让我在我的程序中使用GLKMath文件的功能吗?

3个回答

8
Swift 1.2 版本新增了 union 支持,导入 union 中的字段是只读的,即使声明为 var 也不可更改,但必要时可以传递给 C 函数。Swift 1.2 的发布说明暗示这些字段可能根本无法访问,但至少对于 GLKit 类型仍然可读取:Swift 现在可以部分地导入包含 unions、bitfields、SIMD 向量类型和其他 Swift 不支持的 C 语言特性的 C 聚合体。从 Swift 中不支持的字段将无法访问,但可使用具有这些类型参数和返回值的 C 和 Objective-C API 在 Swift 中进行调用。其中包括 Foundation NSDecimal 类型和 GLKit GLKVectorGLKMatrix 等其他类型。

1
这是否意味着我完全不能使用GLKVector3? - DShaar
3
据我所知,目前的Swift语言不支持联合类型。虽然可能会在未来的版本中添加联合类型,但我还没有看到相关的消息。如果您有需要,可以提交一个错误报告(bug report)来反映这个问题。 - Nate Cook
有一个可能的解决方法(创建一个C函数),请参见:http://stackoverflow.com/questions/8262004/converting-cgpoint-to-glkvector2-in-objective-c,前提是接收方(框架、objc库)已经实现了联合体。 - CodeSmile
@LearnCocos2D 你尝试过了吗?问题在于Swift没有桥接GLKVector3类型,因此编译器不会识别或允许任何实例。 - Nate Cook
1
你可以将其包装在一个 Objective-C 接口中,将 GLK 结构公开为 Swift 可以使用的自定义结构。当然,如果您必须直接与使用 GLKit 结构的 API 进行接口,特别是子类化并重写带有 GLK 结构参数的方法,则这将不再有用,因为在 Swift 中不可能实现这些操作。 - CodeSmile

3

随着Xcode 6.3/Swift 1.2的beta版于昨天发布(2015年2月8日),现在可以从Swift中使用GLKit。


1
有没有想法如何将GLKMatrices作为uniforms传递?我试图将其转换为UnsafePointer<Float>,但没有成功。希望能得到一些指针,就像它们一样! - Gusutafu
1
@Gusutafu `var viewProj = GLKMatrix4Multiply(...) var pData = uniformBuffer.contents() pData.advancedBy(sizeof(GLKMatrix4) * inflightBufferIndex) let address = withUnsafePointer(&viewProj) { UnsafeMutablePointer<Float>($0) } memcpy(pData, address, sizeof(GLKMatrix4))` - aoakenfo

2

请查看我的代码库:https://github.com/noxytrux/SwiftGeom。我实际上已经构建了一个完整的库,因此您不再需要使用GLKit或等待苹果在Swift中实现它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接