Я пишу свой собственный растрирующий процессор программного обеспечения в Java, и я столкнулся с некоторой проблемой с ним... смотрят на демонстрационное изображение:
Этот образец просто тянет сетку простого квадрата на плоскости. Все хорошо работает, пока я не перемещаю камеру достаточно близко, чтобы некоторые точки переместились позади нее. После этого они больше не проектируются правильно, как Вы видите (вертикальные строки - точки, которые должны быть позади камеры, спроектированы сверху экрана).
Мои матрицы преобразования и векторы являются теми же, которые DirectX использует (PerspectiveFovLH для проекции, LookAtLH для камеры).
Я использую следующий метод преобразования для точки проекта 3D:
После этого точка преобразовывается для экранирования использования в соответствии с методом:
// 'vector' is input vector in projection space
// projection to screen
double vX = vector.x / vector.z;
double vY = vector.y / vector.z;
//translate
//surfaceW is width and surfaceH is height of the rendering window.
vX = (( vX + 1.0f) / 2.0f) * surfaceW;
vY = ((-vY + 1.0f) / 2.0f) * surfaceH;
return new Vector3(vX, vY, vector.z);
Как я сказал ранее, это хорошо работает до перемещений точки позади камеры. Факт, я могу выяснить, когда точка находится позади камеры (путем тестирования, это - значение Z после заключительного преобразования), но так как я провожу линии и другие основанные на строке объекты, я не могу только пропустить ту точку.
Затем я пытался установить свой конвейер преобразования в соответствии со статьей Direct3D Transformation Pipeline о MSDN.
К сожалению, у меня не было удачи с тем также (те же результаты), таким образом, любая справка высоко ценилась бы, так как я немного застреваю на этом.
Спасибо.
С наилучшими пожеланиями, Alex
Вам нужно пересечь линию с передней плоскостью отсечения в трехмерном пространстве и обрезать линию, чтобы нарисовать только видимый сегмент линии:
|
|
|
x------------+-----------o
|
|
| * - camera
|
|
|
clipping plane
У вас есть линия xo
, где x
перед плоскостью отсечения и o
за ней. Пересеките эту линию с плоскостью отсечения, чтобы создать точку +
. Вы знаете, какой из x
и o
виден, поэтому проведите линию от x
к +
.
Таким образом вы не проецируете точки, находящиеся за камерой.