繁体   English   中英

C ++矩阵向量乘法

[英]C++ matrix-vector multiplication

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

result = mul(matrix, vector);

这显然意味着:

result = mul(vector, matrix_transposed);

另外,仅提及,为简化起见,大多数线性代数库倾向于仅保留vector * matrix乘法运算。


现在:假设我想使用一些具体的矩阵 例如 ,让我们使用D3DX矩阵运算)来变换某些vector (例如位置 因此,我构造了简单的世界视图投影矩阵,然后将其传递给我的着色器。

  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)

为了使这种转换起作用(向量从矩阵的左侧乘以)。

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

我哪里错了?

谢谢。


更多信息D3DX矩阵具有以行为主的对齐方式,我正在使用相应的函数,该函数cgSetMatrixParameterfr 主的矩阵作为参数(在我的特殊情况下为cgSetMatrixParameterfr )。

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

数学上(以及编程中)的惯例是,您将向量乘以右起的线性变换: matrix * vector == transformed vector 所以我不明白你的抱怨。 矩阵已设置为正确的矩阵。 如果要从左侧乘以矢量, 需要对矩阵进行转置: result = mul(vector, transpose(wvp))

编辑:好的,Direct3D实际上做相反的事情。 它将左侧的向量相乘(将它们作为行而不是列进行处理)。 例如,OpenGL像普通人一样从右边复制。 因此,您需要将转置矩阵加载到cg程序中。

如果两个矩阵都是对角线,正方形并且大小相同,则乘法是可交换的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM