openGL/glut & glm 模型视图矩阵
openGL/glut & glm ModelView Matrix
我一直在为我的一个项目尝试使用模型视图矩阵,但现在我得到了一些意想不到的结果,这阻碍了我的进一步进步。
GameEntity::GameEntity{
view_matrix = glm::lookAt(glm::vec3(0.f, 0.f, 0.f), glm::vec3(0.f, 0.f, 1.f), glm::vec3(0.f, -1.f, 0.f));
//view_matrix = glm::mat4(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0); //glLoadIdentity
//returns this matrix, since model_matrix is identity then this is clean view_matrix?
model_matrix = glm::mat4(1.0f);
}
void GameEntity::Scale(glm::vec3 vector)
{
model_matrix = glm::scale(model_matrix, vector);
}
void GameEntity::getMatrix(GLfloat arr[16])
{
glm::mat4 modelview = view_matrix * model_matrix;
for (int i = 0; i < 4; i++){
arr[i] = modelview[i][0];
arr[i+1] = modelview[i][1];
arr[i+2] = modelview[i][2];
arr[i+3] = modelview[i][3];
}
}
现在预期的结果是矩阵(这是我从 glLoadIdentity 和 glScale(0.3,0.3,1.0) 得到的结果)
[ 0.3, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.3 ]
[ 0.0, 0.0, 0.3, 0.0 ]
但在缩放之后我得到了矩阵(右边是使用直接输入的 view_matrix,GameEntity 注释代码)
[ 0.3, 0.0, 0.0, 0.0 ] [ 0.3, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.0 ] [ 0.0, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.0 ] [ 0.0, 0.0, 0.0, 1.0 ]
[ 0.0, 0.0, 0.0, 1.0 ] [ 0.0, 0.0, 1.0, 0.0 ]
在第一个矩阵中,我将圆展平为双线,第二个在单轴上展开。知道我做错了什么吗?
您的获取矩阵函数有误。当你遍历循环时,你没有跳过 arr 中正确数量的元素,第一次迭代是
arr[0] = modelview[0][0];
arr[1] = modelview[0][1];
arr[2] = modelview[0][2];
arr[3] = modelview[0][3];
第二个
arr[1] = modelview[1][0];
arr[2] = modelview[1][1];
arr[3] = modelview[1][2];
arr[4] = modelview[1][3];
等等。您必须使用
来解决这个问题
for (int i = 0; i < 4; i++) {
arr[4*i ] = modelview[i][0];
arr[4*i+1] = modelview[i][1];
arr[4*i+2] = modelview[i][2];
arr[4*i+3] = modelview[i][3];
}
顺便说一句:您为什么要为 getMatrix
原型中的引用烦恼?显然您想在这里使用纯 C 数组,因此只需使用指针(或大小数组函数参数类型,其作用类似于指针)。 void GameEntity::getMatrix(GLfloat arr[16])
效果一样好,而且更容易阅读。在那里使用指针绝对没有任何好处。
我一直在为我的一个项目尝试使用模型视图矩阵,但现在我得到了一些意想不到的结果,这阻碍了我的进一步进步。
GameEntity::GameEntity{
view_matrix = glm::lookAt(glm::vec3(0.f, 0.f, 0.f), glm::vec3(0.f, 0.f, 1.f), glm::vec3(0.f, -1.f, 0.f));
//view_matrix = glm::mat4(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0); //glLoadIdentity
//returns this matrix, since model_matrix is identity then this is clean view_matrix?
model_matrix = glm::mat4(1.0f);
}
void GameEntity::Scale(glm::vec3 vector)
{
model_matrix = glm::scale(model_matrix, vector);
}
void GameEntity::getMatrix(GLfloat arr[16])
{
glm::mat4 modelview = view_matrix * model_matrix;
for (int i = 0; i < 4; i++){
arr[i] = modelview[i][0];
arr[i+1] = modelview[i][1];
arr[i+2] = modelview[i][2];
arr[i+3] = modelview[i][3];
}
}
现在预期的结果是矩阵(这是我从 glLoadIdentity 和 glScale(0.3,0.3,1.0) 得到的结果)
[ 0.3, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.3 ]
[ 0.0, 0.0, 0.3, 0.0 ]
但在缩放之后我得到了矩阵(右边是使用直接输入的 view_matrix,GameEntity 注释代码)
[ 0.3, 0.0, 0.0, 0.0 ] [ 0.3, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.0 ] [ 0.0, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.0 ] [ 0.0, 0.0, 0.0, 1.0 ]
[ 0.0, 0.0, 0.0, 1.0 ] [ 0.0, 0.0, 1.0, 0.0 ]
在第一个矩阵中,我将圆展平为双线,第二个在单轴上展开。知道我做错了什么吗?
您的获取矩阵函数有误。当你遍历循环时,你没有跳过 arr 中正确数量的元素,第一次迭代是
arr[0] = modelview[0][0];
arr[1] = modelview[0][1];
arr[2] = modelview[0][2];
arr[3] = modelview[0][3];
第二个
arr[1] = modelview[1][0];
arr[2] = modelview[1][1];
arr[3] = modelview[1][2];
arr[4] = modelview[1][3];
等等。您必须使用
来解决这个问题for (int i = 0; i < 4; i++) {
arr[4*i ] = modelview[i][0];
arr[4*i+1] = modelview[i][1];
arr[4*i+2] = modelview[i][2];
arr[4*i+3] = modelview[i][3];
}
顺便说一句:您为什么要为 getMatrix
原型中的引用烦恼?显然您想在这里使用纯 C 数组,因此只需使用指针(或大小数组函数参数类型,其作用类似于指针)。 void GameEntity::getMatrix(GLfloat arr[16])
效果一样好,而且更容易阅读。在那里使用指针绝对没有任何好处。