Пересечение JMonkeyEngine-Geometry NullPointerException

1

Я новичок в 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, похоже, не помогут. Кто-нибудь из вас сможет помочь? Заранее спасибо.

Теги:
nullpointerexception
jmonkeyengine

2 ответа

1
Лучший ответ

Ваши модели не привязаны к физике 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);
}

после этого вы можете проверить столкновение!

  • 0
    Я кровавый идиот ... спасибо.
0

Я сделал небольшое исследование, и я считаю, что проблема в том, что существует не одна точка столкновения между 2 2D/3D - объектов, существует коллизия область 2D/3D. Поэтому null возвращается, поскольку ни одна точка не доступна. Это подтверждается комментарием разработчика. Я считаю, что обнаружение столкновения JMonkey на самом деле не вычисляет область пересечения, потому что она довольно математически сложна (хотя она и дает треугольник, участвующий в столкновении)

Если обе формы выпуклые, вам может быть интересно это сообщение при вычислении пересечений трехмерных полигонов: поиск пересечения двух трехмерных полигонов.

  • 0
    Интересно. Я знал, что существует геометрическая область пересечения, но я понятия не имел, отдельные точки не могут быть восстановлены. Я могу просто использовать лучевые тесты или что-то в этом случае, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню