C++ glm Opengl 使用 glm::mat4 变换和旋转 glm::vec4
C++ glm Opengl Transforming and rotating a glm::vec4 with glm::mat4
所以我正在尝试为我的批处理渲染系统翻译 CPU 上的顶点。我试图复制 glsl 但它根本不起作用。 (模型没有出现)
glm::vec4 off = glm::vec4(0, 0, 0, 1);
off = Util::createTransform(offset, glm::vec3(0, 45, 0)) * off; //translated the vertex by the offset(supplied by the function) and rotates by 45 degrees on the Y axis
for (int i = 0; i < Tvertex.size(); i++) {
Tvertex[i] *= glm::vec3(off.x, off.y, off.z); //I think its here I might have messed up?
}
这里是 "Util::createTransform" 函数:
glm::mat4 Util::createTransform(glm::vec3 pos, glm::vec3 rot) {
glm::mat4 trans = glm::mat4(1.0);
trans = glm::rotate(trans, glm::radians(rot.x), glm::vec3(1, 0, 0));
trans = glm::rotate(trans, glm::radians(rot.y), glm::vec3(0, 1, 0));
trans = glm::rotate(trans, glm::radians(rot.z), glm::vec3(0, 0, 1));
trans = glm::translate(trans, pos);
return trans;
}
那么,我哪里搞砸了?
这个怎么样:
// I think its here I might have messed up?
Tvertex[i] *= glm::vec3(off.x, off.y, off.z);
// I think that might be what you wanted:
Tvertex[i] += glm::vec3(off.x, off.y, off.z);
Util::createTransform()
returns a glm::mat4
,而您只需将该矩阵的最右边的列存储在 glm::vec4
.
中
您正在尝试创建一个表示旋转和平移组合的变换矩阵。此操作不能由单个 vec4
表示。您可以单独为 translation 执行此操作,然后只需将相同的向量添加到所有顶点以平移周围的偏移量。但是,对于旋转 - 或除平移之外的其他转换 - 您将需要完整的矩阵。
由于 glm
使用旧 "fixed function" GL 使用的相同约定,您必须使用 Matrix * Vector 乘法顺序将变换矩阵应用于顶点。所以你的代码应该是这样的:
glm::mat4 off = Util::createTransform(offset, glm::vec3(0, 45, 0)) * off; //translated the vertex by the offset(supplied by the function) and rotates by 45 degrees on the Y axis
for (int i = 0; i < Tvertex.size(); i++) {
Tvertex[i] = off * Tvertex[i];
}
所以我正在尝试为我的批处理渲染系统翻译 CPU 上的顶点。我试图复制 glsl 但它根本不起作用。 (模型没有出现)
glm::vec4 off = glm::vec4(0, 0, 0, 1);
off = Util::createTransform(offset, glm::vec3(0, 45, 0)) * off; //translated the vertex by the offset(supplied by the function) and rotates by 45 degrees on the Y axis
for (int i = 0; i < Tvertex.size(); i++) {
Tvertex[i] *= glm::vec3(off.x, off.y, off.z); //I think its here I might have messed up?
}
这里是 "Util::createTransform" 函数:
glm::mat4 Util::createTransform(glm::vec3 pos, glm::vec3 rot) {
glm::mat4 trans = glm::mat4(1.0);
trans = glm::rotate(trans, glm::radians(rot.x), glm::vec3(1, 0, 0));
trans = glm::rotate(trans, glm::radians(rot.y), glm::vec3(0, 1, 0));
trans = glm::rotate(trans, glm::radians(rot.z), glm::vec3(0, 0, 1));
trans = glm::translate(trans, pos);
return trans;
}
那么,我哪里搞砸了?
这个怎么样:
// I think its here I might have messed up?
Tvertex[i] *= glm::vec3(off.x, off.y, off.z);
// I think that might be what you wanted:
Tvertex[i] += glm::vec3(off.x, off.y, off.z);
Util::createTransform()
returns a glm::mat4
,而您只需将该矩阵的最右边的列存储在 glm::vec4
.
您正在尝试创建一个表示旋转和平移组合的变换矩阵。此操作不能由单个 vec4
表示。您可以单独为 translation 执行此操作,然后只需将相同的向量添加到所有顶点以平移周围的偏移量。但是,对于旋转 - 或除平移之外的其他转换 - 您将需要完整的矩阵。
由于 glm
使用旧 "fixed function" GL 使用的相同约定,您必须使用 Matrix * Vector 乘法顺序将变换矩阵应用于顶点。所以你的代码应该是这样的:
glm::mat4 off = Util::createTransform(offset, glm::vec3(0, 45, 0)) * off; //translated the vertex by the offset(supplied by the function) and rotates by 45 degrees on the Y axis
for (int i = 0; i < Tvertex.size(); i++) {
Tvertex[i] = off * Tvertex[i];
}