Перспективная проекция-как проецировать точки, которые находятся за "камерой"?
Я пишу свой собственный программный растризатор на Java, и у меня возникли проблемы с ним... взгляните на образец изображения, пожалуйста:
этот образец просто нарисуйте простую квадратную сетку на плоскости. Все работает нормально, пока я не перемещаю камеру достаточно близко, чтобы некоторые точки двигались за ней. После этого они больше не проецируются правильно, как вы можете видеть (вертикальные линии-точки, которые должны быть за камерой, проецируются поверх экран.)
мои преобразования матриц и векторов, одинаковых с DirectX использует (PerspectiveFovLH для проекции, LookAtLH для камеры).
Я использую следующий метод преобразования для проецирования 3D-точки:
- 3D вектор для преобразования.
- вектор умножается на матрицу ViewProjection.
-
после этого точка преобразуется в экран, используя следующее метод:
// '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 статьи о В MSDN.
к сожалению, мне не повезло с этим (те же результаты), поэтому любая помощь будет высоко оценена, так как я немного застрял на этом.
спасибо.
С Наилучшими Пожеланиями, Алекс!--2-->
1 ответов
вам нужно пересечь линию с передней плоскостью отсечения в 3d-пространстве и усечь линию, чтобы нарисовать только видимый сегмент линии:
|
|
|
x------------+-----------o
|
|
| * - camera
|
|
|
clipping plane
у вас есть строка xo
здесь x
перед плоскостью отсечения и o
позади него. Пересеките эту линию с плоскостью отсечения, чтобы сгенерировать точку +
. Ты знаешь, который из x
и o
видно так нарисуйте линию от x
to +
.
таким образом, вы не проецирование точек, которые находятся за камерой.