Мне нужно создать этот программный растеризатор с учетом проекции (P
), Посмотреть (V
) и модель (M
) матрицы, можно создать 2D-изображение облака точек (pc
) с заданной точки зрения в растровом формате (монохромное растровое изображение).
У меня есть математика (и, кажется, все работает по большей части):
pc' = (P x V x M) x pc
(обратите внимание, что облако точек уже находится в однородной системе) w
(при этом будьте осторожны, чтобы отказаться от пунктов, которые имеют w
близко к нулю.P
используя метод, описанный Вот)x
а также y
координаты каждой точки для экранных координат, используя (x + 1) * imageWidth / 2
а также (-y + 1) * imageHeight / 2
(иметь правильную координату у).x
а также y
координаты растрового линейного индекса с использованием (int)y * imageWidth + (int)x
(с проверкой границ).Кажется, что все работает отлично: я получаю точное растровое изображение, как если бы я рендерил его с помощью OpenGL, вращение облака точек произвольным кватернионом по-прежнему дает действительные результаты.
Все хорошо, пока у меня нет компонента перевода в матрице M
! Как только у меня появляется малейшее количество переводов, изображение разрывается: облако точек сильно искажается (как будто к нему применено неаффинное преобразование). Неважно, в каком направлении применяется перевод, ЛЮБОЙ перевод портит все, вплоть до того, что облако точек больше не распознается. Сначала я думал, что моя матрица модели была транспонирована (что привело к неаффинному преобразованию), но, похоже, это не так.
Я мог бы опубликовать некоторый код, если это необходимо, но, учитывая приведенный выше обзор, я что-то упустил ?? Есть ли какие-то особые соображения, которые могут потребоваться?
Проблема была настолько глупой, что мне стыдно тратить столько времени.
Оказалось, что некоторые из точек в моем облаке точек были неправильными w
компоненты. Я не столкнулся с какими-либо проблемами на стороне OpenGL, потому что шейдер вручную настраивал все w
с на 1. На стороне растеризатора, неправильно w
Вызывает точки, которые были на больших расстояниях от камеры, чтобы проецироваться в неправильных точках зрения.
Тестовые сферы, которые я использовал, не имели никаких проблем, потому что они имели право w
компоненты.
Редактировать:
Просто подумал, что я бы также упомянул это: нет необходимости извлекать плоскости усеченного вида, чтобы определить, попадают ли проецируемые точки в усеченный вид или нет. Можно просто выполнить эту проверку, определив, все ли x'
, y'
а также z'
компоненты в преобразованной точке (x', y', z', w')
(т.е. после умножения на матрицу P x V x M
) попадают в ассортимент w'
а также -w'
, Если все три компонента попадают в этот диапазон, эта точка является видимой, в противном случае эта точка находится за пределами области видимости.
Других решений пока нет …