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

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

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

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

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

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

1 Ответ

0 голосов
/ 15 марта 2011

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

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

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

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

...