Как отладить пользовательскую геометрию в SceneKit с помощью Swift

Я пытаюсь научиться создавать пользовательскую геометрию в SceneKit. Тем не менее, я попытался сделать треугольник, и он ничего не показывает. Я в растерянности относительно того, как отладить это. Есть ли способ выяснить, действителен ли треугольник? Я просто не знаю с чего начать.

Для справки, код игровой площадки ниже. Обратите внимание, что он написан против Swift 4, но изменения между Swift 3 и Swift 4 настолько незначительны, что заставить его скомпилировать в Swift 3 тривиально.

import UIKit
import SceneKit

let points = [
    SCNVector3Make(0, 0, 0),
    SCNVector3Make(0, 10, 0),
    SCNVector3Make(10, 0, 0),
]
let indices = [
    0,2,1,
]

let vertexSource = SCNGeometrySource(vertices: points)
let element = SCNGeometryElement(indices: indices, primitiveType: .triangles)
let geo = SCNGeometry(sources: [vertexSource], elements: [element])

2 ответа

Решение

При создании кастома SCNGeometryElements тип индексов должен быть Int161 Я не думаю, что это задокументировано. Но когда вы меняете декларацию индексов тоже

let indices: [Int16] = [
    0, 2, 1
]

должен появиться треугольник.


редактировать

1: Как отметил @mnuages, SceneKit поддерживает только 32-битные целые числа в качестве индексов. Так что вы можете использовать Int8, Int16 а также Int32,

Из документации для типа Int мы получаем, что

На 32-разрядных платформах размер Int совпадает с размером Int32, а на 64-разрядных платформах размер Int совпадает с размером Int64.

Так что в Swift Playground вы в конечном итоге Int64,

Это печально, потому что SceneKit (и Metal) поддерживают только UInt8, UInt16 а также UInt32, В консоли отладчика вы должны увидеть предупреждение SceneKit о неподдерживаемом индексе шириной 64 бита.

Другие вопросы по тегам