вращение матрицы, влияющее на источник света

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

У меня есть система, которая отображает объект в трехмерном пространстве, а также имеет реализацию «Камеры». Сейчас я пытаюсь добавить источник света и столкнулся с довольно неприятной проблемой.

«Камера» фактически представляет собой вращение и перемещение mvMatrix, которое применяется перед визуализацией каких-либо конкретных элементов.

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

Некоторые попытки решить эту проблему были:

  • Расположите свет перед перемещением и вращением камеры,
  • Расположите свет после перемещения и вращения камеры,
  • Расположите свет после движения и перед вращением камеры,
  • Расположите источник света после того, как все будет визуализировано и после того, как mvMatrix будет извлечен,
  • Расположите свет после того, как все будет визуализировано, и до того, как mvMatrix будет вытолкнут,
  • Расположите источник света один раз в начале программы, а не во время цикла рендеринга.
  • При позиционировании источника света умножьте его позицию vec3 на mvMatrix (это очень близко, но, кажется, не совсем, всегда позиционирует источник света на 0,0,0)
  • При размещении источника света умножьте его положение vec3 на значение, обратное mvMatrix (очень странные результаты).

Это заставляет меня поверить, что мне нужно вращаться с помощью вращения mvMatrix, но игнорировать его переводы (я не знаю, почему, я думаю, это единственное, что я могу придумать, что я не пробовал), но я могу ошибаться, поскольку Я не смог найти простой способ сделать это.

В любом случае, я уверен, что вы хотите увидеть код, он есть у меня в общедоступном репозитории на github (приветствуются PR, ха!), вот фрагменты, которые, как я полагаю, вас заинтересуют:

Я знаю, что prepareLighting довольно взломан, я просто хочу сначала понять это, прежде чем создавать объект Light.

И если вы хотите увидеть его в действии, посмотрите здесь: http://www.bracketbrotherhood.com/webgl-engine

Я был бы очень признателен за помощь в этом, так как я действительно застрял.

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

Извините за стену текста... Большое спасибо!

Фил,


person Philthi    schedule 17.08.2013    source источник
comment
Я должен отметить, что я также гуглил это как проблему opengl, и большинство решений включало использование glLight, для которого я не смог найти соответствующий вызов в webgl.   -  person Philthi    schedule 17.08.2013
comment
Я переместил свой объект на 0, -5, 0 и повторно применил умножение на mvMatrix, когда мой свет находится на 0,0,0, это работает отлично. При положительном перемещении источника света вдоль любой оси он немного работает (например, он перемещается на 1 по этой оси, т. е. положение источника света: [0,5,0], кажется, устанавливает его на [0,1,0]), однако отрицательные значения оси видимо игнорируют!   -  person Philthi    schedule 17.08.2013


Ответы (1)


Я скопировал код освещения с: http://learningwebgl.com/lessons/lesson07/index.html

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

Для ясности, вот мои до и после:

var alp = vec3.create();
vec3.normalize([17,0,0], alp);

Изменение этого на:

var alp = vec3.create([17,0,0]);

Проблема исправлена, ура!

person Philthi    schedule 17.08.2013
comment
Я обновил bracketbrotherhood/com/webgl-engine, если вы хотите его увидеть :) - person Philthi; 17.08.2013