Я написал тестовое приложение для iOS на SwiftUI, которое показывает SpriteView и SceneView. SpriteView показывает (помимо прочего) два узла SK3DNode, которые отображают одну и ту же SCNScene с разных позиций камеры. SceneView отображает один и тот же SCNScene.
Проблема в том, что визуализированная сцена в обоих SK3DNode отображается темнее, чем в SceneView. >
Сцены в SpriteKit непригодны для использования, поскольку они слишком темные.
Это скриншот из симулятора iPad:

Я ожидал, что оба SK3DNode (в верхней половине), чтобы отобразить сцену с той же яркостью, что и SceneView (нижняя половина).
Если я просто увеличу окружающее освещение, объекты показаны слишком яркими.
Я думал, проблема в текстуре или материале, но проблема возникает и с цветами. Отсюда и красные/зеленые/синие формы.
Я отключил встроенное освещение SK3DNode, установив для autoenablesDefaultLighting значение false. Каким-то образом SceneView (или его внутренний SCNView) должен добавлять собственное освещение, но я не могу понять, как это сделать. В корневом узле сцены показаны только мои узлы из файла .scn.
Я отключил среду в файле сцены, чтобы неба не было. куб. Имеется один источник рассеянного света, один точечный источник света и один всенаправленный свет. Независимо от того, какое освещение я использую, оба SK3DNode по-прежнему представляют сцену намного темнее, чем SceneView.
Вот функция, создающая два SK3DNode:
Код: Выделить всё
func make3DNode(camPos: SCNVector3) -> SK3DNode {
// Add SceneKit scene in 3D node
let node3d = SK3DNode(viewportSize: CGSize(width: 300, height: 200))
node3d.scnScene = scnScene
node3d.autoenablesDefaultLighting = false
let camera = SCNCamera()
let cameraNode = SCNNode()
cameraNode.camera = camera
if let lookAtTarget = scnScene.rootNode.childNode(withName: "red_texture", recursively: false) {
let constraint = SCNLookAtConstraint(target: lookAtTarget)
// why does this not work?
cameraNode.constraints = [constraint]
}
cameraNode.position = camPos
node3d.pointOfView = cameraNode
return node3d
}
Код для добавления узлов на сцену:
Код: Выделить всё
// Add SceneKit nodes
let node3d_1 = make3DNode(camPos: SCNVector3(x: -5, y: -2, z: 14))
node3d_1.name = "3d_1"
node3d_1.position = CGPoint(x: 150, y: 110)
spriteScene.addChild(node3d_1)
let node3d_2 = make3DNode(camPos: SCNVector3(x: 5, y: 2, z: 14))
node3d_2.name = "3d_2"
node3d_2.position = CGPoint(x: 150, y: -110)
spriteScene.addChild(node3d_2)
Он включает в себя как файл сцены SpriteKit, так и файл SceneKit. . SK3DNode добавляются программно. Я не могу вставить код для сцен, поскольку я создал файлы сцен как для SpriteKit, так и для SceneKit. Лучше всего, если вы скачаете проект GitHub и нажмите Cmd+R в Xcode для какого-нибудь симулятора iPad.
Заранее благодарим за любую помощь.
Подробнее здесь: https://stackoverflow.com/questions/784 ... in-scnview