gpt4 book ai didi

C++ 矩阵 vector 乘法

转载 作者:行者123 更新时间:2023-11-28 03:55:37 26 4
gpt4 key购买 nike

在处理 3d 图形时,样本着色器通常使用以下操作进行 vector 位置转换:

result = mul(matrix, vector);

这显然意味着:

result = mul(vector, matrix_transposed);

另外,顺便提一下,为了简单起见,大多数线性代数库更愿意只保留vector * matrix 乘法运算。


现在: 假设我想转换一些 vector (例如位置),使用一些具体矩阵(具体来说,让我们使用D3DX矩阵运算)。因此,我构建了简单的world-view-projection 矩阵,然后将其传递给我的着色器。

  D3DXMatrixRotationX(&world, 0.05f);

D3DXMatrixLookAtLH(&view, &D3DXVECTOR3(400.0f, 80.0f, 0.0f),
&D3DXVECTOR3(0.1f, 0.1f, 0.0f),
&D3DXVECTOR3(0.0f, 1.0f, 0.0f));

D3DXMatrixPerspectiveFovLH(&projection, 0.5f, 800.0f / 600.0f, 1.0f, 1500.0f);

D3DXMATRIX wvp = world * view * projection;

Set Shader Parameter (wvp); // Pseudocode here

问题:


这是我无法理解的部分 - 如果这样做,着色器代码应该是

result = mul(vector, wvp)

为使此转换生效( vector 从矩阵的左侧相乘)。

为什么会这样?大多数样本着色器如何在它们内部进行result = mul(wvp, vector)转换(并且它们不转置矩阵,然后设置它作为参数)?

我哪里错了?

谢谢。


更多信息 - D3DX 矩阵具有行优先对齐,我正在使用相应的函数,它采用行优先矩阵作为参数(cgSetMatrixParameterfr 在我的特殊情况下)。

当然,我可以通过调用函数 cgSetMatrixParameterfc 来“转置”该矩阵,该函数将输入数据视为列主矩阵(并“自动”转置 它),但那将是荒谬的。

最佳答案

数学(以及编程)中的惯例是将 vector 乘以从右边开始的线性变换:matrix * vector == transformed vector。所以我不明白你的提示。矩阵已经设置为正确的。如果你想从左边乘以 vector 那么你需要转置矩阵:result = mul(vector, transpose(wvp))

编辑: 好吧,Direct3D 实际上做了相反的事情。它从左边乘以 vector (将它们视为行而不是列)。例如,OpenGL 像普通人一样从右边开始乘法。所以需要将转置矩阵加载到cg程序中。

关于C++ 矩阵 vector 乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3752638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com