1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,195
Записей в блоге: 2

Перевод из экранных координат (от -1 до +1)

25.02.2018, 07:36. Показов 5439. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте

Не уверен что верно употребляю "экранные", на всякий случай уточню: в OpenGL это NDC (Normalized Device Coordinates) координаты, видимые вертексы находятся в пределах от -1 до +1 по каждой координате.

Куда переводим? Да куда хотим - в мир, модель, камеру, разница лишь в матрице. Типичная задача: получить координаты углов фрустума в мире. Правило
NDC координату множим на соответствующую обратную матрицу и рез-т делим на его же w.
Пример для перевода в мир
C++
1
2
3
4
5
6
mat4 world2Clip_matrix = projection_matrix * view_matrix;  
mat4 clip2World_matrix = world2Clip_matrix.inverted();   // получили обратную матрицу
...
vec4 ndc_pos(1, 1, 1, 1);  // один из углов фрустума в NDC
vec4 world_pos = clip2World_matrix * ndc_pos;
world_pos /= world_pos.w;
Ну и можно запомнить это простое правило - и все, дальше не читать. Это нормально, не всем и не всегда нужно во все вникать.

Однако все-таки интересно - а почему надо делить, и откуда берется это волшебное w? Ведь для перевода "в" экранные вроде бы тоже надо умножить на матрицу (только прямую) и делить на w. Так что, выходит для обоих переводов делим? Внятного объяснения я не видел, максимум мутное "ну... так работают однородные (гомогенные) координаты". Попробуем разобраться. Начнем с прямого преобразования "из мира в NDC"
C++
1
2
3
4
5
// сначала матрица переводит из мира в "clipped" координаты (от -w до +w) 
vec4  clip_pos = world2Clip_matrix * world_pos;
 
// только после деления на w получаем NDC (от -1 до +1)
vec4 ndc_pos = clip_pos / clip_pos.w;
Обе части первого ур-я домножим слева на обратную матрицу, матрицы в правой части сократятся
C++
1
clip2World_matrix * clip_pos = world_pos;
Ну и что? Ведь clip_pos нам неизвестно, у нас есть только ndc_pos. Поделим обе части ур-я на clip_pos.w. Какое оно - мы (пока) не знаем, но делить обе части ур-я на одно и то же число имеем полное право.
C++
1
2
3
4
Clip2World_matrix * (clip_pos / clip_pos.w) = vec4(world_pos.x / clip_pos.w, 
                           world_pos.y / clip_pos.w, 
                           world_pos.z / clip_pos.w, 
                           1.0 / clip_pos.w);
Оба-на! Так ведь (clip_pos / clip_pos.w) - это же наша ndc_pos (угол фрустума), в левой части теперь все известно. А в правой (1 / clip_pos.w) "выпало в осадок" и тоже стало известно
C++
1
2
3
4
сlip2World_matrix * ndc_pos = vec4(world_pos.x / clip_pos.w, 
                   world_pos.y / clip_pos.w, 
                   world_pos.z / clip_pos.w, 
                   1.0 / clip_pos.w);
Теперь считаем левую часть и.. делим на получившееся w, получаем искомую world_pos

Не по теме:

Дополнительно

Мелкую подробность "деление на w" часто "забывают, а она все меняет. Преобразование в/из экранных координат НЕ лнейное, НЕ матричное именно за счет этого деления. Напр равные отрезки могут не отобразится на экране в равные, прямая может отобразиться в кривую и.т.д. Оно также в принципе НЕ обратимо. Напр если world_pos.w != 1, то восстановить его из экранных мы не сможем



Ну вот, получилось что-то типа хабровской статейки (что я сам не очень люблю)

C уважением
Игорь
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.02.2018, 07:36
Ответы с готовыми решениями:

DirectX Перевод экранных координат в трехмерные
Всем привет. Есть такая задача. Нужно перевести координаты курсора в трехмерные. Попробовал много вариантов, но что-то вообще никак не...

Связь экранных координат с пространственными DirectX
Здравствуйте. Directx и Delphi. У меня на форме выводится трехмерный объект, камеру можно вращать правой клавишей мыши. Мне нужно по щелчку...

Луч выбора (преобразование экранных координат в координаты сцены)
Хочу поделиться знанием связанным с получением луча выбора (преобразование экранных координат в координаты сцены) которое я в упор не...

21
07.03.2018, 21:26
Студворк — интернет-сервис помощи студентам

Не по теме:

Igor3D, думаю что не ответили потому что тут не экзамен, а поднятый вопрос не содержит научной новизны и не имеет бизнес-ценности: переноска воды в решете - не всем интересное мероприятие

0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,195
Записей в блоге: 2
10.03.2018, 13:55  [ТС]
Опять-таки - для решения этой задачки не надо чего-то там "почитать", гуглить и.т.п. Если понимать основы, она решается простым "логическим мЫшлением". Краткий (и абсолютно корректный) ответ
Нет, мы не можем считать пересечения в одной СК и переводить их в другую если этот перевод НЕ линейный
И не надо стесняться спросить
А шо то за "нелинейный"? И почему он всегда пишет "не" большими буквами? Разве это так важно?
Да, важно. Нелинейное преобразование в общем случае отображает прямую в кривую, плоскость в поверхность и.т.п. Вот я намазюкал схемку (аттач). Допустим мы нашли пересечения в СК камеры, это оказалась середина отрезка. Но в NDC эта точка уже не будет серединой отрезка. Мало того, она вообще не будет ему принадлежать.

Забавно что со стороны того кто сидит в NDC все зеркально/симметрично - он ведь тоже множит на матрицу (только обратную) и тоже делит на w. И имеет ровно столько же оснований утверждать
Та у меня все ровно, то у вас камера кривая
Вот собсно и все (могли бы и догадаться). Ну почти...
Миниатюры
Перевод из экранных координат (от -1 до +1)  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.03.2018, 13:55

Перевод координат в другую систем координат
как перевести плоские координаты хyz в другую систему координат x1y1z1 по трем и более точкам?

Перевод координат
Всем привет. У меня такой вопрос. Какие нужны формулы для переноса 3D в 2D. Задача стоит следующая: есть плоскость с 3D объектами. Есть...

Перевод координат NMEA
Добрый вечер, прошу совета в построении алгоритма перевода координат NMEA (ddmm.mmmm). Нужно привезти их в градусы. Есть формула...

Перевод в цилиндрическую систему координат
Есть массив x и y. Нужно получить r и rho. В матлабе это можно сделать без цикла функцией cart2pol. Можно ли в питоне сделать так же ?...

Перевод из оконных координат в мировые
Знаю, что конечная матрица, выходящая на экран, формируется следующим образом MVPmatrix = projection * view * model; Пытаюсь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru