Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,137
Записей в блоге: 2

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

25.02.2018, 07:36. Показов 5387. Ответов 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
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,137
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru