#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!