Перспективная проекция-как проецировать точки, которые находятся за "камерой"?

Я пишу свой собственный программный растризатор на Java, и у меня возникли проблемы с ним... взгляните на образец изображения, пожалуйста:

изображения

этот образец просто нарисуйте простую квадратную сетку на плоскости. Все работает нормально, пока я не перемещаю камеру достаточно близко, чтобы некоторые точки двигались за ней. После этого они больше не проецируются правильно, как вы можете видеть (вертикальные линии-точки, которые должны быть за камерой, проецируются поверх экран.)

мои преобразования матриц и векторов, одинаковых с DirectX использует (PerspectiveFovLH для проекции, LookAtLH для камеры).

Я использую следующий метод преобразования для проецирования 3D-точки:

    3D вектор для преобразования.
  1. вектор умножается на матрицу ViewProjection.
  2. после этого точка преобразуется в экран, используя следующее метод:

    // '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 +.

таким образом, вы не проецирование точек, которые находятся за камерой.