2017-12-26 20 views
0

일반적으로 게임에서 캐릭터를 카메라와 마주하게 만들 때 SCNLookAtConstraint를 사용할 수 있습니다. 실제로 SCNLookAtConstraint도 사용할 수 있습니다.SceneKit 게임의 SCNNode에 대해 SCNConstraint (LookAt) 애니메이션을 적용하여 천천히 전환합니다.

이하, my_object은 제약 조건에 따라 방향을 지정하려는 노드입니다. 'Enemy'는 장면의 노드를 가리키고 pointOfView는 장면의 시점을 나타냅니다. my_object를 탭하면 적을 잠시 보면서 내 pointOfView로 돌아와야합니다.

LookAtConstraint를 설정하면 '대상'이 '적'을 1 초만 보입니다.

my_object.constraints?.removeAll() 
let targetNode = sceneView.scene.rootNode.childNode(withName: (chosenScenarioForChallenge?.shape)!, recursively: true) 
let lookAt = SCNLookAtConstraint(target: targetNode) 
lookAt.isGimbalLockEnabled = true 
my_object.constraints = [lookAt]      
Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(resetObject), userInfo: nil, repeats: false) 

'적'에 대해 살펴 후 내 관점에서 볼 개체를 재설정 노드

내 질문은
@objc 
func resetObject() { 
    my_object.constraints?.removeAll() 
    let targetNode = sceneView.pointOfView 
    let lookAt = SCNLookAtConstraint(target: targetNode) 
    lookAt.isGimbalLockEnabled = true 
    my_object.constraints = [lookAt] 
    } 

, 나는 변화를 원하지 않는다 제약이 갑작 스럽다. 나는 부드럽고 애니메이션을 원한다. SCNAction과 SCNAnimation을 모두보고 난 후에 제약 조건과 관련된 것을 찾지 못했습니다. 제약 조건이 동적으로 위치를 업데이트 할 때 SCNAction.move (/ by :) 등이 작동하지 않음을 이해할 수 있습니다. 궁극적으로 제가 탭할 때, 객체는 점차적으로 적 노드를보고 시작해야합니다. 1-2 초가 지나면 내 포인트를 보게됩니다 .OfView, 너무 천천히.

기술적으로 카메라를 들여다보고 싶지 않으므로 SCNBillboardConstraint보다는 SCNLookAtConstraint를 사용하고 있습니다.

포인터가 도움이 될 것입니다. TIA.

답변

1

target 속성은 읽기 - 쓰기이므로 새 인스턴스를 만드는 대신 SCNLookAtConstraint 인스턴스를 다시 사용할 수 있어야하며 대상을 바꿀 수 있어야합니다.

편집

제약 influenceFactor의 노드의 변환 및 현재의 제약에 의해 계산 된 상기 하나 사이에 부드러운 애니메이션을 허용.

+0

네, 맞습니다. 헤즈 업에 감사드립니다. 그러나 내 질문은 내 전환을 부드럽게하는 방법입니다. 내 노드가 두 번째 노드를보고있을 때 세 번째 노드를 보도록 구속 조건을 변경하면 두 가지 변경 사항 사이에 애니메이션이 필요하므로 두 번째를 보면서 방향을 바꾸려면 내 노드에 대해 1 초라고 말하면됩니다. 노드가 제 3 노드를보고있을 때까지. – Manganese

+0

제약 조건의 대상을 변경하면 SceneKit에서 변경 내용을 암시 적으로 애니메이션해야하지만 애니메이션 기간을 쉽게 제어하지 못할 수도 있습니다. – mnuages

+0

아마도 당신 말이 맞아요.하지만 솔직히 말해서 너무 빨라 보이는 것 같습니다. 내가 몇 번 시험해 보게. – Manganese