我有一个带有加载网格、地平面和天空盒的小场景。我正在生成一个立方体,并使用顶点位置作为立方体贴图纹理坐标。
水平旋转(围绕 y 轴)完美运行,并且世界运动与天空盒对齐。垂直旋转(关于相机的 x 轴)似乎与其他物体的运动不匹配,除了奇怪的是,当相机看着立方体面的中心时,一切似乎都对齐了。换句话说,运动是非线性的,我会尽力用一些图像来说明效果:
首先,据我所知,水平运动是正确的:
面向前方:
在几乎 45 度时面向左:
在 90 度向左:
现在的垂直运动似乎在运动上有一些差异:
再次向前看:
注意这张图片中地平面相对于天空盒的位置。我稍微向左旋转以使太阳在不应该被遮挡的情况下更加明显。
面朝下:
最后,一个直接向上显示视图的视图正确地居中在(天空盒)立方体面上。
正面朝上:
这是我的绘图代码,为简洁起见,省略了地平面和网格图。(请注意,中心的立方体是一个加载的网格,不是由天空盒的相同函数生成的)。
void MeshWidget::draw() {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glRotatef(-rot_[MOVE_CAMERA][1], 0.0f, 1.0f, 0.0f);
glRotatef(-rot_[MOVE_CAMERA][0], 1.0f, 0.0f, 0.0f);
glRotatef(-rot_[MOVE_CAMERA][2], 0.0f, 0.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glUseProgramObjectARB(shader_prog_ids_[2]);
glBindBuffer(GL_ARRAY_BUFFER, SkyBoxVBOID);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vec3), BUFFER_OFFSET(0));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, SkyIndexVBOID);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));
glUseProgramObjectARB(shader_prog_ids_[0]);
glEnable(GL_DEPTH_TEST);
glPopMatrix();
glTranslatef(0.0f, 0.0f, -4.0f + zoom_factor_);
glRotatef(rot_[MOVE_CAMERA][0], 1.0f, 0.0f, 0.0f);
glRotatef(rot_[MOVE_CAMERA][1], 0.0f, 1.0f, 0.0f);
glRotatef(rot_[MOVE_CAMERA][2], 0.0f, 0.0f, 1.0f);
glPushMatrix();
// Transform light to be relative to world, not camera.
glRotatef(rot_[MOVE_LIGHT][1], 0.0f, 1.0f, 0.0f);
glRotatef(rot_[MOVE_LIGHT][0], 1.0f, 0.0f, 0.0f);
glRotatef(rot_[MOVE_LIGHT][2], 0.0f, 0.0f, 1.0f);
float lightpos[] = {10.0f, 0.0f, 0.0f, 1.0f};
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
glPopMatrix();
if (show_ground_) {
// Draw ground...
}
glPushMatrix();
// Transform and draw mesh...
glPopMatrix();
}
最后,这是天空盒的 GLSL 代码,它生成纹理坐标:
顶点着色器:
void main()
{
vec4 vVertex = vec4(gl_ModelViewMatrix * gl_Vertex);
gl_TexCoord[0].xyz = normalize(vVertex).xyz;
gl_TexCoord[0].w = 1.0;
gl_TexCoord[0].x = -gl_TexCoord[0].x;
gl_Position = gl_Vertex;
}
片段着色器:
uniform samplerCube cubeMap;
void main()
{
gl_FragColor = texture(cubeMap, gl_TexCoord[0]);
}
我还想知道对所有相机和对象旋转使用四元数是否会有所帮助。
如果您需要更多信息(或图像),请询问!