Как правильно отобразить точки в SceneKit с цветами, включая альфа-значения? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь отобразить коллекцию точек в 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)

Expected rendering

Однако, если я переместу свою камеру на следующую грань куба по часовой стрелке, альфа больше не рендерится:

cameraNode.eulerAngles = SCNVector3(0, -0.5 * CGFloat.pi, 0)
cameraNode.position = SCNVector3(x: -10, y: 0, z: 0)

Undesired rendering

Размещение камеры наполовину дает комбинацию из двух:

cameraNode.eulerAngles = SCNVector3(0, 0, 0)
cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)

Semi-expected rendering

...