로드 된 메쉬, 지상 비행기 및 스카이 박스가있는 작은 장면이 있습니다. 나는 큐브를 생성하고 있으며 큐브 맵 텍스처 좌표로 정점 위치를 사용하고 있습니다.Skybox가 세계와 동기화되지 않습니다.
수평 회전 (y 축)은 완벽하게 작동하며 세계 움직임은 skybox와 정렬됩니다. 이상한 점은 카메라가 큐브면의 중앙을 볼 때 모든 것이 정렬 된 것처럼 보이지만 수직 회전 (카메라의 x 축 방향)은 다른 물체의 움직임과 일치하지 않는 것처럼 보입니다. 즉, 운동은 비선형 내가 일부 이미지와 효과를 설명하기 위해 최선을 다할 것입니다 :
첫째, 지금까지 내가 말할 수있는 정확한 수평 운동 :
앞으로 직면를 :
거의 45Deg에서 왼쪽에 직면 :
왼쪽에 직면 90DEG에서 :
다시 앞으로 직면 :
공지 사항이 이미지의 스카이 박스 관련하여 접지면의 위치 그리고 지금 보이는 수직 운동은 운동에 약간의 차이가 있습니다. 나는 태양이 가려져서는 안되는 것을 더 분명하게하기 위해 약간 왼쪽으로 돌렸다.
약간 아래를 향 :
마지막으로, 똑바로보기를 표시하는 최대보기 올바르게 (스카이 박스) 큐브의 얼굴을 중심으로. 접지면과,
가 여기 내 드로잉 코드이고 간결하게 생략 그리기 메쉬 :
똑바로 직면. (중앙의 큐브는로드 된 메쉬이며 skybox의 동일한 기능에 의해 생성되지 않습니다.
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]);
}
을 또한 모든 카메라 및 객체 회전에 쿼터니언을 사용하면 도움이 될지 알고 싶습니다.
추가 정보 (또는 이미지)가 필요하면 질문하십시오!
이전에 사용했던 skybox의 텍스처를 뒤집어서 원래 추가 한 x = -x 부분을 제거했습니다. 모든 dds 텍스처가 그런 식으로 포맷되었다고 가정했으나 그 중 특정 것이 었습니다. 당신이 제안 나는 세계 공간 벡터와 뷰 공간 벡터를 대체했지만, 스카이 박스에 관계없이 내 관점의 지금은 정적 배경입니다. 카메라 회전은 내 이해에서 모델보기 행렬에 영향을 미치므로 결과를 기대합니다. – usm