Я придумал очень короткое (в коде) решение.Принимая во внимание матрицу вида камеры, я не очень разбираюсь в матрицах, но они по существу содержат вращение, масштаб и преобразование.Таким образом, в моем последнем примере я создал 2 вектора «leftRight» и «upDown» и переименовал их в «right» и «up», представляющие направление камеры вправо и вверх в представлении о мире, также часто называемое представлением модели.Вот как я получил правильные значения из матрицы вида камеры.
right.x = modelview.val[0];
right.y = modelview.val[4];
right.z = modelview.val[8];
up.x = modelview.val[1];
up.y = modelview.val[5];
up.z = modelview.val[9];
Он просто ищет значения в массиве.Я попробовал это очень раньше, но использовал некорректные индексы поиска.Имея их, математика для преобразования вершины довольно проста.
float size = 1.4142135624f;
Vector3 bottomLeft = position.cpy().sub(right.cpy().scl(size * .5f));
Vector3 bottomRight = position.cpy().add(right.cpy().scl(size * .5f));
Vector3 topRight = position.cpy().add(right.cpy().scl(size * .5f)).add(up.cpy().scl(size * 2));
Vector3 topLeft = position.cpy().sub(right.cpy().scl(size * .5f)).add(up.cpy().scl(size * 2));
Так как мои квадратные квадраты имеют размер 1x1, мне нужно сделать Пифагор 1.414..
, так как он должен заполнить полную плитку.Затем я вычисляю положение каждой вершины, так как мне нужно было расположить нижний центр четырехугольника в точном мировом положении, я умножаю размер на .5
, и мои рекламные щиты должны быть в два раза больше по высоте, поэтому я умножаю размер навектор увеличения на 2. Чтобы сделать это быстрее, создайте для этого 2 константы (ширину и высоту), чтобы умножения не понадобились.Затем, когда они будут рассчитаны, я могу просто группировать свои вершины, как обычно.
// Bottom left
verts[vi++] = bottomLeft.x;
verts[vi++] = bottomLeft.y;
verts[vi++] = bottomLeft.z;
verts[vi++] = floorObject.getU();
verts[vi++] = floorObject.getV2();
verts[vi++] = 1;
// Bottom right halfway
verts[vi++] = bottomRight.x;
verts[vi++] = bottomRight.y;
verts[vi++] = bottomRight.z;
verts[vi++] = floorObject.getU2();
verts[vi++] = floorObject.getV2();
verts[vi++] = 1;
// Top left
verts[vi++] = topLeft.x;
verts[vi++] = topLeft.y;
verts[vi++] = topLeft.z;
verts[vi++] = floorObject.getU();
verts[vi++] = floorObject.getV();
verts[vi++] = 1;
// Top right halway
verts[vi++] = topRight.x;
verts[vi++] = topRight.y;
verts[vi++] = topRight.z;
verts[vi++] = floorObject.getU2();
verts[vi++] = floorObject.getV();
verts[vi++] = 1;