Я пытаюсь отобразить коллекцию точек в SceneKit, все из которых имеют альфа-значение меньше 1 как часть их цвета. Хотя это работает, это зависит от угла, под которым вы смотрите на точку.
Мой текущий метод - создать массив вершин с соответствующими цветами и индексами, обернуть их внутри SCNGeometrySource / SCNGeometryElement и создать пользовательскую SCNGeometry из тезисов. Элемент SCNGeometryElement для индексов настроен для отображения в виде точек. Пример кода ниже о том, как я это настраиваю.
var vertices = [SCNVector3]()
var colors = [float4]()
var indices = [UInt32]()
for x in 0...10 {
for y in 0...10 {
for z in 0...10 {
vertices.append(SCNVector3(x - 5, y - 5, z - 5))
colors.append(float4(0.7, 0.7, 0.7, 0.1))
indices.append(UInt32(vertices.count - 1))
}
}
}
let vertexSource = SCNGeometrySource(vertices: vertices)
let colorsData = Data(bytes: &colors, count: colors.count * MemoryLayout<float4>.stride)
let colorSource = SCNGeometrySource(data: colorsData, semantic: .color, vectorCount: colors.count, usesFloatComponents: true, componentsPerVector: 4, bytesPerComponent: MemoryLayout<Float>.stride, dataOffset: 0, dataStride: MemoryLayout<float4>.stride)
let pointsElement = SCNGeometryElement(indices: indices, primitiveType: .point)
pointsElement.pointSize = 0.2
pointsElement.minimumPointScreenSpaceRadius = 1
pointsElement.maximumPointScreenSpaceRadius = 50
let geometry = SCNGeometry(sources: [vertexSource, colorSource], elements: [pointsElement])
let node = SCNNode(geometry: geometry)
scene.rootNode.addChildNode(node)
Когда узел моей камеры расположен следующим образом, все выглядит хорошо:
cameraNode.eulerAngles = SCNVector3(0, 0.5 * CGFloat.pi, 0)
cameraNode.position = SCNVector3(x: 10, y: 0, z: 0)
Однако, если я переместу свою камеру на следующую грань куба по часовой стрелке, альфа больше не рендерится:
cameraNode.eulerAngles = SCNVector3(0, -0.5 * CGFloat.pi, 0)
cameraNode.position = SCNVector3(x: -10, y: 0, z: 0)
Размещение камеры наполовину дает комбинацию из двух:
cameraNode.eulerAngles = SCNVector3(0, 0, 0)
cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)