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 축 (아래쪽)으로 이동합니다. 이
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을 사용하고 있습니다.
한번 그냥 축 중 하나를 반전, 오른손 좌표계에 왼손잡이로 전환하기 위해 뭔가를 들었
은 당신이 정말 필요한 것은 이것이다. (예 : (1,1,1) 대신에 (1,1,1)이있을 수 있습니다.) 그들은 어느 것이 플립인지는 중요하지 않다고 말했지만 분명히 원하는 결과에 대해 더 나은 것이 있습니다 다른 사람. – cHao
한 번에 각 축을 뒤집어 봤습니다. X 또는 Y 축 뒤집기는 결과에 영향을주지 않으며 Z를 뒤집 으면 렌더링이 모두 제거됩니다. 나는 도둑질을 해제 했으므로 그리기 콜을 뽑아 낸 것이 아닙니다. – Kyle