Как вы получаете размытие движения, работающее в SceneKit? - PullRequest
1 голос
/ 18 марта 2019

Согласно WWDC 2017, motionBlurIntensity был добавлен как свойство в SCNCamera. Я попробовал следующее и не смог заставить SceneKit размывать мою сцену при перемещении камеры:

  • Установить значение HHR в true
  • Добавить SCNDisableWideGamut в качестве логического значения со значением YES в каждом Info.plist в моем проекте Xcode
  • Переместите SCNBox, изменив положение его SCNNode перед камерой с параметром motionBlurIntensity, равным 1,0
  • Переместите саму камеру, изменив положение ее SCNNode с параметром motionBlurIntensity, равным 1,0
  • Анимировать камеру, используя транзакцию SCN с параметром motionBlurIntensity, установленным на 1,0, вместо изменения ее положения в каждом кадре
  • Сделайте вышеупомянутое с motionBlurIntensity, установленным в 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;

И вот где SCNRenderer устанавливает свою точку зрения на камеру:

    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];

HDR-эффекты, такие как Bloom и SSAO, работают правильно, но не размытие в движении. Я использую версию Xcode 10.1 на MacOS Mojave. Я запустил пример приложения Badger, и размытие движения в этом проекте работает на моем компьютере. Я что-то здесь упускаю? Любое понимание будет с благодарностью.

1 Ответ

0 голосов
/ 28 апреля 2019

Значением по умолчанию для свойства motionBlurIntensity является 0.0.Это не дает эффекта размытия в движении.Более высокие значения (максимум до 1,0) создают более выраженные эффекты размытия в движении. Размытие в движении не поддерживается, если включена цветопередача в широкой гамме .Рендеринг с широкой гаммой включен по умолчанию на поддерживаемых устройствах;чтобы отказаться, установите ключ SCNDisableWideGamut в файле Info.plist вашего приложения.

Проверьте его с помощью моего кода:

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)

Работает отлично.

...