Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何让运动模糊在SceneKit中工作?_Objective C_Swift_Scenekit - Fatal编程技术网

Objective c 如何让运动模糊在SceneKit中工作?

Objective c 如何让运动模糊在SceneKit中工作?,objective-c,swift,scenekit,Objective C,Swift,Scenekit,根据2017年世界野生动植物保护委员会(WWDC)的规定,动植物保护区作为一项财产添加到SCNCamera。我尝试了以下操作,但在移动相机时无法使SceneKit模糊我的场景: 将wantsHDR设置为true 在我的Xcode项目的每个Info.plist中将SCNDisableWideGamut添加为值为YES的布尔值 在motionBlurIntensity设置为1.0的情况下,通过更改其SCNNode在摄影机前面的位置来移动SCNBox 通过将motionBlurIntensity设置

根据2017年世界野生动植物保护委员会(WWDC)的规定,动植物保护区作为一项财产添加到SCNCamera。我尝试了以下操作,但在移动相机时无法使SceneKit模糊我的场景:

  • 将wantsHDR设置为true
  • 在我的Xcode项目的每个Info.plist中将SCNDisableWideGamut添加为值为YES的布尔值
  • 在motionBlurIntensity设置为1.0的情况下,通过更改其SCNNode在摄影机前面的位置来移动SCNBox
  • 通过将motionBlurIntensity设置为1.0更改其SCNNode的位置来移动相机本身
  • 使用设置为1.0的motionBlurIntensity的SCNTransaction设置摄影机动画,而不是在每帧更改其位置
  • 在MotionBlur强度设置为500或更大的情况下执行上述操作
我在每个渲染帧中运行以下代码,如下所示:

    camNode.position = SCNVector3Make(cx, cy, cz);
    camNode.eulerAngles = SCNVector3Make(rotx, roty, rotz);
    camNode.camera.wantsDepthOfField = enableDOF;
    camNode.camera.wantsHDR = enableHDR;

    camNode.camera.zNear = camNearVal;
    camNode.camera.zFar = camFarVal;
    camNode.camera.focalLength = camFocalLength;

    camNode.camera.usesOrthographicProjection = usingOrthoProjection;
    if(!usingOrthoProjection)
    {
        camNode.camera.projectionTransform = SCNMatrix4FromGLKMatrix4(GLKMatrix4MakeWithArray(projection));
    }
    else
    {
        // Ortho options
        camNode.camera.orthographicScale = orthoScale;
        if(cam_projectionDir == 1)
            camNode.camera.projectionDirection = SCNCameraProjectionDirectionHorizontal;
        else
            camNode.camera.projectionDirection = SCNCameraProjectionDirectionVertical;
    }

    // DOF
    camNode.camera.sensorHeight = dof_sensorHeight;
    camNode.camera.focusDistance = dof_focusDistance;
    camNode.camera.fStop = dof_fStop;
    camNode.camera.apertureBladeCount = dof_apertureBladeCount;
    camNode.camera.focalBlurSampleCount = dof_focalBlurSampleCount;

    // Motion blur
    camNode.camera.motionBlurIntensity = motionBlurIntensity;
下面是屏幕渲染器将其视点设置到相机的位置:

    mainRenderer.scene = mainScene;
    mainRenderer.pointOfView = camNode;
    id<MTLCommandBuffer> myCommandBuffer = [_commandQueue commandBuffer];

    [mainRenderer updateAtTime: currentFrame];
    [mainRenderer renderWithViewport:CGRectMake(0,0,(CGFloat)_viewWidth, (CGFloat)_viewHeight) commandBuffer:myCommandBuffer passDescriptor:_renderPassDescriptor];

    [myCommandBuffer commit];
mainRenderer.scene=mainsene;
mainRenderer.pointOfView=camNode;
id myCommandBuffer=[\u commandQueue commandBuffer];
[mainRenderer UpdateTime:currentFrame];
[mainRenderer renderWithViewport:CGRectMake(0,0,(CGFloat)_viewWidth,(CGFloat)_viewHeight)commandBuffer:MyCommand和Buffer passDescriptor:_renderPassDescriptor];
[MyCommand缓冲区提交];
像Bloom和SSAO这样的HDR效果可以正常工作,而不是运动模糊。 我在macOS Mojave上使用的是Xcode版本10.1。 我运行了Badger示例应用程序,该项目中的运动模糊在我的计算机上运行。 我是不是遗漏了什么?如有任何见解,将不胜感激

属性的默认值为
0.0
。它不会产生运动模糊效果。较高的值(最大值为1.0)会创建更明显的运动模糊效果<启用宽色域颜色渲染时不支持strong>运动模糊。默认情况下,在支持的设备上启用宽色域渲染;要选择退出,请在应用程序的Info.plist文件中设置SCNDisableWideGamut

用我的代码测试它:

let cameraNode1 = SCNNode()
cameraNode1.camera = SCNCamera()
cameraNode1.camera?.motionBlurIntensity = 3          // MOTION BLUR
scene.rootNode.addChildNode(cameraNode1)

let move = CABasicAnimation(keyPath: "translation")
move.fromValue = NSValue(scnVector3: SCNVector3(x: 7, y: -5, z: 0))
move.toValue = NSValue(scnVector3: SCNVector3(x: 7, y: 5, z: 0))
move.duration = 0.5
move.repeatCount = 20
move.autoreverses = true
move.repeatCount = .infinity

let sphereNode1 = SCNNode()
sphereNode1.geometry = SCNSphere(radius: 2)
sphereNode1.addAnimation(move, forKey: "back and forth")
scene.rootNode.addChildNode(sphereNode1)

工作正常。

尝试将相机的motionBlurIntensity设置为1.0,而不是每帧设置一次。谢谢您的回复。测试过了,没有运气。然而,我想我知道这里出了什么问题。我试图一次渲染一帧。可能前一帧的数据无法被SceneKit访问,除非它连续运行?我知道Badger示例使用SCNView渲染内容。