3D-2D-проекция с использованием вида усеченного имеет проблемы с переводом

Мне нужно создать этот программный растеризатор с учетом проекции (P), Посмотреть (V) и модель (M) матрицы, можно создать 2D-изображение облака точек (pc) с заданной точки зрения в растровом формате (монохромное растровое изображение).

У меня есть математика (и, кажется, все работает по большей части):

  1. Преобразовать точки облака точек pc' = (P x V x M) x pc (обратите внимание, что облако точек уже находится в однородной системе)
  2. Для каждой точки разделите все компоненты на ее w (при этом будьте осторожны, чтобы отказаться от пунктов, которые имеют w близко к нулю.
  3. Откажитесь от точек, которые выходят за пределы усеченного вида (путем извлечения плоскостей усеченного P используя метод, описанный Вот)
  4. преобразование x а также y координаты каждой точки для экранных координат, используя (x + 1) * imageWidth / 2 а также (-y + 1) * imageHeight / 2 (иметь правильную координату у).
  5. Нанесите на карту x а также y координаты растрового линейного индекса с использованием (int)y * imageWidth + (int)x (с проверкой границ).

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

Все хорошо, пока у меня нет компонента перевода в матрице M! Как только у меня появляется малейшее количество переводов, изображение разрывается: облако точек сильно искажается (как будто к нему применено неаффинное преобразование). Неважно, в каком направлении применяется перевод, ЛЮБОЙ перевод портит все, вплоть до того, что облако точек больше не распознается. Сначала я думал, что моя матрица модели была транспонирована (что привело к неаффинному преобразованию), но, похоже, это не так.

Я мог бы опубликовать некоторый код, если это необходимо, но, учитывая приведенный выше обзор, я что-то упустил ?? Есть ли какие-то особые соображения, которые могут потребоваться?

1

Решение

Проблема была настолько глупой, что мне стыдно тратить столько времени.

Оказалось, что некоторые из точек в моем облаке точек были неправильными w компоненты. Я не столкнулся с какими-либо проблемами на стороне OpenGL, потому что шейдер вручную настраивал все wс на 1. На стороне растеризатора, неправильно wВызывает точки, которые были на больших расстояниях от камеры, чтобы проецироваться в неправильных точках зрения.

Тестовые сферы, которые я использовал, не имели никаких проблем, потому что они имели право w компоненты.

Редактировать:
Просто подумал, что я бы также упомянул это: нет необходимости извлекать плоскости усеченного вида, чтобы определить, попадают ли проецируемые точки в усеченный вид или нет. Можно просто выполнить эту проверку, определив, все ли x', y' а также z' компоненты в преобразованной точке (x', y', z', w') (т.е. после умножения на матрицу P x V x M) попадают в ассортимент w' а также -w', Если все три компонента попадают в этот диапазон, эта точка является видимой, в противном случае эта точка находится за пределами области видимости.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]