2011-08-29 6 views
5

우선, 나는 그런 긴 질문에 사과하고 싶다. 당신은 그것을 읽을 필요가 없습니다. 질문으로 바로 갈 수도 있고, 필요한 경우 세부 정보를 찾아 볼 수도 있습니다 (가능한 한 많은 정보를 제공하려고 노력했습니다. 내 경험이 너무 많아서 코드가 너무 적어 졌기 때문입니다). 그래서, ...삼각형 권선과 변형에 대해 혼동을 느낀다

저는 삼각형 권선과 변형에 대해 다소 혼란 스럽습니다. 당신이 코멘트에서 볼 수 있듯이, 나는 용어를 사용

float face_colors[nFaces * dim] = 
{ 
    1,0,0, //front RED 
    1,1,1, //back WHITE 
    0,0,1, //up BLUE 
    0,1,1, //down SKY BLUE 
    0,1,0, //right GREEN 
    1,1,0, //left YELLOW 
}; 

: 나는 다음과 같이 정의 된 큐브 그리기 위해 노력하고 있어요 :

const float a = 0.5f; //half of the cube side length 
    float positions[nComponents] = 
    { 
     //front face 
     -a, -a, -a, 
     a, -a, -a, 
     a, a, -a, 

     -a, -a, -a, 
     a, a, -a, 
     -a, a, -a, 

     //back face 
     -a, -a, a, 
     a, a, a, 
     a, -a, a, 

     -a, -a, a, 
     -a, a, a, 
     a, a, a, 

     //up face 
     -a, a, -a, 
     a, a, -a, 
     a, a, a, 

     -a, a, -a, 
     a, a, a, 
     -a, a, a, 

     //down face 
     -a, -a, -a, 
     a, -a, a, 
     a, -a, -a, 

     -a, -a, -a, 
     -a, -a, a, 
     a, -a, a, 

     //right face 
     a, -a, -a, 
     a, -a, a, 
     a, a, a, 

     a, -a, -a, 
     a, a, a, 
     a, a, -a, 

     //left face 
     -a, -a, -a, 
     -a, a, a, 
     -a, -a, a, 

     -a, -a, -a, 
     -a, a, -a, 
     -a, a, a, 
    }; 

을 그리고이 내 얼굴의 가정 색상입니다 아래쪽, 왼쪽, 오른쪽 등등.이 단어는 우리가 위치 좌표 (예 : (0, 0, -3a), 세계 좌표)에서 큐브를보고 있다고 가정하면 의미를 갖습니다. 알다시피, 내 입방체의 앞면이 시계 반대 방향으로 감겨져 있습니다. (즉, 큐브의 바깥 쪽에서 입방체를보고 삼각형의 정점을 열거하면 반 시계 방향으로 감기가됩니다) .

그래서 필요합니다. 컬링을 사용하도록 설정합니다. 2. 반 시계 방향으로 앞면이라고 말합니다. 3. 뒤쪽면을 컬합니다.

glEnable(GL_DEPTH_TEST); 
glEnable(GL_CULL_FACE); 
glFrontFace(GL_CCW); 
glCullFace(GL_BACK); 

내 투영 매트릭스는 투시 투영 매트릭스이며 modelView 매트릭스는 LookAt 매트릭스입니다. 그들은 정점 쉐이더에 유니폼으로 공급됩니다. 다음

ProjectionMatrix = glm::perspective(45.0f, (float)w/h, 0.1f, 100.0f); 
glm::vec3 center(0.0f, 0.0f, 0.0f); 
glm::vec3 eye(1.0f, 2.0f, -3.0f); 
glm::vec3 up(0.0f, 1.0f, 0.0f); 
ModelViewMatrix = glm::lookAt(eye, center, up); 
glUniformMatrix4fv(locP, 1, false, glm::value_ptr(ProjectionMatrix)); 
glUniformMatrix4fv(locMV, 1, false, glm::value_ptr(ModelViewMatrix)); 

내 정점 셰이더 정의된다

#version 400 
layout(location = 0) in vec4 vVertex; 
layout(location = 1) in vec4 vColor; 
uniform mat4 P; 
uniform mat4 MV; 
out vec4 vFragColor; 
void main(void) 
{ 
    vFragColor = vColor; 
    gl_Position = P * MV * vVertex; 
} 

내 프래그먼트 쉐이더 사소한 - 그냥 보간 된 색을 출력한다.

이제

가 ... 여기에 내가 얻을 출력입니다 : 댄

enter image description here

내가 glFrontFace(GL_CW);glFrontFace(GL_CCW);을 변경, 또는 대안 적으로, glCullFace(GL_FRONT)-glCullFace(GL_BACK)을 변경하는 경우를 나는 기대하세요 (적어도 더 예상 이전은, 렌더링) 두 번째와 세 번째 quesions 참조 : 여기 세 가지 문제를 참조

enter image description here

을, 개 채널 질문에 설명 :

실제 질문 :

Q1 : 왜 내가 의도의 권선 반대입니까? 앞면에 정점을 시계 반대 방향으로 감았습니까?
Q2 왜 내 "왼쪽"얼굴과 "오른쪽"얼굴이 바뀌 었습니까? 왼쪽 얼굴은 노란색이었고 오른쪽 얼굴은 녹색이었고 그 반대도 마찬가지였습니다! 내 변형이 뭐가 잘못 되었 니?
Q3
거기 내내 눈 벡터의 x 좌표가 양수이기 때문에입니다. 즉, 실제로는 왼쪽면이 아닌 오른쪽면을보아야합니다.

나는 그들이 모두 연결되어 있고 아마도 내가 누락 된 매우 기초적인 것으로 생각하기 때문에이 질문들을 함께 질문했다. 이러한 것들을 명확히하기 위해 시간을내어 주셔서 대단히 감사합니다.

답변

9

OpenGL은 기본적으로 오른손 좌표계, 즉 화면의 양수 Z 축을 가리키는 것으로 가정합니다. 큐브 꼭지점 위치는 왼손잡이 좌표계를 가정하고 있음을 나타냅니다. 그러나 그 값을 RHS에 넣으면 LHS- 시계 반대 방향 좌표가 시계 방향 (1)이되고, 한면의면이 스왑 장소 (2)로 바뀌고 가정 된 눈 변환이 반대 방향 (3)으로 바뀝니다.

+1

나는 여전히 혼란 스럽다. 내가 좋아하는 "세계"좌표계를 자유롭게 정의 할 수는 없습니까? 그리고 LookAt 함수는 벡터를 월드 좌표로받습니다. 그렇다면 기본 Z 축 방향은 어떤 차이가 있습니까? –

+1

Ahhh ... 지금은 이해하기 시작하고 있다고 생각합니다. 세계 좌표계에서도 세 축의 상대적인 배치를 변경할 수는 없습니다. 그게 맞습니까? –

+3

@Armen 그렇습니다. 당신은 모델 뷰 행렬을 (1,1, -1)로 스케일링 할 수 있고 따라서 의도 된 왼손잡이 시스템을 가정하기 위해 z 축을 미러링 할 수 있습니다. 그러나 이것을 제안하지는 않을 것입니다. 오른 손잡이 시스템의 사실상 표준입니다. –

관련 문제