2015-01-30 3 views
0

Я столкнулся с проблемой с меняющейся точкой зрения в наборе сюжетов неожиданно. во время отладки я видел, что у self.sceneView.pointOfView был предыдущий узел камеры, а установка нового узла камеры не повлияла ни на что на экране. это происходит неожиданно даже без setCompletionBlock. иногда это происходит после первой смены зрения и других времен в самое позднее время. и впоследствии не может быть изменен, и я должен убить и перезапустить, чтобы заставить его работать. любая идея, что я делаю неправильно? следующий код запускается после приема NSNotificationсмена точки зрения вопрос

[SCNTransaction begin]; 
    [SCNTransaction setAnimationDuration:4]; 
    [SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; 
    MenuEntery *menu = [notification object]; 
    switch (menu.menuEntryType) 
    { 
     case kMenuS: 
     { 
      self.sceneView.pointOfView = _cameraNodeForS; 
      [SCNTransaction setCompletionBlock:^{ 
       [SCNTransaction begin]; 
       [SCNTransaction setAnimationDuration:2]; 
       [SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]; 
       self.sceneView.pointOfView = _cameraNodeForS2; 
       [SCNTransaction commit]; 
      }]; 
      break; 
     } 
     //and other cases will here in between 
    } 
[SCNTransaction commit]; 

редактирования: Камеры

_cameraNodeForS     = [SCNNode node]; 
_cameraNodeForS.camera   = [SCNCamera camera]; 
_cameraNodeForS.position  = SCNVector3Make(0, 0, S_DIST); 
_cameraNodeForS.camera.xFov  = 50; 
_cameraNodeForS.camera.zFar  = 2100000; 
_cameraNodeForS.camera.aperture = 1/50; 

_cameraNodeForSOrbit = [SCNNode node]; 
[_cameraNodeForSOrbit addChildNode:_cameraNodeForS]; 


_cameraNodeForS2     = [SCNNode node]; 
_cameraNodeForS2.camera   = [SCNCamera camera]; 
_cameraNodeForS2.position  = SCNVector3Make(0, 0, 10000); 
_cameraNodeForS2.camera.xFov  = 50; 
_cameraNodeForS2.camera.zFar  = 2100000; 
_cameraNodeForS2.camera.aperture = 1/50; 

_cameraNodeForS2Orbit = [SCNNode node]; 
[_cameraNodeForS2Orbit addChildNode:_cameraNodeForS2]; 
+0

Трудно сказать, что здесь. Лучше догадаться, что ваше уведомление не доставляется в основной поток, поэтому вы разговариваете с SceneKit из фонового потока. Повторно отправьте в основную очередь перед транзакцией и посмотрите, помогает ли это? – rickster

+0

@ rickster Спасибо за ответ. Я нашел проблему, вызванную другим [SCNTransaction begin], который не имел фиксации. это была очень глупая ошибка. –

+0

Отлично! Это поможет другим людям с подобными проблемами, если вы немного подробнее расскажете об этом в ответе (а затем примите свой собственный ответ). – rickster

ответ

0

Это, как я решил проблему, которая была вызвана мной. Сначала о проекте. У меня есть SCNView, который имеет SKScene с UITableViewController. В таблице содержится меню различных ячеек, указывающих на узел на сцене. каждый узел имеет свою собственную камеру. если пользователь выбирает пункт меню, то точка зрения изменена на камеру этого объекта с анимацией, как указано в вопросе. помимо анимации изменений с камеры на камеру, мне пришлось одушевить орбиту камеры, пока пользователь прикасался и перетаскивал экран. поэтому я использовал SCNTransaction с началом, но как-то отключил линию [SCNTransaction commit]; ошибочно. урок переучился, для каждого «начала» нужно «совершить», иначе произойдет непредвиденное поведение (решение напомнило мне забыть, чтобы зафиксировать вставку или обновление sqlite).

Смежные вопросы