2014-10-02 18 views
5

SceneKit'i kullanıyorum ve birden çok SCNNode'lu bir uygulamaya sahip olduğumu ve kullanıcının bir tanesine dokunduğunda, parmaklarını takip edecek (bir UILongPressGestureRecognizer kullanarak).Yönü değiştirmeden SCNNode konumunu değiştirin

Bu satırda
_currentlyMoving?.position = SCNVector3Make(worldPoint.x, worldPoint.y, worldPoint.z) 

, _currentlyMoving SCNNode ve Worldpuan benim parmak pozisyonu: devlet başladı ve değişti, ben düğümün konumunu değiştirmek için aşağıdaki kod satırını kullanıyorum.

Bu, düğümü doğru konuma taşıyor; bununla birlikte, düğümün dönüşünü de (0,0,0) olarak değiştiriyor gibi görünmektedir (Düğüm her zaman başlangıç ​​rotasyonundadır.)

Bir SCNNode'un konumunu etkilemeden değiştirmenin herhangi bir yolu var mı? rotasyon?

Ayrıca, ben denedim aşağıdaki ancak ya (aynı şey oldu) işe yaramadı:

_currentlyMoving?.transform.m41 = worldPoint.x 
_currentlyMoving?.transform.m42 = worldPoint.y 
_currentlyMoving?.transform.m43 = worldPoint.z 

Ben düğümle yapıyorum tek şey onu durdurmak için aşağıdaki üç satır olduğunu hareket etmesini süre aldı:

_currentlyMoving?.physicsBody?.velocity = SCNVector3Make(0.0, 0.0, 0.0) 
_currentlyMoving?.physicsBody?.velocityFactor = SCNVector3Make(0.0, 0.0, 0.0) 
_currentlyMoving?.physicsBody?.angularVelocity = SCNVector4Make(0.0, 0.0, 0.0, 1.0) 
+0

Düğümünüzün bir fiziksel kümesi var mı? Programlı olarak hareket ediyorsanız, "kinematik" bir vücut kullandınız mı? – Toyos

+0

@Toyos Bir fizik var Vücut, ama dinamik değil, kinematik. – Jsdodgers

+0

Bazı kısıtlamalarınız yoksa, düğümün dönüşümü konumundan etkilenmemelidir. Bu sorunu yeniden oluşturmak için minimum kodu paylaşabilir misiniz? – Gusutafu

cevap

5

Yani birkaç gün birçok şeyi test ettikten sonra, ben rotasyon aslında düğümde ayarlamalar yapıyorum asla öğrendim; Sadece sunum düğümünde ayarlanıyor. Bu nedenle, konum belirlediğimde, düğümün dönüşümü, yeni konumuma ve geçerli rotasyona göre (0,0,0] olduğu düşünüldüğünde) düğümün dönüşünü etkin bir şekilde sıfırlayarak otomatik olarak yeniden hesaplanıyordu.

Yani, bu sorunu çözmek için, düğümün dönüşünü presentationNode'un rotasyonuna değiştirmeniz gerekir. Bu sadece onun sunum rotasyona düğümün dönüşünü ayarlar

if let currentlyMoving = _currentlyMoving { 
    if let presentationNode = currentlyMoving.presentationNode() { 
     currentlyMoving.rotation = presentationNode.rotation 
    } 
    currentlyMoving.position = newLocation 
} 

olduğunu dönüşümü böylece taşımadan önce:

Bu

Şu anda currentlyMoving dokundu düğümü ayarladıktan sonra (benim panGestureRecognizer en .Began durumda ne yapıyorum olduğunu

Karşılaştığım bir sorun, indirdiğim bazı modellerin, kendimi oluşturduğum modellerin tümü çalışıyor olsa da, garip bir şekilde minik miktarlarla döndürüldüğüydi. iyi, kendi başımı yaratmalıydım Diğer modellerin versiyonları, sonra her şey iyi çalışıyor. Bu yüzden, ben onların rotasyonlarını sunum rotasyonlarına koyduğumda (3B modelleme konusunda tecrübem yok) ilk modellerde neyin yanlış bir şekilde değiştiğini hala bilmiyorum.