Применение преобразований к 3D-моделям - Нормали pb

Я пытаюсь применить преобразование к 3D-объекту в файле STL (без создания структурированного объекта-сетки). Вот как я продолжаю: я читаю информацию о нормалях и гранях одну за другой в файле STL, применяю свое преобразование к каждой вершине и к нормали лица и записываю новые вычисленные значения в другой файл STL. Вершины в сгенерированном файле в порядке, но мои нормали неправильные. Кажется, я не могу просто применить свое преобразование к нормали, как к вершине. Как такое возможно ??

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
432
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Преобразование вектора отличается от преобразования точки - вы не можете применить преобразование, только вращения.

Ответ принят как подходящий

Вы должны посмотреть преобразование нормалей.

На самом деле, Джефф, ты прав только отчасти. Что касается вектора, ты прав. Но для нормального, который немного отличается по значению, вы должны преобразовать верхние 3x3, но инвертировать, а затем транспонировать.

К чести Джеффа, вы должны отметить, что то, что он сказал, справедливо для жестких преобразований, таких как вращения (кажется, именно то, о чем он говорил). И Джумар не сказал, что именно он имел в виду под «преобразованием» ...

Camille 11.11.2008 01:13

Да - для вращений (и отражений) транспонирование является является обратным, поэтому обратное транспонирование - это просто исходная матрица.

comingstorm 11.11.2008 04:28

Ага - это анизотропное масштабирование, которое убивает ваши нормали - вот почему обратное транспонирование.

Matt Cruikshank 11.11.2008 17:52

Вам нужно применить обратное транспонирование вашей матрицы к нормалям вместо использования исходной матрицы.

Кроме того, вам нужно обрабатывать w-координату нормали как 0 (а не 1, как с точками) при ее преобразовании.

Вы можете применить практически одно и то же преобразование для обоих, но помните об этих двух вещах:

  • Нормали - это направления, поэтому Позиционная часть матрицы 4x4 не должна применяться. Чтобы избежать его применения, вы можете либо отформатировать вектор как Vector (x, y, z, 0) перед умножением на матрицу, либо использовать специальную функцию TransformVector (), чтобы избежать инструкций, которые в конечном итоге приведут к умножению на ноль.
  • Если применяемая вами матрица содержит шкалу, ваш нормальный также будет масштабирован, это означает, что если вы сделаете типичный N.L Lighting dot product ваш результат будет ярче или темнее, чем это должно быть. Обычно вы бы хотели повторно нормализовать после применения преобразовать или убедиться, что преобразование не денормализирует нормальный (вот что обратное транспонирование матрицы для.)

Quote Rodrigo Lopez: Normals are directions, so the position part of a 4x4 matrix shouldn't really be applied though renormalization will fix it anyway.

перенормировка не исправит это: предположим, что нормальное значение равно (1,0,0), затем переведем его с помощью (-2,0,0) => нормальное значение будет (-1,0,0), которое нормализовано и неверно, потому что нормальное должно оставаться прежним.

Другие вопросы по теме