2011-11-10 5 views
1

투시도로 표시된 지형도가 포함 된 OpenGL ES 1에서 게임을 만들고 있습니다. 거리에 따라 크기가 조정되는 스프라이트를지도에 그립니다. 나는 스프라이트를 그릴 수 있지만 카메라에서 얼마나 멀리 떨어져 있더라도 항상 같은 크기입니다.OpenGL ES에서 거리에 따라 비례하는 드로잉 스프라이트

카메라에서 거리, 뷰포트 너비 등을 기준으로 크기를 동적으로 계산할 수 있다고 생각하지만 자동으로 계산되는 크기를 선호합니다.

여기 내 코드입니다 :

GLfloat quadratic[] = { 1.0f, 0.0f, 0.0f }; 
    glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, quadratic); 
    glPointSize(40); 
    glPointParameterf(GL_POINT_SIZE_MAX, maxSize); 
    glPointParameterf(GL_POINT_SIZE_MIN, 1.0f); 
    glTexEnvf(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE); 
    glEnable(GL_POINT_SPRITE_OES); 

    GLfloat point_array[] = 
    { 
     territoryOrigin.x, territoryOrigin.y, 10.0, 
    }; 
    glVertexPointer(3, GL_FLOAT, 0, point_array); 
    glDrawArrays(GL_POINTS, 0, 1); 

    glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_FALSE); 
    glDisable(GL_POINT_SPRITE_OES); 
+0

이 ES 1 또는 ES 2입니까? –

+0

ES 1. 원래 질문을 업데이트하겠습니다. –

+0

정사영 뷰를 사용하지 않습니까? 당신의 설정에서 glOrthof 또는 glFrustumf를 사용합니까? – led42

답변

1

좋아, 나는 이것을 알아 냈어. 기본적으로 나는 팝업의 각도가 현재보기 회전에 의해 결정되는 '팝업'컷 아웃과 같은 역할을하는 쿼드를 그렸습니다. 그런 다음 드로잉을 수행 할 때 깊이 테스트를 비활성화하여 드로잉 된 3D 지형으로 잘라 내지 않습니다. 이 접근 방식의 이점은 스케일 값을 계산할 필요가 없다는 것입니다. 투시 뷰포트에서 일반 쿼드를 그리기 때문에 처리됩니다.

먼저, 0 (오버 헤드)에서 pi/2 (지상 레벨)까지의 눈금을 결정해야합니다. 나는이 방정식 그렇게 :

viewingAngle = (currentRotation/90.0) * M_PI_2; 

currentRotation 단순히 내가 glRotatef에서 사용하고 각이다. 보기 각도가 주어지면 쿼드의 '팝업'가장자리의 세로 높이와 깊이를 계산할 수 있습니다. 기본적으로 여기에서 간단한 삼각법입니다. 옆에서 팝업 컷 아웃을보고 상상해보십시오. 그것은 고정 된 받침대를 가지고 있으며 수평 위치에서 수직 위치로 상승하는 모서리를 가지고 있습니다. 이 에지는 원 쿼드런트의 윤곽을 추적합니다. 그리고 어떤 주어진 시점에서, 그것은 당신이 위치 값을 계산하는 데 사용할 수있는 직각 삼각형을 형성합니다.

각도 (위의 스 니펫에서 볼 수 있음)와 빗변 (이 경우 평면 이미지와 같이 팝업 이미지 텍스처의 y 높이)을 알고있는 경우 삼각형의 반대편은 사각의 죄를 곱하여 빗변을 곱한다. 이 값은 팝업 가장자리를지면에서 들어 올려야하는 깊이에 해당합니다. 죄 (각도) = 대향/빗변 때문에, I는 다음과 같은 '반대'를 풀 수

popUpValueZ = sinf(viewingAngle) * imageHeight; 

다음에, I 팝업 이미지의 Y 크기를 산출 할 필요가 있었다. 위의 가상 삼각형에서 이것은 팝업 각에 인접한면에 해당합니다.

popUpValueY = cosf(viewingAngle) * imageHeight; 

지금 내 정점을 결정하는 popUpValueY 및 popUpValueZ를 사용할 수 있습니다 따라서, 코사인 값을 계산하는 데 사용됩니다. 그들은 내 쿼드의 높이와 깊이로 각각 작용할 것입니다. 시야각이지면에 가까워 질수록 Z 값은지면에서 증가하고 Y 값은 더 짧아지고 짧아 지므로 수평면 대신 수직면과 유사 해지기 시작합니다.

내가해야 할 일을했을 다른 것은 :

glDisable(GL_DEPTH_TEST); 

나는이 팝업 '의사 스프라이트'는 3D 지형과 싸우는 것을 발견, 그래서 나는 단순히 그리기 전에 깊이 테스트 비활성화. 이렇게하면 투시 뷰포트 내에서의 위치에 따라 정확하게 크기가 조정되지만 항상 이전에 그려진 요소 위에 표시됩니다. 필자는이 스프라이트가 앞에 그려진 지형으로 가려지기를 원한다. 그래서 더 가까운 지형을 그릴 때 깊이 테스트를 다시 사용했다.

관련 문제