Я довольно новичок в Swift и XCode, однако, я программирую на других языках уже несколько лет.Я пытаюсь процедурно создать 3D-сетку в SceneKit (iOS).Мой код работает, как и ожидалось, однако, при запуске приложения сгенерированный объект отображает плоский черный цвет, игнорируя все освещение.Я также добавил куб в сцену, чтобы показать, что освещение сцены работает.
Я мог бы предположить, что либо есть проблема с шейдером, либо мне нужно определить нормали геометрии, чтобы это исправить,Я попытался поиграться с некоторыми свойствами SCNMaterial, но, похоже, они ничего не меняют.
Если это всего лишь случай определения нормалей, пожалуйста, не могли бы вы посоветовать, как мне это сделать вSwift / SceneKit.Или, может быть, я что-то упустил, любая помощь будет высоко ценится.
Снимок экрана ниже: ![Rendering black, unlit](https://www.dropbox.com/s/jhb8cv1197u26e9/Screenshot%202019-01-22%20at%2019.52.59.png?raw=1)
Мой код ниже:
public static func CreateMesh (size: CGFloat, resolution: CGFloat) -> SCNNode? {
let axisCount = Int(floor(size / resolution))
let bottomLeft = CGVector(
dx: CGFloat(-(axisCount / 2)) * resolution,
dy: CGFloat(-(axisCount / 2)) * resolution
)
var verts = Array(
repeating: Array(
repeating: (i: Int(0), pos: SCNVector3.init(x: 0, y: 0, z: 0)),
count: axisCount),
count: axisCount
)
var vertsStream = [SCNVector3]()
var i : Int = 0
for x in 0...axisCount-1 {
for y in 0...axisCount-1 {
verts[x][y] = (
i,
SCNVector3(
x: Float(bottomLeft.dx + CGFloat(x) * resolution),
y: Float.random(in: 0..<0.1),
z: Float(bottomLeft.dy + CGFloat(y) * resolution)
)
)
vertsStream.append(verts[x][y].pos)
i += 1
}
}
var tris = [(a: Int, b: Int, c: Int)]()
var trisStream = [UInt16]()
for x in 0...axisCount - 2 {
for y in 0...axisCount - 2 {
// Quad
tris.append((
a: verts[x][y].i,
b: verts[x][y+1].i,
c: verts[x+1][y+1].i
))
tris.append((
a: verts[x+1][y+1].i,
b: verts[x+1][y].i,
c: verts[x][y].i
))
}
}
for t in tris {
trisStream.append(UInt16(t.a))
trisStream.append(UInt16(t.b))
trisStream.append(UInt16(t.c))
}
// Create scene element
let geometrySource = SCNGeometrySource(vertices: vertsStream)
let geometryElement = SCNGeometryElement(indices: trisStream, primitiveType: .triangles)
let geometryFinal = SCNGeometry(sources: [geometrySource], elements: [geometryElement])
let node = SCNNode(geometry: geometryFinal)
////////////////////////
// FIX MATERIAL
////////////////////////
let mat = SCNMaterial()
mat.diffuse.intensity = 1
mat.lightingModel = .blinn
mat.blendMode = .replace
node.geometry?.materials = [mat]
return node
}