在我生气之前,我想在这里询问以下问题。 我在Swiftui中写了一个iOS测试应用,该应用显示了一个
SpriteView
和一个。
SceneView
(除其他外)显示了两个节点,这些节点从不同的相机位置显示一个和相同的节点。
SpriteView
渲染非常相同。
问题是,两个SK3Dnode中的渲染场景都比场景视图中的黑暗显示。SpriteKit中的场景是无法使用的,因为它们太黑了。
这是iPad模拟器的屏幕截图:
I期望两个(在上半部)都以与
SK3DNode
(下半部分)相同的亮度呈现场景。
如果我只是增加了环境光,则显示对象太亮了。我认为问题是纹理或材料,但是问题也出现在颜色上。因此,红色/绿色/蓝色形状。 我已经通过将
SCNScene
设置为SceneView
来禁用
SCNScene
SK3DNode
仅在.scn文件中显示我的节点。 我已经在场景文件中删除了环境,因此没有Sky Cube。有一个环境光源,一个斑点和一个Omni灯。我使用哪个灯,两个都不是
SceneView
SK3DNode
仍然比autoenablesDefaultLighting
false
。在此创建两个
SceneView
S的函数:SCNView
旁注:相机lookat约束似乎也无法正常工作。
编码将节点添加到场景中:
rootNode
full项目来源:Https://github.com/biochill/test-spritekit
IT包括SpriteKit场景文件和SceneKit文件。以编程方式添加
SK3DNode
。我无法粘贴场景代码,因为我已经为SpriteKit和Scenekit创建了场景文件。最好如果您下载GitHub项目并在某些iPad Simulator中击中Xcode中的CMD+R。感谢您提前任何帮助。
我所做的就是制作两个场景(屏幕的嵌入式和下部
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
}
ContentView.swift // 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)
我还重新启用了代码线:SK3DNode
文件:
Mysceneview.swift
SpriteKit
最重要的部分来到这里,有效地解决了我的测试中的问题。 您需要在项目中添加有效的文件。
添加此内容:
SceneKit
autoenablesDefaultLighting
注:您不会在此处看到此设置:
这就是我的iPad mini上的样子:
further调整:如前所述,您可以手动管理照明。 我希望这可以解决黑暗的场景。