gpt4 book ai didi

swift - `UnsafePointer` 机制能否显示数据缓冲区中的向量数组以供在 SceneKit 中使用?

转载 作者:搜寻专家 更新时间:2023-11-01 07:11:43 26 4
gpt4 key购买 nike

我有一个二进制文件,其中包含许多 Float 值的三元组;它实际上是一长串 SCNVector3,表示 SCNGeometrySource 的顶点。我将文件(请原谅遗漏了 do-try-catch 等)读入内存:

let sceneVectors = Data(contentsOf: sceneURL)

并希望将内存数据作为 [SCNVector3] 传递给 SceneKit:

let sceneGeometry = SCNGeometrySource(vertices: sceneVectors)

我今天一直在努力使用 UnsafePointer 机制将 Data 缓冲区的内容重新键入为 SCNVector3 的数组以满足 SCNGeometrySource 契约;像这样。

dataBuffer.withUnsafeBytes { 
(vertexBuffer: UnsafePointer<SCNVector3>) -> SCNGeometry in
« magic happens here »
return sceneGeometry
}

我对这个的阅读告诉我,在闭包中,缓冲区可以作为 SCNVector3 的数组访问,但是当传递给 SCNGeometrySource 时,它会导致 Swift 报告:

cannot convert value of type 'UnsafePointer<SCNVector3>' to expected argument type '[SCNVector3]'

像往常一样,我怀疑有一个我还没有想出的简单解决方案,所以如果有任何解决此问题的建议,我将不胜感激。

最佳答案

SCNGeometrySource(vertices: sceneVectors) 中你必须通过向量的数组,而不是指针:

let sceneGeometry = dataBuffer.withUnsafeBytes {
(vertexBuffer: UnsafePointer<SCNVector3>) -> SCNGeometrySource in
let sceneVectors = Array(UnsafeBufferPointer(start: vertexBuffer, count: dataBuffer.count/MemoryLayout<SCNVector3>.stride))
return SCNGeometrySource(vertices: sceneVectors)
}

在 Swift 3 中(但不再在 Swift 4 中)SCNGeometrySource 有另一个初始化器,它接受一个指向 SCNVector3 的指针和一个计数:

let sceneGeometry = dataBuffer.withUnsafeBytes {
(vertexBuffer: UnsafePointer<SCNVector3>) -> SCNGeometrySource in
return SCNGeometrySource(vertices: vertexBuffer, count: dataBuffer.count/MemoryLayout<SCNVector3>.stride)
}

可以短接

let sceneGeometry = dataBuffer.withUnsafeBytes {
SCNGeometrySource(vertices: $0, count: dataBuffer.count/MemoryLayout<SCNVector3>.stride)
}

关于swift - `UnsafePointer` 机制能否显示数据缓冲区中的向量数组以供在 SceneKit 中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44534900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com