Я потратил несколько дней на эксперименты и гугление, чтобы попытаться решить эту проблему, и я либо слишком туп, чтобы понять, что мне говорят, либо не ищу в гугле правильные термины.
У меня есть система, которая отображает объект в трехмерном пространстве, а также имеет реализацию «Камеры». Сейчас я пытаюсь добавить источник света и столкнулся с довольно неприятной проблемой.
«Камера» фактически представляет собой вращение и перемещение mvMatrix, которое применяется перед визуализацией каких-либо конкретных элементов.
Если я добавлю к моему объекту логику, которая заставляет его вращаться вокруг своей оси, свет правильно остается на месте и освещает различные грани объекта, когда они обращены к источнику света. Однако, если я перемещаю камеру, источник света «прилипает» к камере, а это не то, что мне нужно.
Некоторые попытки решить эту проблему были:
- Расположите свет перед перемещением и вращением камеры,
- Расположите свет после перемещения и вращения камеры,
- Расположите свет после движения и перед вращением камеры,
- Расположите источник света после того, как все будет визуализировано и после того, как mvMatrix будет извлечен,
- Расположите свет после того, как все будет визуализировано, и до того, как mvMatrix будет вытолкнут,
- Расположите источник света один раз в начале программы, а не во время цикла рендеринга.
- При позиционировании источника света умножьте его позицию vec3 на mvMatrix (это очень близко, но, кажется, не совсем, всегда позиционирует источник света на 0,0,0)
- При размещении источника света умножьте его положение vec3 на значение, обратное mvMatrix (очень странные результаты).
Это заставляет меня поверить, что мне нужно вращаться с помощью вращения mvMatrix, но игнорировать его переводы (я не знаю, почему, я думаю, это единственное, что я могу придумать, что я не пробовал), но я могу ошибаться, поскольку Я не смог найти простой способ сделать это.
В любом случае, я уверен, что вы хотите увидеть код, он есть у меня в общедоступном репозитории на github (приветствуются PR, ха!), вот фрагменты, которые, как я полагаю, вас заинтересуют:
- Основной цикл рендеринга: https://github.com/philbrookes/webgl-engine/blob/add-normals-and-lighting/webgl-engine/Renderer.js#L37
- The Camera's position and rotation methods:
- Метод prepareLighting: https://github.com/philbrookes/webgl-engine/blob/add-normals-and-lighting/webgl-engine/Renderer.js#L73
Я знаю, что prepareLighting довольно взломан, я просто хочу сначала понять это, прежде чем создавать объект Light.
И если вы хотите увидеть его в действии, посмотрите здесь: http://www.bracketbrotherhood.com/webgl-engine
Я был бы очень признателен за помощь в этом, так как я действительно застрял.
Кроме того, это моя первая попытка аккуратного упорядоченного JS, поэтому, если у вас есть какие-либо комментарии о том, как я мог бы лучше организовать кодовую базу, я бы тоже хотел это услышать, хотя я должен подчеркнуть, что это определенно не беспокоит меня. меня, прямо сейчас, чем исправить мою проблему с освещением!
Извините за стену текста... Большое спасибо!
Фил,