2012-09-26 34 views
6

SceneKit (OpenGL) içinde düzgün kamera hareketi için standart yöntem nedir? El ile x değiştirerek, y yeterince düzgün değil, ancak CoreAnimation kullanarak "darbeli" hareket oluşturur. SceneKit üzerinde dokümanlar çok herhangi örnekler mutluluk duyacağız böylece sınırlı gibi görünüyor, Şu anda yapıyorum:SceneKit pürüzsüz kamera hareketi

- (void)keyDown:(NSEvent *)theEvent { 
    int key = [theEvent keyCode]; 
    int x = cameraNode.position.x; 
    int y = cameraNode.position.y; 
    int z = cameraNode.position.z; 
    int speed = 4; 
    if (key==123) {//left 
     x-=speed; 
    } else if (key==124) {//right 
     x+=speed; 
    } else if (key==125) {//down 
     y-=speed; 
    } else if (key==126) {//up 
     y+=speed; 
    } 
    //move the camera 
    [SCNTransaction begin]; 
    [SCNTransaction setAnimationDuration: 1.0]; 
    // Change properties 
    cameraNode.position = SCNVector3Make(x, y, z); 
    [SCNTransaction commit]; 
} 
+0

Hızını daha küçük bir değere değiştirin ve ayrıca SCNTransaction'ın 'animationTimingFunction' öğesini işaretleyin. 'CAMediaTimingFunction' işlevinin kCAMediaTimingFunctionLinear olduğundan emin olun, böylece nabız atmaz. – TheAmateurProgrammer

cevap

1

Bunu deniyorum. Şimdiye kadar bulduğum en iyisi, giriş anahtarlarının durumunu keyDown: ve keyUp: ile değiştirilmiş olarak kaydetmek ve bunları uygulamak için bir NSTimer çalıştırmaktır. Zamanlayıcı, kameranın ne kadar uzak hareket edeceğini belirlemek için atışlar arasındaki gerçek, ölçülen zaman deltasını kullanır. Bu şekilde düzensiz zamanlamaların çok fazla etkisi yoktur (ve hareket hızını değiştirmeden endişelenmeden kameranın konumunu her zaman güncellemek için yöntemimi kullanabilirim).

Bunun doğru bir şekilde davranmasını sağlamak biraz zaman alır. keyDown: ve keyUp: oyun girişi söz konusu olduğunda bazı iğrenç davranışlar var. Örneğin, tekrarlanan tuşlar. Ayrıca, görünümünüz odağı kaybettikten sonra bile tetikleyebilir veya anahtarlar geçiş boyunca tutuluyorsa uygulamanız arka plana gider. Vb, aşılmaz değil, ama can sıkıcı.

Henüz yapmadığım şey, hızlanma ve yavaşlama eklemektir; bu, düzgün olma algısına yardımcı olacaktır. Aksi takdirde oldukça iyi hissettirir.

+0

Bir şekilde benzer bir yaklaşım yaptım - zamanlayıcı kullanmadım - Güncelleme delegesindeki Kamera konumunu yeni güncelledim, çoğu zaman oldukça düzgün çalışıyor - ancak FPS düştüğünde hareket metalin oluşturucu olarak kullanılmasında düzgün değil - OpenGL'yi renderer olarak kullanırken her zaman pürüzsüzdür - ancak OpenGL'de FPS daha sık düşer ... – ColdSteel

8

bir "easeOut" timingFunction kullanabilirsiniz (nedeniyle anahtar tekrarına) nabız gibi atan hareketlerini en aza indirmek için : burada yapılacak en iyi şey bir hedef pozisyonu (a vector3) da yönetmek ve sorunsuz bu hedefe gitmek için her karede kameranın pozisyonunu güncellemek için muhtemelen dedi

//move the camera 
[SCNTransaction begin]; 
[SCNTransaction setAnimationDuration: 1.0]; 
[SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]; 
// Change properties 
cameraNode.position = SCNVector3Make(x, y, z); 
[SCNTransaction commit]; 

.