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]);
Другие вопросы по тегам