gpt4 book ai didi

java - 如何创建逆变换矩阵

转载 作者:搜寻专家 更新时间:2023-11-01 03:26:28 24 4
gpt4 key购买 nike

我正在用 Java 开发一个 OpenGL 项目,我想用自己的代码创建转换矩阵,这样我就可以使用它们进行世界到屏幕的点转换,反之亦然。我已经创建了一个支持转换的 Matrix 类,并且一切正常。但是,我在实际弄清楚如何创建逆变换时遇到了麻烦。

所以我的问题是:

  • 给定一个任意仿射 (4x4) 变换矩阵,如何创建逆变换矩阵?有些矩阵是不可逆的吗?反转变换矩阵有哪些限制和注意事项?

根据我的研究,我听说过各种这样做的方法,最简单的是转置然后取反矩阵。但是,这似乎并没有真正起作用。我听说这种方法对某些矩阵不起作用,甚至有些矩阵是不可逆的。

我正在寻找的不仅仅是“代入这个方程式”的答案,因为我实际上想了解当我反转矩阵时发生了什么。这也不包括“只使用这个库”的答案。将来我可能会转向矩阵库,但现在我想自己创建它。

编辑:在任何人问之前,这不是家庭作业。这是一个个人项目。

编辑:显然这里有一整套计算逆矩阵的策略:http://en.wikipedia.org/wiki/Invertible_matrix

最佳答案

这是我在计算机图形学类(class)中使用的一些代码,基本上我使用 Gauss Jordan 消去法来计算矩阵的逆。对于可逆矩阵,其行列式值必须不等于零。虽然我没有在我的代码中处理这种情况,但我不会为你做所有的事情。

Matrix4* Matrix4::FindInverse(Matrix4 &a){

int n = R;
int i = 0;
int j = 0;
float pivot = 0;
Matrix4* invA = NULL;
//TODO: Check whether the matrix is invertible.Else Return
invA = new Matrix4();
invA->SetMatrix4(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1);


for(i = 0; i < n; i++){
pivot = a.v[i][i];

if(pivot != 1.0 and pivot != 0){
for(int t = i; t < n; t++){
a.v[i][t] = a.v[i][t]/pivot;
invA->v[i][t] = invA->v[i][t]/pivot;
}
}

//Update to the new pivot which must be 1.0
pivot = a.v[i][i];

for(j = 0; j < n; j++){
if( j==i ){
continue;

}
else{
float l = a.v[j][i]/pivot;
for(int m = 0; m < n; m++){
a.v[j][m] = a.v[j][m] - l * a.v[i][m];
invA->v[j][m] = invA->v[j][m] - (l * invA->v[i][m]);
}
}
}
}
return invA;

关于java - 如何创建逆变换矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12715447/

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