iPhone выбрать / не проецировать, когда в альбомной ориентации (матрица проекции вращается)

Я пытаюсь заставить работать "сборку" в 3D-сцене, где вид поворачивается так, что iPhone удерживается в ландшафтном режиме. Я использую OpenGL ES 2.0 (так что все шейдеры, без конвейера с фиксированной функцией).

Я выполняю unproject из кода рендеринга и немедленно рисую полученный луч, используя GL_LINES (луч рассчитывается только при первом касании экрана, поэтому после этого я могу перемещать камеру, чтобы наблюдать результирующую линию под разными углами),

Мой внепроектный код / ​​вызов в порядке (множество примеров gluUnproject онлайн). Мой код инверсии матриц в порядке (даже по сравнению с Excel для нескольких матриц). Тем не менее, полученный луч отклонен как минимум на 5-15 градусов от того места, где я фактически "щелкнул" (в симуляторе это действительно щелчок, поэтому я ожидаю гораздо большей точности от непроектированного).

Мой вид поворачивается в горизонтальную (после создания матрицы проекции перспективы я поворачиваю ее вокруг Z на -90 градусов; соотношение сторон остается портретным). Я полагаю, что проблема с математикой находится здесь.

У кого-нибудь есть опыт выполнения выбора / снятия проекции с определенным пейзажем?

1 ответ

Решение

Возможно ли, что вы просто отключили поле зрения? Если предположить, что вы придерживались чего-то похожего на традиционный конвейер, если вы инвертировали матрицу вида модели, а затем использовали общий непроектированный код (т. Е. Код, который предполагает 90-градусное поле зрения в обоих направлениях, чтобы заполнить пространство глаза), то это объясняет Это.

Быстрый диагностический тест, чтобы увидеть, как далеко он находится для разных прикосновений. Прикосновения ближе к центру проекции должны быть ближе к правильному ответу.

На экране с квадратными пикселями, как у iPhone, соотношение сторон - это просто пропорция горизонтального поля по сравнению с вертикальным. Поэтому, если вы хотите быть ненаучным в этом вопросе, найдите поле зрения, которое вы используете, например, f, и попробуйте умножить свои результаты на 90/f или f/90. Если это не сработает, попробуйте добавить коэффициент 480/320 или 320/480.

Лучшее решение - проследить ваш код и выяснить, каковы ваши фактические горизонтальные и вертикальные поля зрения. И умножьте свои результаты на более чем 90.

Другие вопросы по тегам