Я новичок в 3d-машинах в целом, и я получаю это исключение NullPointerException, когда я пытаюсь столкнуться с объектом Geometry и BoundingVolume.
Вот как я объявляю свои объекты (извините, это довольно грязно на данный момент)
public void simpleInitApp() {
Quad q= new Quad(100, 100);
Dome mesh = new Dome(Vector3f.ZERO, 2, 32, 1f,false);
geom = new Geometry("Cylinder", mesh); //declared elsewhere
g3 = new Geometry("lel", q);
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Blue);
Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat2.setColor("Color", ColorRGBA.Red);
geom.setMaterial(mat);
g3.setMaterial(mat2);
rootNode.attachChild(geom);
rootNode.attachChild(g3);
и здесь мой цикл обновления
public void simpleUpdate(float tpf) {
// System.out.println("hi");
BoundingVolume b = g3.getWorldBound(); //should give boundingvolume of the quad
System.out.println(b.getVolume()); //just to test if this works
CollisionResults r2 = new CollisionResults(); //declare and initialize the collisionresults
geom.collideWith(b, r2); //collide
System.out.println(r2.size()); //this returns a value, usually between 0-2
for(CollisionResult x:r2){
System.out.println("x = "+ x.getContactPoint().getX());
/*and oddly enough, i get a NullPointerException here even though the collision appeared successful - this never prints anything either so it not going out of bounds or anything*/
}
}
tl; dr-get исключение NullPointerException, когда я пытаюсь распечатать координаты каждого CollisionResult с пересечения BoundingVolume и геометрии
Ни форумы JMonkey, ни документы JMonkey, похоже, не помогут. Кто-нибудь из вас сможет помочь? Заранее спасибо.
Ваши модели не привязаны к физике JBullet. попробуйте sg вот так:
BulletAppState buleltAppState;
public void simpleInitApp() {
Quad q= new Quad(100, 100);
Dome mesh = new Dome(Vector3f.ZERO, 2, 32, 1f,false);
geom = new Geometry("Cylinder", mesh); //declared elsewhere
g3 = new Geometry("lel", q);
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Blue);
Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat2.setColor("Color", ColorRGBA.Red);
geom.setMaterial(mat);
g3.setMaterial(mat2);
bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().attachChild(geom);
bulletAppState.getPhysicsSpace().attachChild(g3);
rootNode.attachChild(geom);
rootNode.attachChild(g3);
}
после этого вы можете проверить столкновение!
Я сделал небольшое исследование, и я считаю, что проблема в том, что существует не одна точка столкновения между 2 2D/3D - объектов, существует коллизия область 2D/3D. Поэтому null возвращается, поскольку ни одна точка не доступна. Это подтверждается комментарием разработчика. Я считаю, что обнаружение столкновения JMonkey на самом деле не вычисляет область пересечения, потому что она довольно математически сложна (хотя она и дает треугольник, участвующий в столкновении)
Если обе формы выпуклые, вам может быть интересно это сообщение при вычислении пересечений трехмерных полигонов: поиск пересечения двух трехмерных полигонов.