, 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.
Ç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
Google'da aradım ama yalnızca ışın çarpışması buldum. – eqiproo
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ü. –