Зеркало преобразования матрицы C ++ Direct2D - PullRequest
0 голосов
/ 20 ноября 2011

В настоящее время я изучаю DirectX (SDK от июня 2010 г.) и рисую растровые изображения на экране. Теперь я хочу иметь возможность выполнять преобразования на этих изображениях и не отображать изображения вдоль оси x или y.

Перед рисованием я могу установить матрицу преобразования, которая будет применяться к операциям рисования. Хотя DirectX использует тип D2D1_MATRIX_3x2_F, согласно MSDN, только 2x2 часть этой матрицы используется для преобразований. Например, матрица {[1, 0], [0, 1], [0, 0]} - это единичная матрица, которая заставляет все отображаться естественным образом.

Насколько я понимаю, преобразование матрицы для зеркального отображения моего изображения вдоль оси x должно выглядеть следующим образом: {[1, 0], [0, -1], [0, 0]} и вдоль y ось это тогда будет {[-1, 0], [0, 1], [0, 0]}. Однако, если я использую эти матрицы для преобразования, я получаю черный экран.

Проблема для меня в том, что я застрял на этом этапе, не зная, чем может быть вызвана эта проблема, или, скорее, вызвана ли она логической ошибкой в ​​математике, стоящей за этим, или самой реализацией. К сожалению, я не смог найти никакого материала по этому поводу, кроме однострочного комментария о том, что «зеркальное отображение должно выполняться с матричными преобразованиями» в заголовочном файле Direct2D RenderTarget.

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

D2D1_MATRIX_3X2_F m;
m._11 = 1; m._12 = 0;
m._21 = 0; m._22 = -1;
m._31 = 0; m._32 = 0;
m_pDX2DRenderTarget->SetTransform( m );

1 Ответ

0 голосов
/ 21 ноября 2011

Я полностью ошибся из-за того, что третий ряд матрицы не актуален. Фактически это смещение x- и y- для преобразования. Причина, по которой я ничего не увидел после трансформации, заключается в том, что после применения зеркала зеркальное отражение будет не только само изображение, но и его положение на экране.

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

...