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

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

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

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

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

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


person Michael Rubin    schedule 14.03.2011    source источник


Ответы (1)


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

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

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

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

person Tommy    schedule 14.03.2011
comment
Спасибо за быстрый ответ. Действительно, мой FOV, я думаю, 60. Я помню, что видел поведение, когда прикосновения дальше от центра были более неправильными. Если бы я временно сделал свой FOV 90-градусным, я должен был бы ожидать большей точности от непроекта? - person Michael Rubin; 15.03.2011
comment
Если ваши горизонтальные и вертикальные поля зрения были равны 90 (что приводит к тому, что графика будет короткой и толстой, поскольку ваше окно просмотра не квадратное), то вы должны получить отличные результаты. Если вы указываете вертикальное поле зрения для функции в стиле gluPerspective в своей матрице, то при вращении оно должно стать горизонтальным полем зрения. - person Tommy; 15.03.2011
comment
Мне не удалось исправить общий случай методом проб и ошибок. Иногда у меня была, казалось бы, идеальная точность в центре экрана, но она снова ухудшалась к краям. Я заметил, что в типичном расчете матрицы усеченной проекции есть котангенс (примененный к fov и соотношению сторон), поэтому, возможно, «поправочный коэффициент», который мне нужно применить к результату, не является линейным. - person Michael Rubin; 15.03.2011
comment
О верно. Возможно, сферически-декартова путаница? Строки (и столбцы) на экране не идут линейно под углом от наблюдателя. Например. столбец в n единицах от центра проекции на переднюю плоскость зажима, которая находится на расстоянии d от камеры, находится под углом atan(n/d). Unproject обычно дает вам вектор, указывающий на местоположение на плоскости отсечения (или на другой плоскости, параллельной ей, как вы указываете), однако это не учитывается. - person Tommy; 15.03.2011
comment
Что мне кажется странным, так это то, как любые программы OpenGL (например, в Windows, где у вас соотношение сторон не 1,0 и угол обзора не 90 градусов) справляются с этой непроекцией? Кажется, что все учебники по iPhone отлично работают в портретном режиме, но, в частности, переключение в альбомный режим является проблемой. - person Michael Rubin; 15.03.2011
comment
У меня что-то сносно работает. Я взял координаты клипа касания экрана (от -1 до 1 по X и Y) и повернул камеру вперед (или «глаз») по горизонтали (вокруг оси Y) на половину горизонтального FOV, умноженного на координату клипа x, и затем по вертикали (вокруг оси X) на половину вертикального FOV, умноженного на координату клипа y. - person Michael Rubin; 16.03.2011