2012-07-13 38 views
32

Ben üç.js kullanıyorum.Üç.js'deki çarpışma nasıl algılanır?

Sahnemde iki kafes geometrim var.

Bu geometriler kesişiyorsa (veya çevrildiğinde kesişir) Bunu bir çarpışma olarak algılamak istiyorum.

Üç.js ile çarpışma algılamasını nasıl gerçekleştiririm? Üç.js'de çarpışma algılama olanakları yoksa, üç.js ile birlikte kullanabileceğim başka kütüphaneler var mı?

+2

Çarpışma algılaması kadar geniş bir şeyin nasıl yapılacağına dair tek bir soru, gerçekten bir soru değil, bir öğrenme konusu. Google Senin Arkadaşın. – Nate

+2

Google'da aradım ama yalnızca ışın çarpışması buldum. – eqiproo

+4

Sanırım ışın çarpışması, CollisionUtils.js ve Collisions.js dosyalarının, Adnan'ın (muhtemelen) referans verilerinin güncel olmadığını ve en sonuncusunun (yazma sırasında v49) yer almadığını düşünüyorum. js sürümü. –

cevap

85

, utili etrafında inşa Ammo.js sarmalayıcı kullanmaktır collisionUtils.js ve Collisions.js bağları artık desteklenmiyor gibi görünüyor ve mrdoob (üç.js'nin yaratıcısı), üç.js'nin en son sürümüne güncelleme yapılmasını ve bunun yerine bu amaçla Ray sınıfının kullanılmasını önerir. Bundan sonra gitmek için bir yoldur.

fikri şudur: en biz "Oyuncu" olarak adlandırılan belirli bir örgü, "collidableMeshList" adında bir dizide yer alan herhangi kafesleri kesişiyor olmadığını kontrol etmek istediğinizi varsayalım. Yapabileceklerimiz, Player mesh'in (Player.position) koordinatlarında başlayan ve Player mesh'in geometrisindeki her vertiğe doğru uzanan bir dizi ışın yaratmaktır. Her bir Ray'ın "intersectObjects" adlı bir yöntemi vardır. Bu, Ray'ın kesiştiği bir dizi nesne döndürür ve bu nesnelerin her birine olan uzaklık (Ray'ın kaynağından ölçüldüğü gibi). Bir kesişme mesafesinin, Oyuncunun pozisyonu ile geometrinin köşe noktası arasındaki mesafeden daha az olması durumunda, çarpışma oyuncunun ağının iç kısmında meydana geldi - muhtemelen "gerçek" bir çarpışma olarak adlandırdığımız şey. Ok tuşları ile kırmızı tel kafes küp taşımak ve W/A/S/D ile döndürebilirsiniz

http://stemkoski.github.io/Three.js/Collision-Detection.html

:

Ben bir çalışma örneğini gönderdiniz. Mavi küplerden biri ile kesiştiği zaman, "Hit" kelimesi, yukarıda açıklandığı gibi her bir kesişim için ekranın üst kısmında bir kez görünecektir. Kodun önemli kısmı aşağıdadır.

for (var vertexIndex = 0; vertexIndex < Player.geometry.vertices.length; vertexIndex++) 
{  
    var localVertex = Player.geometry.vertices[vertexIndex].clone(); 
    var globalVertex = Player.matrix.multiplyVector3(localVertex); 
    var directionVector = globalVertex.subSelf(Player.position); 

    var ray = new THREE.Ray(Player.position, directionVector.clone().normalize()); 
    var collisionResults = ray.intersectObjects(collidableMeshList); 
    if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) 
    { 
     // a collision occurred... do something... 
    } 
} 

Bu özel yaklaşımla ilgili iki olası sorun vardır.

(1) ışın kaynağı bir ağ M içinde olduğunda, ray ve M ile çarpışma sonucu geri gönderilir.

(2) Bu (Oyuncu örgü ile ilgili olarak) küçük bir nesne için mümkündür çeşitli ışınları ve böylece hiçbir çarpışma kaydedilecektir arasındaki "kayma" olarak ayarlayın. Bu problemin olasılığını azaltmak için iki olası yaklaşım, küçük nesnelerin ışınları oluşturması ve perspektifinden çarpışma algılama çabasını yapması ya da kafes üzerinde daha fazla köşe noktası içermesi (örneğin CubeGeometry (100, 100, 100) kullanarak kod yazmaktır. 20, 20, 20) CubeGeometry'den ziyade (100, 100, 100, 1, 1, 1).) İkinci yaklaşım muhtemelen bir performans isabeti yaratacaktır, bu yüzden onu idareli olarak kullanmanızı tavsiye ederim.

Umarız başkalarının da bu soruya çözümleriyle bu soruya katkıda bulunacaklarını umuyorum. Burada açıklanan çözümü geliştirmeden önce kendimle bir süre uğraştım.

+4

Bu ayrıntılı açıklama için size teşekkür ederiz! Yine de oyunumda arazi ve 3D nesnelerle iyi bir çözüm bulmaya çalışıyorum ve cevabınız bana bazı yeni bilgiler verdi! – Nick

+3

Bu yöntem, herhangi bir verteksin obektin merkezinden kesişip geçmediğini test etse de, iki kat yavaş olacak, ancak tüm kenarları (bağlı köşeler) test etmek için% 100 (?) Doğru olacaktır. Bu yüzden, ayrıntılandırmak için, her bir yüze girmeniz ve tüm kenarları elde etmek için [n] ve vertex [(n + 1)% len] köşelerini almanız gerekir. Birisine sarılırsam, pozisyonumun ve elimin merkezini kesiyorlar, ama bir kenar kontrolü yapıp yapamayacağından, cildimi kesişmiyorlar. – Funkodebat

+0

Bu güzel bir fikir! % 100 (?) Doğruluk için, iki kafesin her birinin kenarlarını test etmeniz gerektiğini düşünürsünüz ve her iki yönde de test etmelisiniz, çünkü çarpışmalar sadece bir yönde algılanır. dış ağ örgüsü içine. Biraz daha yavaş olabilir, ancak ön sınırlayıcı küre yarıçapı kontrolü ile hızlandırabilirsiniz. Ama en önemlisi,% 100 doğrulukta haklı olabileceğinizi düşünüyorum ... –

6

Bu gerçekten SO söz konusu kapsayacak konunun çok geniş olmakla birlikte, sitenin SEO biraz yağlama uğruna, burada basit başlangıç ​​noktalarının buradan bir kaç: Eğer gerçekten istiyorsan

basit çarpışma algılama ve tam üzerinde fizik motoru daha sonra, bazı çarpışma yanıtını istiyorum DO diğer taraftan, sadece "A ve B çarpmak mi?" değilse, Three.js: Simple Collision Detection

göz atın Physijs bakmak hangi süper kolay Three.js'ye

Three.js'ye yılında
+3

Bağlandığınız demo, ray collision – eqiproo