Как проверить, находится ли один список вершин хотя бы частично внутри другого - PullRequest
0 голосов
/ 23 сентября 2018

Как я могу проверить, пересекаются ли два списка вершин?Я использую это, чтобы проверить, сталкиваются ли объекты в моей игре друг с другом

package com.indigoa.lwjgl.gamelib.world.boundingbox;
import java.util.ArrayList;
import java.util.List;

import org.joml.Vector3f;

import com.indigoa.lwjgl.gamelib.SimpleFunctions;

public class BoundingBox {
    public List<Vector3f> postions;
    public BoundingBox(float[] vertices) throws Exception {
        this(SimpleFunctions.toListF(vertices));
    }
    public BoundingBox(List<Float> vertices) throws Exception {
        if (Float.toString(vertices.size() / 3).contains(".")) {
            throw new Exception("Vertices are not divisible by 3, and therefore cannot be converted into points.");
        }
    }
    public BoundingBox(Vector3f... positions) {
        this.postions = new ArrayList<Vector3f>();
        for (Vector3f p : positions) {
            this.postions.add(p);
    }

    public AxisAlignedBoundingBox toAABB() {
        Vector3f min = new Vector3f(), max = new Vector3f();
        for (Vector3f pos : postions) {
            if (pos.x < min.x) min.x = pos.x;
            if (pos.y < min.y) min.y = pos.y;
            if (pos.z < min.z) min.z = pos.z;
            if (pos.x > max.x) max.x = pos.x;
            if (pos.y > max.y) max.y = pos.y;
            if (pos.z > max.z) max.z = pos.z;
        }
        return new AxisAlignedBoundingBox(min, max);
    }

    public boolean doBoesIntersect(BoundingBox boundingbox) {
        return false; // TODO
    }
}

Мне нужно выяснить, как проверить, пересекаются ли ограничивающие рамки, и я не хочу использовать мин и макс.позиции для всех вершин вместе.Как я могу выяснить, пересекаются ли списки точек?

В настоящее время я использую это:

public boolean doBoxesIntersect(BoundingBox boundingbox) {
    return toAABB().doBoxesIntersect(boundingbox);
}

AxisAlignedBoundingBox:

package com.indigoa.lwjgl.gamelib.world.boundingbox;

import java.util.ArrayList;
import java.util.List;

import org.joml.Vector3f;

public class AxisAlignedBoundingBox extends BoundingBox {
    public AxisAlignedBoundingBox(Vector3f pos1, Vector3f pos2) {
        positions.add(pos1);
        positions.add(new Vector3f(pos2.x, pos1.y, pos1.z));
        positions.add(new Vector3f(pos1.x, pos2.y, pos1.z));
        positions.add(new Vector3f(pos1.x, pos1.y, pos2.z));
        positions.add(pos2);
        positions.add(new Vector3f(pos1.x, pos2.y, pos2.z));
        positions.add(new Vector3f(pos2.x, pos1.y, pos2.z));
        positions.add(new Vector3f(pos2.x, pos2.y, pos1.z));
    }
    public AxisAlignedBoundingBox(float x1, float y1, float z1, float x2, float y2, float z2) {
        this(new Vector3f(x1, y1, z1), new Vector3f(x2, y2, z2));
    }
    public boolean doBoxesIntersect(BoundingBox boundingbox) {
        List<Vector3f> positions = new ArrayList<Vector3f>();
        Vector3f pos1 = this.postions.get(0);
        Vector3f pos2 = this.postions.get(1);
        positions.addAll(boundingbox.toAABB().postions);
        for (Vector3f position : positions) {
            if (position.x > pos1.x && position.x < pos2.x) {
                if (position.y > pos1.y && position.y < pos2.y) {
                    if (position.z > pos1.z && position.z < pos2.z) {
                        return true;
                    }
                }
            } else if (position.x > pos2.x && position.x < pos1.x) {
                if (position.y > pos2.y && position.y < pos1.y) {
                    if (position.z > pos2.z && position.z < pos1.z) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
}

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

Я преобразую второй ограничивающий прямоугольник в AABB, чтобы при проверке на наличие коллизий не возникало несоответствий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...