почему XMMatrixInverse () имеет параметр pDeterminant? - PullRequest
0 голосов
/ 01 июня 2019
XMMATRIX XM_CALLCONV XMMatrixInverse(XMVECTOR *pDeterminant, FXMMATRIX M);

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

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

orig matrix -> cofactor matrix -> adjoint matrix
orig matrix -> det[orig matrix]
inverse = adjoint/det

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

1 Ответ

1 голос
/ 03 июня 2019

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

Таким образом, функция может возвращать этот определитель, если у вас есть для него другое использование. Как отмечено в комментариях к вашему вопросу, pDeterminant был обязательным параметром out в xboxmath / XNAMath до 2.04,

XMMATRIX XMMatrixInverse(_Out_ XMVECTOR* pDeterminant, CXMMATRIX M);

но я сделал его необязательным в DirectXMath, как указано в аннотации SAL :

XMMATRIX XM_CALLCONV XMMatrixInverse(_Out_opt_ XMVECTOR* pDeterminant, _In_ FXMMATRIX M);

Так что вы можете сделать:

XMMATRIX mat = …

// Don't care about the determinant
XMMATRIX imat = XMMatrixInverse(nullptr, mat);

// Want the determinant
XMVECTOR d;
XMMATRIX imat = XMMatrixInverse(&d, mat);

XNAMath 2.04 был выпуском только для Интернета, предназначенным для более точного соответствия с некоторыми изменениями, внесенными мной в DirectXMath, чтобы помочь с переходом с Xbox 360 и устаревшего DirectX SDK . Смотрите это сообщение в блоге .

Поскольку вы новичок в DirectX, вам следует взглянуть на Набор инструментов DirectX для DX11 / DX12 и SimpleMath в частности, оболочка для DirectXMath.

...