Почему уменьшение масштаба объекта приводит к тому, что объект становится светлее в OpenGL ES?

Почему масштабирование (равномерно) объекта вниз приводит к тому, что объект становится светлее в OpenGL ES 1.x?

Было бы разумнее сделать его темнее, потому что разве масштаб нормалей не делает объект темнее? Но почему-то объект становится светлее. Когда я увеличиваю масштаб, объект становится темнее. На мой взгляд, должно быть наоборот.

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


person Community    schedule 25.05.2009    source источник
comment
Я бы выложил несколько скриншотов до/после этого.   -  person Jim Buck    schedule 26.05.2009


Ответы (2)


Простой вопрос, сложный ответ. Это соответствующий отрывок из Красной книги:

Преобразование нормалей

Векторы нормалей не преобразуются так же, как вершины или векторы положения. Математически лучше думать о векторах нормалей не как о векторах, а как о плоскостях, перпендикулярных этим векторам. Затем правила преобразования векторов нормалей описываются правилами преобразования перпендикулярных плоскостей. Однородная плоскость обозначается вектором-строкой (a, b, c, d), где по крайней мере один из a, b, c или d отличен от нуля. Если q — ненулевое действительное число, то (a, b, c, d) и (qa, qb, qc, qd) представляют одну и ту же плоскость. Точка (x, y, z, w)T лежит на плоскости (a, b, c, d), если ax+by+cz+dw = 0. (Если w = 1, это стандартное описание евклидовой плоскости.) Чтобы (a, b, c, d) представляла евклидову плоскость, хотя бы одно из a, b или c должно быть ненулевым. Если все они равны нулю, то (0, 0, 0, d) представляет собой «бесконечно удаленную плоскость», которая содержит все «бесконечно удаленные точки».

Если p — однородная плоскость, а v — однородная вершина, то утверждение «v лежит на плоскости p» математически записывается как pv = 0, где pv — нормальное умножение матриц. Если M — неособое вершинное преобразование (то есть матрица 4 × 4, имеющая обратную M-1), то pv = 0 эквивалентно pM-1Mv = 0, поэтому Mv лежит в плоскости pM-1. Таким образом, pM-1 — это образ плоскости при вершинном преобразовании M.

Если вам нравится думать о нормальных векторах как о векторах, а не как о плоскостях, перпендикулярных им, пусть v и n будут векторами, такими что v перпендикулярен n. Тогда nTv = 0. Таким образом, для произвольного неособого преобразования M nTM-1Mv = 0, а это означает, что nTM-1 является транспонированным преобразованным вектором нормали. Таким образом, преобразованный вектор нормали равен (M-1)Tn. Другими словами, векторы нормалей преобразуются обратным транспонированием преобразования, которое преобразует точки. Вау!

Короче говоря, позиции и нормали не трансформируются одинаково. Как объяснялось в предыдущем тексте, нормальная матрица преобразования равна (M-1)T. Масштабирование M до sM даст (M-1)T/s: чем меньше коэффициент масштабирования, тем больше преобразованная нормаль... Вот так!

person Community    schedule 26.05.2009

Казалось бы, нормали не масштабируются вместе с объектом. Это означало бы, что нормали для объекта в натуральную величину будут значительно больше охватывать объект меньшего размера. Это привело бы к тому, что углы между источниками света и нормалями были бы точно такими же, но на поверхности, которая намного меньше.

person Soviut    schedule 25.05.2009
comment
Хм, хм... это как-то имело бы смысл, но я не понимаю математики, стоящей за попаданием. Разве нормали поверхности не просто умножаются на обратную матрицу просмотра модели, на которую повлияло масштабирование. - person ; 26.05.2009
comment
Этого я не знаю, мое понимание нормалей исходит из 3D-анимации, а не из OpenGL. Я основывал свой ответ на беглом чтении, которое я сделал, когда нормали часто рассчитываются заранее, и им нужно сказать, чтобы они следовали их соответствующим полиграням/вертам/и т. д. Если нормали не соответствуют (или масштабируются, в вашем случае) геометрии, вы получите темные и светлые пятна. - person Soviut; 26.05.2009