Перспективная проекция - как я проектирую точки, которые находятся позади 'камеры'?

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

Изображение

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

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

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

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

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

9
задан Alex 27 July 2010 в 06:05
поделиться

1 ответ

Вам нужно пересечь линию с передней плоскостью отсечения в трехмерном пространстве и обрезать линию, чтобы нарисовать только видимый сегмент линии:

             |
             |
             |
x------------+-----------o
             |
             |
             |   * - camera
             |
             |
             |
       clipping plane

У вас есть линия xo , где x перед плоскостью отсечения и o за ней. Пересеките эту линию с плоскостью отсечения, чтобы создать точку + . Вы знаете, какой из x и o виден, поэтому проведите линию от x к + .

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

8
ответ дан 4 December 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: