2010-07-25 4 views
8

Я пишу свое собственное программное обеспечение растеризатору в Java, и я побежал в неприятности с ним ... посмотрите на образец изображения, пожалуйста:Перспективная проекция - как мне проектировать точки, которые находятся за «камерой»?

Image

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

Мои матрицы преобразования и векторы такие же, что и 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 статья на MSDN.

К сожалению, мне не повезло с этим (такие же результаты), поэтому любая помощь будет высоко оценена, так как я немного застрял на этом.

спасибо.

С наилучшими пожеланиями, Alex

+0

Правильно ли вы устанавливаете переднюю плоскость отсечения вашей камеры? И затем принимая это во внимание при рендеринге? – ChrisF

+0

Моя плоскость zNear установлена ​​в 1, а плоскость zFar - 1000 единиц. Я попытался изменить значения, но проблема сохраняется. Какие-либо предложения? – Alex

+0

Прошло некоторое время с тех пор, как я это делал, но вам нужно выполнить пересечение с передней плоскостью отсечения * до * проецирования линии. – ChrisF

ответ

7

Вы должны пересекать линию с передней подрезки плоскости в 3D пространстве и укоротить линию, так что вы только нарисовать отрезок линии, что это видно:

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

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

Таким образом, вы не проецируете точки, расположенные за камерой.

+1

Спасибо.Является ли это нормально, если я делаю это в пространстве клипов, после преобразования перспективы, перед разделением перспективы (используя однородные координаты и w)? – Alex

+2

Да непременно. –

Смежные вопросы