Libgdx вычисляет представление PerspectiveCamera в 2d - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно рассчитать границы обзора камеры в 2d, x y width и height

enter image description here

В этомСнимок экрана: сетка - это каждая единица, мне нужно рассчитать ограничивающую рамку трехмерного вида, в приведенном выше примере результаты должны быть такими:

float x = -3;
float y = 0;
float width = 14;
float height = 6;

1 Ответ

0 голосов
/ 20 сентября 2019

Предполагая, что ваша камера всегда будет смотреть вниз на ваш мир, так что горизонт не виден, и что камера всегда смотрит параллельно оси Y карты, поэтому горизонтальные линии никогда не искривляются, я думаю, что этовопрос вычисления ширины самой дальней линии, находящейся в пределах видимости, потому что именно в этом случае перспектива будет показывать вам наибольшее количество плиток по горизонтали.Это даст вам прямоугольную область мозаичной карты, которая полностью покрывает усеченную фигуру, хотя вы будете рисовать дополнительные плитки в ближайших углах.

private final Ray tmpRay = new Ray();
private final Vector3 tmpVec = new Vector3();
private final Rectangle visibleTilesRegion = new Rectangle();

private void updateVisibleTilesRegion (){
    // Define a ray that is a projection of the direction the camera is looking onto the 
    // tile plane (assuming it is a Z=0 plane).
    tmpRay.origin.set(camera.position.x, camera.position.y, 0f);
    tmpRay.direction.set(0f, 1f, 0f);

    //Find top and bottom
    Intersector.intersectRayPlane(tmpRay, camera.frustum.planes[4], tmpVec);
    float yTop = tmpVec.y;
    Intersector.intersectRayPlane(tmpRay, camera.frustum.planes[5], tmpVec);
    float yBottom = tmpVec.y;

    // Find left and right at the top of the screen by intersecting that line with the left 
    // and right planes
    tmpRay.origin.set(camera.position.x, yTop, 0f);
    tmpRay.direction.set(-1f, 0f, 0f);
    Intersector.intersectRayPlane(tmpRay, camera.frustum.planes[2], tmpVec);
    float xLeft = tmpVec.x;
    tmpRay.direction.set(1f, 0f, 0f);
    Intersector.intersectRayPlane(tmpRay, camera.frustum.planes[3], tmpVec);
    float xRight = tmpVec.x;

    visibleTilesRegion.set(xLeft, yBottom, xRight - xLeft, yTop - yBottom);
}
...