Я пишу свое собственное программное обеспечение растеризатору в 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.
К сожалению, мне не повезло с этим (такие же результаты), поэтому любая помощь будет высоко оценена, так как я немного застрял на этом.
спасибо.
С наилучшими пожеланиями, Alex
Правильно ли вы устанавливаете переднюю плоскость отсечения вашей камеры? И затем принимая это во внимание при рендеринге? – ChrisF
Моя плоскость zNear установлена в 1, а плоскость zFar - 1000 единиц. Я попытался изменить значения, но проблема сохраняется. Какие-либо предложения? – Alex
Прошло некоторое время с тех пор, как я это делал, но вам нужно выполнить пересечение с передней плоскостью отсечения * до * проецирования линии. – ChrisF