我有轮换问题。
我设置了摄像机,使向上矢量为Z,-X为正向,右为Y.我有模型导出到另一个坐标系,其中Y为向上,-Z为向前,X为向右。
我的挑战/问题在于轮换。在这种情况下如何正确旋转而不更改我导入的对象的坐标系。规模和变换正在按预期工作。
到目前为止,我已经尝试在旋转矩阵手册中交换Y轴和Z轴,分别进行旋转矩阵,在读取控制文件时进行旋转,翻转Z和Y旋转轴,将矩阵更改为
| 1 0 0 |
| 0 0 1 |
| 0 1 0 |
等。
PS。我不想更改我现在导入的目标文件的坐标系,当我在控制文件中写入rotateY时,它将在Y轴上旋转对象而不是对象Y轴。
这是我尝试转换的代码的一部分
// control file is where i store transform, rotate and scale in a text file and objects that i want to read.
for(int i = 0; i< controls.size(); i++) {
meshStruct tempMesh;
int isMeshLoaded = loadObjFile((char*)controls[i].path, &tempMesh.objectInfo_, &tempMesh.numObjects_);
if(isMeshLoaded)
{
cout<< "Mesh " << controls[i].path << " loaded sucesfully." << endl;
} else {
cout<< "Mesh " << controls[i].path << " loaded failed." << endl;
}
tempModelMatrix = mat4(1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
//mat4 tempModelMatrixFlip = mat4(1.0f, 0.0f, 0.0f, 0.0f,
// 0.0f, 0.0f, 1.0f, 0.0f,
// 0.0f, 1.0f, 0.0f, 0.0f,
// 0.0f, 0.0f, 0.0f, 1.0f);
//tempModelMatrix *= tempModelMatrixFlip;
tempModelMatrix = glm::translate(tempModelMatrix, controls[i].translate);
tempModelMatrix = glm::rotate(tempModelMatrix, radians(controls[i].rotation.x), vec3(1.0, 0.0, 0.0));
// I dont want to flip here Y and Z because some objects are in the correct coordinate system
tempModelMatrix = glm::rotate(tempModelMatrix, radians(controls[i].rotation.y), vec3(0.0, 1.0, 0.0));
tempModelMatrix = glm::rotate(tempModelMatrix, radians(controls[i].rotation.z), vec3(0.0, 0.0, 1.0));
/*
mat4 r = mat4(1.0f);
mat4 rx = mat4(1.0f);
mat4 ry = mat4(1.0f);
mat4 rz = mat4(1.0f);
rx = rotate(radians(controls[i].rotation.x), vec3(1.0, 0.0, 0.0));
ry = rotate(radians(controls[i].rotation.y), vec3(0.0, 1.0, 0.0));
rz = rotate(radians(controls[i].rotation.z), vec3(0.0, 0.0, 1.0));
r = rx * ry * rz;
vec4 temp;
temp = column(r, 1);
cout << to_string(temp) << endl;
r = column(r,1, column(r, 2));
r = column(r,2, temp);
temp = row(r,1);
r = row(r, 1,row(r,2));
r = row(r, 2, temp);
//cout << to_string(column(tempModelMatrix, 1)) << endl;
//tempModelMatrix *= r;
float tempModelMatrix2[16];// = mat4(1.0f);
tempModelMatrix2[0] = controls[i].scale.x * column(r, 0).x;//controls[i].scale.x * controls[i].rotation.x;
tempModelMatrix2[1] = controls[i].scale.x * column(r, 0).y;//controls[i].scale.x * controls[i].rotation.x;
tempModelMatrix2[2] = controls[i].scale.x * column(r, 0).z;//controls[i].scale.x * controls[i].rotation.x;
tempModelMatrix2[3] = 0.0f;
tempModelMatrix2[4] = controls[i].scale.y * column(r, 2).x;//controls[i].scale.y * controls[i].rotation.y;
tempModelMatrix2[5] = controls[i].scale.y * column(r, 2).y;//controls[i].scale.y * controls[i].rotation.y;
tempModelMatrix2[6] = controls[i].scale.y * column(r, 2).z;//controls[i].scale.y * controls[i].rotation.y;
tempModelMatrix2[7] = 0.0f;
tempModelMatrix2[8] = controls[i].scale.z * column(r, 1).x;//controls[i].scale.z * controls[i].rotation.z;
tempModelMatrix2[9] = controls[i].scale.z * column(r, 1).y;//controls[i].scale.z * controls[i].rotation.z;
tempModelMatrix2[10] = controls[i].scale.z * column(r, 1).z;//controls[i].scale.z * controls[i].rotation.z;
tempModelMatrix2[11] = 0.0f;
tempModelMatrix2[12] = controls[i].translate.x;
tempModelMatrix2[13] = controls[i].translate.y;
tempModelMatrix2[14] = controls[i].translate.z;
tempModelMatrix2[15] = 1.0f;*/
tempModelMatrix = glm::scale(tempModelMatrix, controls[i].scale);
//cout << controls[i].path << " controls[i].translate " << to_string(controls[i].translate) << endl;
//cout << controls[i].path << " controls[i].rotation.X " << controls[i].rotation.x << endl;
//cout << controls[i].path << " controls[i].rotation.y " << controls[i].rotation.y << endl;
//cout << controls[i].path << " controls[i].rotation.Z " << controls[i].rotation.z << endl;
//cout << controls[i].path << " controls[i].scale " << to_string(controls[i].scale) << endl;
string basedir = dirname(controls[i].path);
for(int j = 0; j < tempMesh.numObjects_; j++){
//tempMesh.objectInfo_[j].modelMatrix = controls[i].modelMatrix;
tempMesh.objectInfo_[j].modelMatrix = tempModelMatrix;
//tempMesh.objectInfo_[j].modelMatrix = make_mat4(tempModelMatrix2);
答案 0 :(得分:0)
由于我无法确定您如何存储来自对象的顶点数据,因此我将定义一些简单的内容:
struct Vertex {
glm::vec3 position;
};
struct Mesh {
std::vector<Vertex> vertices;
};
现在遍历所有顶点位置并将它们转换为世界坐标:
Mesh originalMesh = loadObjectFromFile("object.file");
Mesh convertedMesh = Mesh();
for (Vertex v : originalMesh.vertices) {
convertedMesh.push_back(glm::vec3(v.y, v.z, v.x));
}
这里要注意的关键是我们正在进行以下映射:
x = v.y
y = v.z
z = v.x
如果你有其他顶点数据(例如法线,texcoords),请确保它们也被转换。
答案 1 :(得分:0)
通过与教授的一些电子邮件修复了问题,并在计算旋转矩阵时出现了一个小错误。我是以相反的方式做的
tempModelMatrix = glm::rotate(tempModelMatrix, radians(controls[i].rotation.x), vec3(1.0, 0.0, 0.0));
tempModelMatrix = glm::rotate(tempModelMatrix, radians(controls[i].rotation.y), vec3(0.0, 1.0, 0.0));
tempModelMatrix = glm::rotate(tempModelMatrix, radians(controls[i].rotation.z), vec3(0.0, 0.0, 1.0));
而不是
tempModelMatrix = glm::rotate(tempModelMatrix, radians(controls[i].rotation.z), vec3(0.0, 0.0, 1.0));
tempModelMatrix = glm::rotate(tempModelMatrix, radians(controls[i].rotation.y), vec3(0.0, 1.0, 0.0));
tempModelMatrix = glm::rotate(tempModelMatrix, radians(controls[i].rotation.x), vec3(1.0, 0.0, 0.0));
感谢@Exide的建议