libgdx получает размер спрайта в пикселях на экране
Я работаю над проектом Libgdx. Это в основном 2.5D-подход, поэтому я использую Decals и DecalBatch. Также есть PerspectiveCamera, которой я могу манипулировать (увеличивать / уменьшать), а наклейки являются статическими.
У меня проблемы с определением реального размера проекции надписи на экране, например. при увеличении камеры она больше, при уменьшении изображение на экране становится меньше.
Мне нужно, чтобы получить этот размер.
Я пробовал camera.project и camera.unprojects, но он возвращает одинаковые значения для обоих, и он работает только для положения декаля, а также я не уверен, какая система координат используется для декалей в Libgdx.
Любое предложение, как это решить? Что я могу сделать?
1 ответ
Camera.project
это путь Он делает именно то, что вы хотите... "выяснить, каков реальный размер проекции изображения на экране".
Я не уверен, какая система координат используется для декалей в Libgdx
Стандартная (правша) трехмерная система координат. Вы указываете размер своей наклейки, когда создаете их через Decal.newDecal(width, height, ...)
, Это размер на X
а также Y
Оси.
Что вам нужно сделать, это следующее:
Вычислите трехмерные вершины надписи, то есть "угловые" точки квадратора, используя положение, размер, поворот и масштаб надписи. Есть Decal.getVertices()
который может уже вернуть эти значения для вас, но это float[]
и не задокументировано, как эти значения должны интерпретироваться.
Когда у вас есть эти 4 вершины, вы можете использовать Camera.project(...)
чтобы получить позицию на экране этой точки. В случае, если ваши наклейки не всегда обращены непосредственно к камере, эти координаты не обязательно определяют прямоугольник, но это будет зависеть от вашего варианта использования и того, чего вы на самом деле хотите достичь с помощью этой информации.
Если вы хотите обнаружить входные события на этих наклейках (например, щелчки), вам, вероятно, следует создать BoundingBox
для вашей декали (вы можете использовать вершины, которые вы уже рассчитали) и создать 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]);