2012-05-31 2 views
0

로드 된 메쉬, 지상 비행기 및 스카이 박스가있는 작은 장면이 있습니다. 나는 큐브를 생성하고 있으며 큐브 맵 텍스처 좌표로 정점 위치를 사용하고 있습니다.Skybox가 세계와 동기화되지 않습니다.

수평 회전 (y 축)은 완벽하게 작동하며 세계 움직임은 skybox와 정렬됩니다. 이상한 점은 카메라가 큐브면의 중앙을 볼 때 모든 것이 정렬 된 것처럼 보이지만 수직 회전 (카메라의 x 축 방향)은 다른 물체의 움직임과 일치하지 않는 것처럼 보입니다. 즉, 운동은 비선형 내가 일부 이미지와 효과를 설명하기 위해 최선을 다할 것입니다 :

첫째, 지금까지 내가 말할 수있는 정확한 수평 운동 :

앞으로 직면를 : Facing forward

거의 45Deg에서 왼쪽에 직면 : Facing left at almost 45Deg

왼쪽에 직면 90DEG에서 : Facing left at 90Deg

다시 앞으로 직면 : Facing forward again

공지 사항이 이미지의 스카이 박스 관련하여 접지면의 위치 그리고 지금 보이는 수직 운동은 운동에 약간의 차이가 있습니다. 나는 태양이 가려져서는 안되는 것을 더 분명하게하기 위해 약간 왼쪽으로 돌렸다.

약간 아래를 향 : Facing slightly down

마지막으로, 똑바로보기를 표시하는 최대보기 올바르게 (스카이 박스) 큐브의 얼굴을 중심으로. 접지면과, Facing straight up

가 여기 내 드로잉 코드이고 간결하게 생략 그리기 메쉬 :

똑바로 직면. (중앙의 큐브는로드 된 메쉬이며 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]); 
} 

을 또한 모든 카메라 및 객체 회전에 쿼터니언을 사용하면 도움이 될지 알고 싶습니다.

추가 정보 (또는 이미지)가 필요하면 질문하십시오!

답변

0

월드 스페이스 벡터 (gl_Vertex?)를 기반으로 skybox 텍스처 룩업을 생성해야한다고 생각합니다. 뷰 공간 벡터 (vVertex)가 아닙니다.

skybox 좌표가 이미 worldspace에 정의되어 있다고 가정합니다. 그리기 전에 모델 행렬 변환이 표시되지 않습니다 (카메라 회전 만).이 경우 꼭지점의 월드 스페이스 위치를 기준으로 스카이 박스 텍스처를 샘플링해야하며 카메라로 변형 할 필요가 없습니다. 카메라로 정점을 이미 변환하고 있으므로 룩업 벡터도 변환 할 필요가 없습니다.

normalize(gl_Vertex)으로 바꾸어보고 개선되는지 확인해보십시오.

또한 x = -x 일을 없애 버릴 수도 있습니다. 텍스처가 원래 잘못된 방향으로 회전하고 있다는 사실을 보완 한 것으로 생각됩니다.

모든 카메라 및 객체 회전에 쿼터니언을 사용하면 도움이 될지 알고 싶습니다.

도움말 방법? 그것은 매트릭스를 사용하는 것 이상의 새로운 기능을 제공하지 않습니다. 매트릭스 또는 쿼터니언이 더 나은 성능을 제공하는지 여부에 대한 두 가지 주장을 들었지만 사용하지 않아도됩니다.

+0

이전에 사용했던 skybox의 텍스처를 뒤집어서 원래 추가 한 x = -x 부분을 제거했습니다. 모든 dds 텍스처가 그런 식으로 포맷되었다고 가정했으나 그 중 특정 것이 었습니다. 당신이 제안 나는 세계 공간 벡터와 뷰 공간 벡터를 대체했지만, 스카이 박스에 관계없이 내 관점의 지금은 정적 배경입니다. 카메라 회전은 내 이해에서 모델보기 행렬에 영향을 미치므로 결과를 기대합니다. – usm

관련 문제