преобразовать нормали мирового пространства в нормали экранного пространства

Как правильно преобразовать нормали поверхности, определенные в мировом пространстве, в нормали в экранном пространстве? Я не думаю, что их можно просто умножить на матрицу проекции, потому что деление перспективы преобразует вещи в пространство клипа, и, насколько я понимаю, в этом пространстве плоскости, которые копланарны плоскости изображения, остаются копланарными.

Но преобразование, которое я ищу, должно привести к преобразованию нормалей, так что нормали синего мира, изображенные на рисунке A, должны приводить к разным нормам экранного пространства (потому что, хотя их плоскости копланарны плоскости изображения, они не обращены к камере) - с другой стороны, изображенные нормали на графике B после преобразования должны быть (более или менее) равными, поскольку их поверхности обращены к камере.

введите описание изображения здесь

Какое преобразование я ищу? как это рассчитать?

Мне это нужно для некоторых эффектов экранного пространства.


person matthias_buehlmann    schedule 14.01.2013    source источник
comment
Ваши примеры неверны. Экранное пространство выглядит и работает не так. Это проекция на плоскость, а не на сферу.   -  person Tara    schedule 28.06.2018


Ответы (3)


Вы ищете матрицу трансформации относительно основы. Есть неплохое видео о том, как рассчитать эту матрицу. Отметьте видео KhanAcademy.

ИЗМЕНИТЬ

Вы не предоставили никакой информации о технологиях, которые вы используете (OGL, DX, шейдеры, собственная проекция, ...), но вам обязательно стоит прочитать несколько статей о касательном пространстве, например Возня с касательным пространством ..

person Sorceror    schedule 14.01.2013
comment
Я знаю, как преобразовать нормали из касательного пространства в пространство объектов или мировое пространство или наоборот. Однако это не покрывает экранное пространство - person matthias_buehlmann; 14.01.2013
comment
Но как связаны нормали некоторых объектов с экранным пространством ..? Нормали всегда есть нормали, независимо от того, с какой точки вы на них смотрите ... - person Sorceror; 14.01.2013

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

person kerim    schedule 14.01.2013
comment
это не касается моей проблемы. Речь идет о правильном преобразовании нормалей в пространство вокруг глаз. Это не о проекции - person matthias_buehlmann; 14.01.2013
comment
да, я вижу, не все так просто. в вашем случае результат нормального преобразования зависит от позиции поверхности, которая имеет эту нормаль ... - person kerim; 14.01.2013
comment
@ user1282931 - не могли бы вы применить эффекты экранного пространства в пространстве для глаз? - person kerim; 14.01.2013
comment
точно - происхождение каждого вектора нормали влияет на результат! нет, я не могу выполнять их в пространстве для глаз. Мне нужно вычислить поиск в текстуре на основе вектора нормали экранного пространства - person matthias_buehlmann; 14.01.2013
comment
тогда возможно просто преобразовать (спроецировать) исходную точку нормали и другой точки (исходная точка смещена на эту нормаль). а затем эти две преобразованные точки пересчитывают нормаль в пространстве проекции. - person kerim; 14.01.2013
comment
Помните, что преобразованная нормаль - это кривая, а не линия. Поэтому, если вы выберете произвольную точку вдоль нормали, преобразуете ее, а затем подключитесь к преобразованной исходной точке, вы получите в лучшем случае приближение, но не точную проекцию нормали. Это предел преобразованной разности с исходным смещением, приближающимся к нулю. - person kvark; 16.08.2017

Предположим, вы хотите преобразовать нормальный N в точке P произвольной матрицей 4x4. Представим матрицу с частью модели T (имеющей поворот, масштаб и перенос) и частью с последней строкой как W. Это позволяет нам сказать, что:

Transform(P) = (T * P) / dot(W,P)

Теперь проецируемую нормаль можно рассматривать как предел (d -> 0):

(Transform(P+dN) - Transform(P)) / d

Расширение этого уравнения и вычеркивание буквы d из знаменателя и знаменателя приводит к следующей формуле:

dot(W,N) * (Transform(N) - Transform(P)) / dot(W,P)

Это непроверено и непроверено, но я подумал, учитывая отсутствие положительных ответов на этот вопрос, я бы попробовал;)

person kvark    schedule 15.08.2017