swift - 如何在 SceneKit 中实现逼真的景深效果?

标签 swift 3d camera scenekit virtual-reality

我正在尝试渲染具有逼真的景深效果的帧。我已经在 camera 节点中尝试了景深属性,但它没有产生可用的结果。

是否有景深效果的最大渲染质量开关?性能不是一个因素,我只需要渲染一帧,用户可以等待。

最佳答案

SceneKit 中逼真的景深效果

在 SceneKit 中,您可以轻松实现看起来很酷的 shallow/deep 景深 (DoF)。而且它的处理不是非常强烈。 .focusDistance.fStop 参数对于应用 DoF 至关重要:

cameraNode.camera?.wantsDepthOfField = true
cameraNode.camera?.focusDistance = 5
cameraNode.camera?.fStop = 0.01
cameraNode.camera?.focalLength = 24

enter image description here


使用以下代码进行测试(macOS版本):

import SceneKit
import Cocoa

class GameViewController: NSViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let scene = SCNScene()
        
        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.camera?.wantsDepthOfField = true
        cameraNode.camera?.focusDistance = 5
        cameraNode.camera?.fStop = 0.01
        cameraNode.camera?.focalLength = 24
        scene.rootNode.addChildNode(cameraNode)
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
        
        let lightNode = SCNNode()
        lightNode.light = SCNLight()
        lightNode.light!.type = .omni
        lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
        scene.rootNode.addChildNode(lightNode)
        
        let ambientLightNode = SCNNode()
        ambientLightNode.light = SCNLight()
        ambientLightNode.light!.type = .ambient
        ambientLightNode.light!.color = NSColor.darkGray
        scene.rootNode.addChildNode(ambientLightNode)
        
        let cylinderNode01 = SCNNode()
        cylinderNode01.geometry = SCNCylinder(radius: 2, height: 10)
        cylinderNode01.position = SCNVector3(0, 0, 0)
        cylinderNode01.geometry?.materials.first?.diffuse.contents = NSImage(named: NSImage.Name("checker01.png"))
        scene.rootNode.addChildNode(cylinderNode01)
        
        let cylinderNode02 = SCNNode()
        cylinderNode02.geometry = SCNCylinder(radius: 2, height: 10)
        cylinderNode02.position = SCNVector3(5, 0, 5)
        cylinderNode02.geometry?.materials.first?.diffuse.contents = NSImage(named: NSImage.Name("checker02.jpg"))
        scene.rootNode.addChildNode(cylinderNode02)
        
        let cylinderNode03 = SCNNode()
        cylinderNode03.geometry = SCNCylinder(radius: 2, height: 10)
        cylinderNode03.position = SCNVector3(10, 0, 10)
        cylinderNode03.geometry?.materials.first?.diffuse.contents = NSImage(named: NSImage.Name("checker01.png"))
        scene.rootNode.addChildNode(cylinderNode03)
        
        let cylinderNode04 = SCNNode()
        cylinderNode04.geometry = SCNCylinder(radius: 2, height: 10)
        cylinderNode04.position = SCNVector3(-5, 0, -5)
        cylinderNode04.geometry?.materials.first?.diffuse.contents = NSImage(named: NSImage.Name("checker02.jpg"))
        scene.rootNode.addChildNode(cylinderNode04)
        
        let cylinderNode05 = SCNNode()
        cylinderNode05.geometry = SCNCylinder(radius: 2, height: 10)
        cylinderNode05.position = SCNVector3(-10, 0, -10)
        cylinderNode05.geometry?.materials.first?.diffuse.contents = NSImage(named: NSImage.Name("checker01.png"))
        scene.rootNode.addChildNode(cylinderNode05)
       
        let scnView = self.view as! SCNView
        scnView.scene = scene
        scnView.allowsCameraControl = true
        scnView.backgroundColor = NSColor.black
    }
}

关于swift - 如何在 SceneKit 中实现逼真的景深效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41150627/

相关文章:

swift - 人工智能 - 如何决定拍卖出价的估价?

ios - Swift for iOS 中的自定义分段控件

c# - 3D 图形(x、y、z)

3d - XNA studio 能否(以及如何)用于在插入 3D 电视的 Xbox 360 上生成立体 3D?

android - 图像裁剪在 android 7.0 及更高版本中不起作用

python - pygame.camera 不工作?

ios - 无法在 Swift 中索引空缓冲区

ios - 如何从 Swift 中的 .m3u8 格式视频 url 获取缩略图?

android-studio - 简单的 3D 形状面未按预期渲染 - Android Studio 中的 OpenGL ES

opengl - 无法使用矢量在 OpenGL 中将相机俯仰角限制在 [-90º, 90º] 之间!