Mat4x4の要素を取得する方法
たあし  2025/03/18(Tue) 09:01
お世話になっております。

3D計算で、4x4行列からXYZ軸のベクトルを取り出して変更する処理を作っています。
Mat4x4行列の値をどのように取得すればいいでしょうか?

Mat3x3は_11から_33のメンバがあり容易に取得できるのですが、Mat4x4は要素のメンバが見当たりません。
valueからXMMATRIX型を取得できるので、XMFLOAT4x4に変換して取得できますが、もっといい方法はあるでしょうか?
記事編集
Reputeless  2025/03/18(Tue) 13:32
DirectX::XMFLOAT4X4 を使うのが最も簡単だと思います。

s3d::Mat4x4 あるいは DirectX::XMMATRIX は、SIMD に最適化するために __m128[4] で構成されていて、SIMD 処理を阻害するような「簡単なコード」(例えば個別の要素にアクセスするなど)はもともと書けない仕様になっています。

場合によっては __m128 と Float4 の変換を行う s3d::SIMD_Float4 が便利かもしれません。


# include <Siv3D.hpp>

void Main()
{
Mat4x4 mat = Mat4x4::Identity();

for (int32 i = 0; i < 4; ++i)
{
Float4 r = SIMD_Float4{ mat.value.r[i] }.toFloat4();
r *= 2.0f;
mat.value.r[i] = SIMD_Float4{ r };
}

for (int32 i = 0; i < 4; ++i)
{
const Float4 r = SIMD_Float4{ mat.value.r[i] }.toFloat4();
Print << r;
}

//for (int32 i = 0; i < 4; ++i)
//{
// DirectX::XMVectorScale(mat.value.r[i], 2.0f);
//}

//for (int32 i = 0; i < 4; ++i)
//{
// DirectX::XMFLOAT4A r;
// DirectX::XMStoreFloat4(&r, mat.value.r[i]);
// Print << Float4{ r.x, r.y, r.z, r.w };
//}

while (System::Update())
{

}
}
編集
たあし  2025/03/19(Wed) 14:51
いつもありがとうございます。

なるほど、ハードウェアに合わせた仕様ということですね。
SIMD_Float4という便利な命令があったのですね。これを使うと少しスマートにできそうです。
分かりやすい例もありがとうございました。活用してみます。
編集
件名
Re: Mat4x4の要素を取得する方法
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -