Swift - SCNVector4到NSValue的数组?

时间:2016-09-09 08:30:33

标签: objective-c swift scenekit nsvalue

如何将矢量数组转换为NSValue?例如,单个SCNVector4有一个方便的启动,但是如何将它用于数组呢?

像:

let v1 = SCNVector4(x: 0.0, y: 0.0, z: 0.0, w: 0.0)
let v2 = SCNVector4(x: 1.0, y: 0.0, z: 0.0, w: 0.0)

let value = NSValue(scnVector4: v1) // that works
let arrayValue = NSValue(scnVectors4: [v1, v2]) // that obviously doesnt work :( What will work?

=== context ===

我想使用着色器修改器(在SceneKit中)将点传递给着色器。着色器中的代码是:

uniform vec4 u_points[7];

我试图将这些点传递给着色器:

material.setValue(points, forKey: "u_points") // points is a [SCNVector4] with length 7

这不起作用。如果我有一个向量(uniform vec4 u_point;),我可以这样做:

material.setValue(NSValue(vec4: points[0]), forKey: "u_point")

这是有效的。同样,如果着色器使用长度为1的数组(即uniform vec4 u_points[1];),则先前的绑定也可以。所以听起来如果我可以传递长度为4x7 = 28而不是数组的矢量,我应该很好

====尝试====

1 / NSNr的NSNumber

如评论中所述,setValue可以输入任何内容,因此我尝试使用NSNr的NSArray:

let points = [v1, v2]
let a = points.map({ return [$0.x, $0.y, $0.z] })
.flatMap({ return $0 })
  .map({ return NSNumber(value: $0) }) // a is [NSNumber] of length 2x4 = 8

material.setValue(NSArray(array: a), forKey: "u_points")

但这不起作用

2 / SCNVector3的NSArray:没有工作

3 / SCNVector3的NSValue的NSArray:没有工作

4 NSArray of NSNrray的NSArray:没有工作

如果Apple有一些好的文档,那就太好了......

1 个答案:

答案 0 :(得分:0)

我不确定这会解决您的问题,但NSValue可以包含一些固定大小的数组。

let v1 = SCNVector4(x: 0.0, y: 0.0, z: 0.0, w: 0.0)
let v2 = SCNVector4(x: 1.0, y: 0.0, z: 0.0, w: 0.0)

let value = NSValue(scnVector4: v1) // that works
let arrayValue = NSValue(bytes: [v1, v2], objCType: "[2{SCNVector4=ffff}]")

检查the reference of NSValue classType Encodings

init(bytes:objCType:)

  

声明

init(bytes value: UnsafeRawPointer,  
     objCType type: UnsafePointer<Int8>)
     

参数    - 价值|指向要存储在新值对象中的数据的指针。

     

输入| Objective-C类型的值,由@encode()提供   编译指令。 不要将此参数硬编码为C   字符串。

您可能需要对类型进行硬编码,因为Swift中没有@encode()指令。