2014-12-05 3 views
1

저는 SceneKit에서 스프라이트 시트를 애니메이션화하는 방법을 찾고 있습니다. 몇 가지 연구를 한 후에 Core Animation에서이 작업을 수행하는 방법을 찾았습니다. 가능한 한 애니메이션을 최대한 제어해야하므로 완벽 할 것입니다.SceneKit에서 UV 애니메이션하기

UV가 하나의 스프라이트 시트 프레임 크기로 제한된 간단한 평면 메쉬를 준비했습니다. 그렇게하면 UV를 수평으로 움직이면됩니다. 소재의 contentsTransform 행렬의 관련 요소가 m14 (수평 변환을 담당하는 요소)라는 것을 알았습니다.

[SCNKit ERROR] geometry?.firstMaterial?.diffuse.contentsTransform.m14 is not an animatable path 

이 관련 코드입니다 :이와

let spritesheetAnimation = CABasicAnimation(keyPath: "geometry?.firstMaterial?.diffuse.contentsTransform.m14") 
spritesheetAnimation.fromValue = 1 - 1/spritesheetFrameCount 
spritesheetAnimation.toValue = 0 
spritesheetAnimation.byValue = 1/spritesheetFrameCount 
spritesheetAnimation.duration = 1.0 
spritesheetAnimation.repeatCount = Float.infinity 

node.geometry?.insertMaterial(material, atIndex: 0) 
node.addAnimation(spritesheetAnimation, forKey: "SpritesheetAnimation") 

누구나 가진 경험

그러나 런타임에, SceneKit 다음과 같은 오류가 다시 뱉어? 이 작업을 쉽게 수행 할 수있는 방법이 있는지 또는 내가 잘못된 길을 찾고 있는지 알 수 없습니다. 그래서, 어떤 포인터가 인정 될 것이다!

답변

0

시도해 볼 수도 있습니다. contentsTransform.translation.x - 코어가 레이어로 작업 할 때 변형에 대해 매우 영리해서 SceneKit이이를 처리 할 수 ​​있습니다.

+0

유감스럽게도 유감스럽게도 같은 오류가 발생했습니다./ –

+0

버그 : http://bugreport.apple .com –

+0

고마워. 또 다른 동안 기다릴거야, 여전히 내 실수 일 수도있다. –

3

두 가지 문제가 있습니다.

  1. 코어 애니메이션이 애니메이션 수있는 데이터 구조로 애니메이션 키 경로를 확장 - 단 하나의 완전한 CATransform3D 다른 사이 애니메이션 대신, 즉, 당신이 변환의 일부 멤버 또는 속성을 설명하는 키 경로를 애니메이션 할 수 있습니다 (예 : transform.translation.x).

    SceneKit에서는이 작업을 수행하지 않습니다. 전체 구조 값만 애니메이션으로 만들 수 있습니다. 즉, contentsTransform.something이 아닌 contentsTransform 만 애니메이션으로 만들 수 있으며 애니메이션의 toValue/fromValue으로 전체 SCNMatrix4을 제공해야합니다.

  2. KVC 키 경로는 Swift 옵션과 아무 관련이 없으므로 geometry?.firstMaterial?.diffuse.contentsTransform은 유효한 키 경로가 아닙니다. 물음표를 잃으면 괜찮을거야. 스위프트가 자동으로 변환 할 수 없기 때문에, 당신은 fromValuetoValue에 전달 NSValueSCNMatrix4을 포장 할 필요가

    let spritesheetAnimation = CABasicAnimation(keyPath: "geometry.firstMaterial.diffuse.contentsTransform") 
    let translation = SCNMatrix4MakeTranslation(1 - 1/spritesheetFrameCount, 0, 0) 
    spritesheetAnimation.fromValue = NSValue(SCNMatrix4: translation) 
    spritesheetAnimation.toValue = NSValue(SCNMatrix4: SCNMatrix4Identity) 
    spritesheetAnimation.duration = 1.0 
    spritesheetAnimation.repeatCount = .infinity 
    

    참고 :

그래서, 당신의 코드 (테스트되지 않은)의 모양은 스칼라 숫자 형과 같습니다.

원한다면 Float.infinity에 대한 유형 유추를 사용할 수 있습니다.

+0

1. 나는 이런 식으로 예상했다. 불행히도, 이것은 여전히 ​​같은 오류를 보여 주며, 오직 cou 만 보여준다. geometry.firstMaterial.diffuse.contentsTransform을 애니메이트 가능한 경로가 아니라 SceneKit 문서에 말하면서 참조하십시오 .. 2.이 점도 염두에 두십시오. 그것을 변경해도 문제가 해결되지 않았으므로 나는 안전하게 놀아갈 것이라고 생각했습니다. 설명해 주셔서 감사합니다. –

0

이 작동합니다 :

  • 제거 "를?" "geometry.firstMaterial.diffuse.contentsTransform : 키 패스에서
  • 는 수평 대상 M41 (안 M14)

spritesheetAnimation = CABasicAnimation (키 패스를하게 번역합니다.contentsTransform.translation.x ""당신 같은 경로를 사용할 수 없도록 "M41 번역/회전/스케일")

[...]

SceneKit는 다음과 같은 구성 요소로 행렬을 분해하지 않습니다. " 하지만 명시 적 애니메이션 키 필드에서 "contentsTransform.m41"과 같은 매트릭스 구성 요소를 계속 타겟팅 할 수 있습니다.

+0

동일한 오류가 표시됩니다. 런타임에 하나의 행렬 구성 요소에 대해 불평 할 것을 기대하지는 않았지만 다른 행렬 구성 요소에 대해서는 불평하지 않았습니다. 어쨌든 감사합니다 :) –