3d пересечение отрезков линий и что я делаю не такJAVA

Программисты JAVA общаются здесь
Ответить
Гость
 3d пересечение отрезков линий и что я делаю не так

Сообщение Гость »


Я работаю над движком lwjgl и столкнулся с проблемой. Однако когда я вычисляю коллизии, результат проверки очень похож на проверку коллизий с помощью AABB. Это работает следующим образом: если хотя бы одно ребро пересекается, столкновение существует. В любом случае результат неправильный. что я делаю не так?


Изображение


но программа говорит, что произошло столкновение.

Код:

пакет Engine; импортировать java.util.ArrayList; импортировать org.joml.Matrix4f; импортировать org.joml.Vector3f; публичный абстрактный класс Component { //... public static boolean ccw(Vector3f A, Vector3f B, Vector3f C) { двойное перекрестноеПроизведениеX = (B.y - A.y) * (C.z - A.z) - (B.z ​​- A.z) * (C.y - A.y); двойное перекрестноеПродуктY = (B.z ​​- A.z) * (C.x - A.x) - (B.x - A.x) * (C.z - A.z); двойное перекрестноеПроизведениеZ = (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x); вернуть кроссПродуктХ > 0 || (crossProductX == 0 && (crossProductY > 0 || (crossProductY == 0 && crossProductZ > 0))); } public static boolean intersect(Vector3f A, Vector3f B, Vector3f C, Vector3f D) { return ccw(A, C, D) != ccw(B, C, D) && ccw(A, B, C) != ccw(A, B, D); } public boolean checkColision (компонент компонента) { if(!checkAABBColision(findAABB(transform(getVertices()))[0], findAABB(transform(getVertices()))[1], findAABB(comComponent.transform(getVertices()))[0], findAABB(comComponent.transform(getVertices()))[1])) возвращает false; //без вопросов ArrayList Edge1 = Transform(getEdges()); ArrayList Edge2 = компонент.transform(getEdges()); пытаться { for(int i = 0; i < Edge1.size(); я += 2) { for(int j = 0; j < Edge2.size(); j += 2) { if (intersect(edges1.get(i), Edges1.get(i++), Edges2.get(j), Edges2.get(j++))) возвращает true; } } } catch (IndexOutOfBoundsException e) {} вернуть ложь; } общедоступный абстрактный ArrayList getEdges(); public ArrayList getVertices() { вернуть новый ArrayList() {{ for(Vector3f point: getEdges()) { если(!содержит(точка)) добавить(точка); } }}; } public ArrayList Transform (ArrayList вершины) { Преобразование Matrix4fMatrix = новый Matrix4f() .translate(поз.) .rotateX((float) Math.toRadians(rotate.x)) .rotateY((float) Math.toRadians(rotate.y)) .rotateZ((float) Math.toRadians(rotate.z)) .scale(масштаб); for (Vector3f вершина: getVertices()) { Vector3f TransformVertex = новый Vector3f (вершина); TransformVertex.mulPosition(transformationMatrix); vertices.add(transformedVertex); } возврат вершин; } //... } грани пирамиды:

//... вернуть новый ArrayList() {{ add(new Vector3f(0.0f, size, 0.0f));//start add(new Vector3f(-size, -size, -size));//end add(new Vector3f(size, -size, -size)); add(new Vector3f(0.0f, size, 0.0f)); add(new Vector3f(size, -size, -size)); add(new Vector3f(size, -size, size)); add(new Vector3f(0.0f, size, 0.0f)); add(new Vector3f(size, -size, size)); add(new Vector3f(-size, -size, size)); add(new Vector3f(0.0f, size, 0.0f)); add(new Vector3f(-size, -size, size)); add(new Vector3f(-size, -size, -size)); }}; //... грани куба:
//... вернуть новый ArrayList() {{ add(new Vector3f(-size, size, -size)); add(new Vector3f(-size, size, size)); add(new Vector3f(-size, size, size)); add(new Vector3f(-size, -size, size)); add(new Vector3f(-size, -size, size)); add(new Vector3f(-size, -size, -size)); add(new Vector3f(-size, -size, -size)); add(new Vector3f(-size, size, -size)); add(new Vector3f(size, size, -size)); add(new Vector3f(размер, размер, размер)); add(new Vector3f(размер, размер, размер)); add(new Vector3f(size, -size, size)); add(new Vector3f(size, -size, size)); add(new Vector3f(size, -size, -size)); add(new Vector3f(size, -size, -size)); add(new Vector3f(size, size, -size)); add(new Vector3f(size, size, -size)); add(new Vector3f(-size, size, -size)); add(new Vector3f(размер, размер, размер)); add(new Vector3f(-size, size, size)); add(new Vector3f(size, -size, size)); add(new Vector3f(-size, -size, size)); add(new Vector3f(size, -size, -size)); add(new Vector3f(-size, -size, -size)); }}; //...
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»