Почему этот свет движется в этом примере Webgl? - PullRequest
0 голосов
/ 13 февраля 2019

Вот пример интерполяции Горада и модели отражения Ламберта из учебника.

https://jsfiddle.net/zhenghaohe/r73knp0h/6/

Однако в учебнике есть глупая ошибка, в этой книге говорится, что код должен содержать следующую строку, когда на самом деле это не ,

vec3 light = vec3(uModelViewMatrix * vec4(uLightDirection, 0.0));

Странная вещь: пример все еще работает.

Я знаю, что сфера вращается, потому что

mat4.rotate(modelViewMatrix, modelViewMatrix, angle * Math.PI / 180, [0, 1, 0]); Однако мне кажется, что свет также движется вместе со сферой.Но в коде я не могу найти, как движется свет.

Может кто-нибудь указать мне код, где мы также вращаем свет?

1 Ответ

0 голосов
/ 14 февраля 2019

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

Компьютерная модель - это серия «вершин», которые соединяются в «грани» (обычно треугольники),Когда «реалистичный» свет вводится в сцену, для определения того, как он должен взаимодействовать с каждым лицом модели, необходим дополнительный фрагмент информации, это называется «нормальным».Нормаль - это вектор направления, который обычно образует линию, перпендикулярную грани, но ему не обязательно, что станет важным для вашей проблемы.Этот нормаль используется для вычисления того, как свет взаимодействует с этой поверхностью.

Таким образом, у вас есть три набора данных: вершины, индикаторы (как вершины собираются вместе для формирования граней) и нормали (вычисляются автоматически втвой пример).Проблема возникает, когда вы начинаете делать преобразования в модель (например, вращение), но не выполняете преобразования, аналогичные нормалам, которые были вычислены до преобразования.

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

Figure A

Теперь, когда мы начинаем вращать пирамиду, но мы оставляем направления нормали без изменений, мы видимчто угол между нормалью и гранью начинает меняться.

Figure B

Figure C

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

Figure D

Угол освещенияОтносительно поверхности нормаль - это то, что определяет, как поверхность затеняется светом.Когда вы вращаете модель, нормали начинают указывать в «случайных» направлениях, это мешает вычислению света, и кажется, что свет вращается, но это не так.

Очевидно, что это очень поливаетобъяснение того, что происходит, но оно должно дать вам базовое понимание того, что является нормой и зачем вам нужно применять преобразования к ним.

...