C++ Skybox的旋转与世界不同步

C++ Skybox的旋转与世界不同步,c++,opengl,glsl,C++,Opengl,Glsl,我有一个小场景,有一个加载的网格,一个地平面和一个天空盒。我正在生成一个立方体,并使用顶点位置作为立方体贴图纹理坐标 水平旋转(围绕y轴)工作正常,世界运动与skybox对齐。垂直旋转(围绕摄影机的x轴)似乎与其他对象的移动不匹配,但奇怪的是,当摄影机注视立方体面的中心时,所有对象似乎都对齐。换句话说,运动是非线性的,我将尽力用一些图像来说明效果: 首先,据我所知,水平运动是正确的: 面向未来: 以接近45度的角度面向左侧: 以90度面向左侧: 现在垂直运动似乎在运动上有一些差异: 再次向前

我有一个小场景,有一个加载的网格,一个地平面和一个天空盒。我正在生成一个立方体,并使用顶点位置作为立方体贴图纹理坐标

水平旋转(围绕y轴)工作正常,世界运动与skybox对齐。垂直旋转(围绕摄影机的x轴)似乎与其他对象的移动不匹配,但奇怪的是,当摄影机注视立方体面的中心时,所有对象似乎都对齐。换句话说,运动是非线性的,我将尽力用一些图像来说明效果:

首先,据我所知,水平运动是正确的:

面向未来:

以接近45度的角度面向左侧:

以90度面向左侧:

现在垂直运动似乎在运动上有一些差异:

再次向前看:

请注意此图像中地平面相对于天空盒的位置。我稍微向左旋转,以使太阳在不应该被遮挡的情况下被遮挡得更加明显

面朝下:

最后,一个向上的视图显示视图正确地位于(skybox)立方体面的中心

面朝上:

这是我的绘图代码,为了简洁起见,省略了地平面和网格绘图。(请注意,中心的立方体是加载的网格,并且不是由skybox的相同函数生成的)

最后,这里是skybox的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]);
}
我还想知道对所有相机和对象旋转使用四元数是否会有所帮助


如果您需要更多信息(或图片),请咨询

我认为您应该基于世界空间向量(gl_顶点?)而不是视图空间向量(vVertex)生成skybox纹理查找

我假设您的skybox坐标已经在worldspace中定义,因为在绘制之前我没有看到模型矩阵变换(只有摄影机旋转)。在这种情况下,您应该基于顶点的世界空间位置对skybox纹理进行采样,它不需要由摄影机进行变换。您已经在通过摄影机平移顶点,不需要同时平移查找向量

尝试将
normalize(vVertex)
替换为
normalize(gl\u-Vertex)
,看看这是否能改善情况

另外,我可能会去掉x=-x的东西,我怀疑这是为了补偿纹理最初旋转方向错误的事实

我还想知道对所有相机和对象旋转使用四元数是否会有所帮助


怎么帮?与使用矩阵相比,它不提供任何新功能。关于矩阵或四元数是否具有更好的性能,我听到了两种观点,但我认为没有必要使用它们。

我删除了x=-x部分,我最初添加该部分是因为我以前使用的skybox中的翻转纹理-我假设所有dds纹理都是以这种方式格式化的,但事实证明它就是那个特定的部分。正如您所建议的,我已将视图空间向量替换为世界空间向量,但无论我的视点如何,skybox现在都是静态背景。从我的理解来看,摄影机旋转确实会影响模型视图矩阵,因此我期望得到这样的结果。
uniform samplerCube cubeMap;

void main()
{
    gl_FragColor = texture(cubeMap, gl_TexCoord[0]);
}