Задача с вычислением ограничительной рамки трехмерного объекта с преобразованием - PullRequest
0 голосов
/ 06 сентября 2018

Так что у меня действительно странное поведение для моих ограничивающих рамок. Каждый раз, когда я переводю объект с любым отрицательным значением, ограничивающий прямоугольник растягивается до 0.

Вот как это выглядит с позитивным переводом: enter image description here

Все хорошо. Но теперь я перевожу это с отрицательной координатой Z. enter image description here

Вот мой код для создания ограничивающего прямоугольника:

private final void calcBoundingBox() {

    if(this.mesh != null) {

        float[] vertices = this.mesh.getVertexArray().getBuffer(0).getDataAsFloats();

        float xn = Float.MAX_VALUE;
        float yn = xn;
        float zn = xn;

        float xf = Float.MIN_VALUE;
        float yf = xf;
        float zf = xf;

        for(int index = 0; index < vertices.length; index += 3) {

            Vector3f vertex = MatrixUtil.multiply(this.transformation, vertices[index], vertices[index + 1], vertices[index + 2]);

            float x = vertex.x;
            float y = vertex.y;
            float z = vertex.z;

            if(x < xn) xn = x; else if(x > xf) xf = x;
            if(y < yn) yn = y; else if(y > yf) yf = y;
            if(z < zn) zn = z; else if(z > zf) zf = z;
        }

        float width = xf - xn;
        float height = yf - yn;
        float depth = zf - zn;

        this.boundingBox.setBounds(xn, yn, zn, width, height, depth);
    }
}

public static final Vector3f multiply(Matrix4f matrix, float x, float y, float z) {

    Vector3f result = new Vector3f();
    result.x = (x * matrix.m00) + (y * matrix.m10) + (z * matrix.m20) + matrix.m30;
    result.y = (x * matrix.m01) + (y * matrix.m11) + (z * matrix.m21) + matrix.m31;
    result.z = (x * matrix.m02) + (y * matrix.m12) + (z * matrix.m22) + matrix.m32;
    return result;
}

Теперь у меня вопрос: что я сделал не так?

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Существует также проблема с поиском минимальных / максимальных значений:

  if(x < xn) xn = x; else if(x > xf) xf = x;
  if(y < yn) yn = y; else if(y > yf) yf = y;
  if(z < zn) zn = z; else if(z > zf) zf = z;

Из-за условий 'else', в зависимости от ориентации фигуры, не все ограничивающие рамки рассчитываются правильно. Все шесть операторов if должны быть проверены для всех вершин.

0 голосов
/ 06 сентября 2018

Проблема: float xf = Float.MIN_VALUE;

Это наименьшее положительное значение, которое может быть представлено float.Вместо этого следует использовать -Float.MAX_VALUE.

Подробнее см. здесь .

...