2013-04-08 3 views
0

Я хотел бы сделать 2D-геометрию с помощью DirectX (11) и попытался сделать это, создав файл эффектов, который вообще не преобразует вершины - это то, где вы обычно применяете ваша матрица мира/представления/проекции Я просто возвращаю (нетрансформированный) вход.Использование конвейера DirectX для 2D-рендеринга

Это работало так, как ожидалось, и мой квадрат был правильно изображен на поверхности. Затем я попытался преобразовать его с переводом (в 2D) вдоль оси X и получил некоторые странные изменения перспективы.

Взаимодействие с Google Я вижу, как люди говорят об использовании матриц ортогонального преобразования, но не понимают, почему - я не хочу преобразовывать общие 3d-данные в 2d, я хотел бы сделать преобразование идентичности двухдисковых данных в 2d (и, возможно, 2d translate/scale too)

У меня такое чувство, что я пропустил что-то важное о трубопроводе?

Любая помощь оценили

+0

вы используете Direct3D или Direct2D? – Rafael

+0

Direct3D - возможно ли это, что я захочу сделать 2D и 3D с одного и того же устройства/буфера в будущем? – user2152466

+0

@ user2152466 Почему бы вам не вставить свой код? – zdd

ответ

1

Я думаю, что вы, вероятно, забыли назвать m.Transpose() на вашей матрице преобразования после окончания строительства, но перед назначением его на устройство

1

Матрица проекции, которую вы используете в аксонометрии матрица, которая дает перспективу. Это прекрасно, когда вы работаете в 3D, но когда вы хотите визуализировать 2D (например, для визуализации графического интерфейса), вы не хотите добавлять перспективу.

Ортогональная матрица - это матрица, которая в основном игнорирует перспективу, так что объекты на расстоянии столь же велики, как близкие.

Разница между ними может быть визуализированы как следует, если вы рисуете коробку (куб с верхней отсутствует):

Perspective vs Orthigonal 
O---------O    O---------O 
|\  /|    |   | 
| o-----o |    |   | 
| |  | |    |   | 
| o-----o |    |   | 
|/  \|    |   | 
O---------O    O---------O 

Так что происходит в вашем случае? Ну, объекты, которые находятся вне центра вашего экрана, естественно, находятся дальше от объектов, находящихся вблизи центра вашего экрана. Из-за этого они приближаются.

Пример:

A  B  C  Point A (-5, 0, 5) 
\  | /  Point B (0, 0, 5) 
    \ | /  Point C (5, 0, 5) 
    \ | /  
    \ |/  
    \ |/ 
     \|/ 
     V 

Как можно видеть точку А и В еще дальше. Если мы будем использовать действительно основной точки зрения (это более сложный, но достаточно в качестве примера), чтобы вычислить, где каждая точка придет на экране, то мы будем использовать следующую формулу:

Vector2 Perspective(Vector3 pos) 
{ 
    return Vector2(pos.x, pos.y)/pos.length(); 
} 

Теперь ортогональная матрица будет больше вдоль линий следующего:

Vector2 Orthogonal(Vector3 pos) 
{ 
    return Vector2(pos.x, pos.y); 
} 

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

+0

спасибо, но я не использую перспективную матрицу - я использую идентификационную матрицу (а не ортогональные матрицы DirectX). Я не понимаю, зачем вам нужна ортогональная матрица над единичной матрицей для 2D-рендеринга или какая разница? – user2152466

+0

Попробуйте визуализировать полноэкранный квадрат, который содержит точки [0,9 0,9] и [-0,9 -0.9], если это дает вам квадрат, заполняющий весь экран, кроме внешней границы, тогда вы ** не имеете проблем с перспективой, но ваши изображения просто растянуты. Если это так, просто используйте ортогональную матрицу, вход которой равен внутренней части вашего окна (ака области рисования). Это должно решить эффект растяжения. – DevWouter

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