Как в OpenGL отображаются модели?

185
15 февраля 2018, 15:05
  1. obj файл содержит координаты вершин, вот например одна из них: v -1.174286 32.706123 6.473185 как это представить в вид от -1 до 1 как это требует opengl? Есть ли функция перевода? (Для работы с геометрическими преобразованием использую библиотеку joml)

  2. у меня obj не содержит нормалей, как задать вектор направление? Что в этом случае нужно делать?

Answer 1
  1. В OpenGL используется иерархия преобразований для вывода на экран. Для этого используются матрицы трансформации модели (например перемещение, вращение, масштабирование и т.п.), вида (преобразование из мировых коорлинат в координаты которые видит камера), проекции (преобразование из координат камеры в -1..1 координаты, например ортографическая или перспективная).
    Т.о. вы можете задать ортографическую проекцию произвольного размера (например -100..412), в которой иметь модель так же произвольного размера (например 10..120) и получить ее на экране.
    С точки зрения работы с готовым движком - вы просто задаете свойства виртуальной "камеры" (положение, ориентацию, зум) и размещаете объект в сцене (положение, ориентацию, размер). Ни про какие -1..1 вам знать не надо.

  2. Нормали достаточно просто рассчитываются по полигонам/треугольникам. Нормаль - это перпендикуляр к поверхности. Посчитав кросс-продукт между двумя векторами в треугольнике мы получим его нормаль. (направление которой зависит от направления векторов).

    function VectorCrossProduct(const A, B: TKMVertex3): TKMVertex3;
    begin
      Result.X := A.Y * B.Z - A.Z * B.Y;
      Result.Y := A.Z * B.X - A.X * B.Z;
      Result.Z := A.X * B.Y - A.Y * B.X;
    end;
    

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

READ ALSO
Как сделать чтобы в JTextPane при использовании JScrollPane значение после пробела не уходили вертикально вниз

Как сделать чтобы в JTextPane при использовании JScrollPane значение после пробела не уходили вертикально вниз

Не могу понять почему после пробела, он не использует горизонтальную прокрутку а скидывает её в вертикальную

126
Оператор Switch или if \ else

Оператор Switch или if \ else

Есть ли какие-то преимущества у switch над конструкцией (if else + else if) помимо визуальной наглядности

195
Изменение части текста

Изменение части текста

Как можно изменить часть текста? Не понимаю как можно этого добитьсяЯ думал разбить на массив char и менять эти символы

141
Возврат массива из функции в обратном порядке

Возврат массива из функции в обратном порядке

Задача: отправить в функицию массив и вернуть (не отобразить,а именно вернуть) массив в обратном порядкеРезультат: Вылазит ексепшн согласно...

167