libgdx получает размер спрайта в пикселях на экране

#libgdx #perspectivecamera #decal

#libgdx #перспективная камера #деколь

Вопрос:

Я работаю над проектом Libgdx. По сути, это приближение 2.5D, поэтому я использую деколи и декальбатч. Существует также PerspectiveCamera, которой я могу управлять (увеличивать / уменьшать масштаб), а надписи статичны.

У меня возникли проблемы с определением реального размера проекции деколи на экране, например. когда камера увеличена, она больше, когда уменьшена, наклейка появляется на экране меньше.

Мне нужно получить этот размер.

Я пробовал camera.project и camera.unprojects, но он возвращает одинаковые значения для обоих, и он работает только для положения деколи, а также я не уверен, какая система координат используется для деколей в Libgdx.

Есть предложения, как это решить? Что я могу сделать?

Ответ №1:

Camera.project это правильный путь. Он делает именно то, что вы хотите … «выяснение реального размера проекции деколи на экране».

Я не уверен, какая система координат используется для деколей в Libgdx

Стандартная (правосторонняя) 3D система координат. Вы указываете размер своей деколи при их создании с помощью Decal.newDecal(width, height, ...) . Это размер по осям X и. Y

Что вам нужно сделать, так это следующее:

Вычислите 3D-вершины деколи, то есть «угловые» точки квадрата, используя положение, размер, поворот и масштаб деколи. Существует Decal.getVertices() , который может уже возвращать эти значения для вас, но это a float[] , и не задокументировано, как эти значения должны интерпретироваться.

Как только у вас есть эти 4 вершины, вы можете использовать Camera.project(...) их для определения положения этой точки на экране. В случае, если ваши наклейки не всегда обращены непосредственно к камере, эти координаты не обязательно будут определять прямоугольник, но это будет зависеть от вашего использования и того, чего вы на самом деле хотите достичь с помощью этой информации.

В случае, если вы хотите обнаружить входные события на этих надписях (например, щелчки), вам, вероятно, следует создать a BoundingBox для вашей надписи (вы можете использовать вершины, которые вы уже вычислили) и создать a Ray с вашими Camera и входными координатами. Затем используйте Intersector.intersectRayBoundsFast(Ray, BoundingBox) , чтобы проверить, попал ли ваш клик в эту наклейку.

Редактировать: вы можете получить вершины следующим образом:

 float[] vertices = decal.getVertices();
Vector3 topLeft = new Vector3(vertices[Decal.X1], vertices[Decal.Y1], vertices[Decal.Z1]);
Vector3 topRight = new Vector3(vertices[Decal.X2], vertices[Decal.Y2], vertices[Decal.Z3]);
Vector3 bottomLeft = new Vector3(vertices[Decal.X3], vertices[Decal.Y3], vertices[Decal.Z3]);
Vector3 bottomRight = new Vector3(vertices[Decal.X4], vertices[Decal.Y4], vertices[Decal.Z4]);
  

Комментарии:

1. Tnx, для быстрого ответа. Не могли бы вы быть немного более подробными. getVertices возвращает массив из 24 элементов, это немного сбивает с толку, какие из них использовать для создания метода Vector3 для camera.project? Я обнаружил в исходном коде, что в этом массиве есть 3 пары (x, y, z). // 3 (x, y, z) 1 (цвет) 2 (u, v) Почему 3? не 4?

2. Я также потерпел неудачу в этой части несколько дней назад. Я не знаю, как использовать эти значения. Я думаю, что это тоже должно быть 4. Однако вы также можете вычислить эти вершины самостоятельно. Или проверьте источник DecalBatch, который будет их отображать, и проверьте, как там вычисляются вершины.

3. Хорошо, я также проверил код сейчас. Проверьте мое редактирование.

4. РЕДАКТИРОВАТЬ: я просто отключаюсь, все выглядит идеально 🙂 Снова Tnx!