Математика - Отображение нескольких объектов в одном представлении с использованием тригонометрии - PullRequest
2 голосов
/ 09 июня 2010

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

Справочная информация: Я делаю 2D-игру на C # с использованием XNA.В этой игре я хочу, чтобы камера могла увеличивать и уменьшать масштаб, чтобы всегда была видна определенная часть объектов.Излишне говорить, что объекты движутся в двух измерениях, а камера движется в трех .

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

Это выглядит примерно так:

1. Переберите все объекты, чтобы найти внешние края наших объектов: farRight, farLeft, farUp, farDown.

2. Когдамы знаем, какие края должны быть показаны, вычислим центр, также известный как положение камеры:

CenterX = farLeft + (farRight - farLeft) * 0.5f;
CenterY = farUp + (farDown - farUp) * 0.5f;

3. Проведите по нашим краям, чтобы найти наибольшее значение по сравнению с положением нашей камерытаким образом самое дальнее расстояние от центра экрана.

4. Используя наибольшее значение расстояния, мы можем легко вычислить необходимую высоту, чтобы показать все эти объекты (точки):

float T = 90f - Constants.CAMERA_FIELDOFVIEW * 0.5f;
float height = (float)Math.Tan(MathHelper.ToRadians(T)) * (length);

Пока все хорошо, камера отлично позиционируется на основе расчетов.

Проблема:

a) Моя цель рендеринга - 1280 * 720 с полем зрения45 градусов, так что на оси X всегда видно немного больше, на 560 пикселей больше.Это не проблема сама по себе, а более серьезная на б) ...

б) Я хочу, чтобы камера была немного дальше, чем она есть, чтобы можно было увидеть немного больше о происходящемза самой дальней точкой.Конечно, это происходит на оси X, но это технически результат моей ошибочной логики.Я хочу иметь возможность видеть больше как по осям X, так и по оси Y и контролировать это поведение.

Вопрос

Хм, поясню.Я хотел бы получить некоторые сведения о способе позиционирования самой камеры, создавая это состояние:

Объекты не будут ближе, чем, скажем ... 150 пикселей к краю оси X и 100пикселей до края оси Y.Для этого камера должна располагаться вдоль оси Z так, чтобы поле обзора охватывало все это.

Мне не нужна помощь с кодированием, только математика и логика вычисления высоты моегокамера.Как вы, наверное, видите, мне тяжело оборачивать это в своей голове, и еще труднее пытаться объяснить это вам.

Если кто-то там имел дело с этим или просто лучше меня по математикеЯ буду признателен за все, что вы скажете!:)

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

Разве вам не нужно просто добавлять или вычитать 150 или 100 пикселей (в зависимости от того, на какой край вы смотрите) к каждому измерению расстояния в цикле на шаге 3 и переносить это большее значение в длину на шаге 4? Или я что-то упустил.

0 голосов
/ 10 июня 2010

В данный момент я не могу исследовать эту область дальше, но если у кого-то возникла та же проблема, но он не удовлетворен предоставленным ответом, в XNA есть другая возможность.

ViewPort.Unproject()

Эта изящная функция преобразуеткоордината пространства экрана в единицу мирового пространства.

ViewPort.Project()

Делает противоположную вещь, а именно, преобразовывает пространство мира в пространство экрана.Просто подумал, что кто-то может пойти дальше меня.Как бы ни старался мой ОКР оставлять вещи не идеальными, я не могу совершенствовать это ... пока.

...