2011-10-11 2 views
0

3D OpenGL 앱을 작성 중이며 정점 변환 행렬에 문제가 있습니다.OpenGL 왼손잡이 좌표계

여기 내 버텍스 쉐이더입니다 :

attribute vec4  vInPos; 

uniform mat4 kWorld; 
uniform mat4 kProj; 

void main(void) 
{ 
    vec4 world_pos = kWorld * vInPos; 
    gl_Position = kProj * world_pos; 
} 

내 모든 행렬이 저장되는 행이 전공 및 내 투영 행렬과 같은 왼손잡이 관점 행렬을 사용하고 있습니다.

문제는 행렬로 정점을 변환하면 X 축과 Y 축 모두에서 잘못된 방향으로 이동하고 대칭 이동된다는 것입니다. 따라서 (100.0f,100.0f,100.0f)으로 번역하면 내 정점이 Z 축 (카메라에서 멀리 떨어진 위치)에서 올바른 방향으로 이동하지만 X 축 (왼쪽)과 왼쪽 (오른쪽)에서 Y 축 (아래쪽)으로 이동합니다. screenshot

FPS 카운터가 오른쪽에 있어야한다 대신 왼쪽 아래의 :

여기처럼 현재 모습입니다. 그것은 또한 명백히 미러링되어서는 안됩니다. OpenGL은 기본적으로 오른 손잡이 좌표계를 사용하기 때문에 내가 읽은 것을 바탕으로 이러한 상황이 발생합니다. 그러나이를 해결하기 위해 내가 할 수있는 일이 확실하지 않습니다.

설명을 시도하는 몇 가지 기사를 찾았지만 해결 방법을 찾을 수 없었습니다. This question은 OpenGL 스펙이 좌표계가 예상 한 것을 보여 주지만,보고 나서 그것이 어떻게 도움이되는지를 알지 못했습니다.

편집 : 참고로, 내 프로젝션 매트릭스 코드는 DirectX SDK을 기반으로합니다.

EDIT : Nicol Bolas의 제안에 따르면, 이제 gluPerspective의 매트릭스를 사용하고 있지만 동일한 결과가 나타납니다.


여기 내 행렬을 설정하는 데 사용하고 코드입니다 :

/* Vertex data for reference 
float vertices[] = 
{ 
    {0.0f,0.0f,0.0f}, 
    {5.0f,0.0f,0.0f}, 
    {0.0f,5.0f,0.0f}, 
    {5.0f,5.0f,0.0f}, 
}; */  
float worldf[16]; 
float projf[16]; 
float fov  = 60.0f; 
float aspect = 1280.0f/720.0f; 
float near  = 1.0f; 
float far  = 1000.0f; 
float f   = 1.0f/tanf((fov*6.2831f/360.0f)/2.0f); 

/* Build world matrix */ 
memset(worldf, 0, sizeof(worldf)); 
worldf[0] = worldf[5] = worldf[10] = worldf[15] = 1.0f; 
worldf[12] = 100.0f; 
worldf[13] = 100.0f; 
worldf[14] = -100.0f; 

/* Build perspective matrix */ 
memset(projf, 0, sizeof(projf)); 
projf[0] = f/aspect; 
projf[5] = f; 
projf[10] = (far+near)/(near-far); 
projf[14] = (2.0f*far*near)/(near-far); 
projf[11] = -1.0f; 

glUniformMatrix4fv(proj_uniform, 1, GL_FALSE, projf); 
glUniformMatrix4fv(world_uniform, 1, GL_FALSE, worldf); 

이 코드를 사용하여 내 텍스트가 전혀 표시되지 않습니다.

EDIT : 관련성이 있는지 모르겠지만 OS X Snow Leopard에서 OpenGL 2.0을 사용하고 있습니다.

+0

한번 그냥 축 중 하나를 반전, 오른손 좌표계에 왼손잡이로 전환하기 위해 뭔가를 들었

은 당신이 정말 필요한 것은 이것이다. (예 : (1,1,1) 대신에 (1,1,1)이있을 수 있습니다.) 그들은 어느 것이 플립인지는 중요하지 않다고 말했지만 분명히 원하는 결과에 대해 더 나은 것이 있습니다 다른 사람. – cHao

+0

한 번에 각 축을 뒤집어 봤습니다. X 또는 Y 축 뒤집기는 결과에 영향을주지 않으며 Z를 뒤집 으면 렌더링이 모두 제거됩니다. 나는 도둑질을 해제 했으므로 그리기 콜을 뽑아 낸 것이 아닙니다. – Kyle

답변

1

나는 왼손잡이 관점 매트릭스

정지 그렇게 사용하고 있습니다.

마찬가지로 중요한 것은 투영 행렬 (클립 공간)의 출력이 이고 다른 것은 OpenGL 및 D3D의 경우입니다. D3D 투영 행렬을 가져 와서 조바꿈 할 수는 없으며 GLSL이 출력을 올바르게 받아 들일 것으로 기대합니다.

그래서 다시 gluPerspective을 찾아 해당 매트릭스를 사용하십시오.


당 니콜 올가미 '제안, 지금 gluPerspective에서 매트릭스를 사용하고 있습니다,하지만 난 같은 결과를 얻고있다.

다른 왼손잡이 행렬을 사용하고있을 가능성이 큽니다.모델 - 카메라 행렬은 오른손 잡 이용이 필요합니다. 또한, 정점 데이터도 오른 손잡이 일 필요가 있습니다. 또는 왼손잡이 공간에서 오른 손잡이로 변환 할 수는 있지만 다른 선택이 없다면 조언하지는 않습니다.


float f = 1.0f/tanf(fov/2.0f); 

fov 각도는 각도이다. tanf은 각도가 라디안입니다. tanf30.0f 인 음수입니다. 이는 원근감 매트릭스의 절두체 크기가 음수라는 의미입니다. 그러면 뷰의 X 축과 Y 축이 반전됩니다.

float f = 1.0f/tanf((fov * 6.2831f/360.0f)/2.0f); 
+0

죄송 합니다만, 나는 우연히 왼쪽 대신에 바로 입력했습니다. 저는 왼손잡이 투시 행렬을 사용하고 있습니다. 원래 질문을 업데이트했습니다. – Kyle

+0

더 이상 왼손잡이 물건을 사용하지 않습니다. 내 행렬은 gluPerspective의 수학을 사용하여 만들어지며, 월드 행렬은'worldMatrix [12] = 100, worldMatrix [13] = 100, worldMatrix [14] = 100'의 항등 행렬입니다. 나의 4 정점은 정점 [] = {{0,0}, {50,0}, {0,50}, {50,50}}'입니다. 나는 변경을 시도 할 때마다 추려내 지 않는 것을 막기 위해 도려내기를 꺼 놨다. 시계 버퍼와 시계열 버퍼가있는 인덱스 버퍼가 두 개있다. 둘 다 테스트했다. 아무것도 결과를 바꾸는 것처럼 보이지 않습니다. – Kyle

+0

@ 카일 : 표준 OpenGL 퍼스펙티브 매트릭스가 설정하는 카메라 공간은 카메라 앞에 -Z, 그 뒤에 + Z가 있습니다. 따라서 꼭지점을 100으로 평행 이동하면서 여전히 그 꼭짓점을 볼 수 있다면 어딘가에 여전히 나쁜 행렬이 있습니다. 답변에 사용하는 실제 행렬과 함께 렌더링 할 glUniformMatrix 코드를 추가 할 수 있습니까? –