如何将矢量数组转换为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有一些好的文档,那就太好了......
答案 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
class和Type Encodings。
声明
init(bytes value: UnsafeRawPointer, objCType type: UnsafePointer<Int8>)
参数 - 价值|指向要存储在新值对象中的数据的指针。
输入| Objective-C类型的值,由@encode()提供 编译指令。 不要将此参数硬编码为C 字符串。 强>
您可能需要对类型进行硬编码,因为Swift中没有@encode()
指令。