2011-11-10 3 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

Хорошо, я понял это. В основном я рисовал квадроциклы, которые действуют как «всплывающие» вырезы, где угол всплывающего окна определяется текущим вращением просмотра. Затем я отключу проверку глубины при выполнении чертежа, чтобы они не разрезали на трехмерную поверхность, на которой они нарисованы. Преимущество такого подхода заключается в том, что мне не нужно вычислять значение шкалы - это позаботится, потому что я рисую обычные квадратики в перспективном видовом экране.

Во-первых, мне нужно определить угол обзора по шкале от 0 (верхний) до pi/2 (уровень земли). Я делаю это с этим уравнением:

viewingAngle = (currentRotation/90.0) * M_PI_2; 

currentRotation просто угол, я использую в glRotatef. Учитывая угол обзора, я могу рассчитать вертикальную высоту и глубину «всплывающего» края квадроцикла. В принципе, это простая тригонометрия отсюда. Представьте, что вы видите всплывающий вырез сбоку. Он имеет фиксированное основание и имеет край, который поднимается из горизонтального положения в вертикальное положение. Этот край прослеживает контур квадранта круга. И в любой момент он формирует правильный треугольник, который вы можете использовать для вычисления значений позиции.

Если вы знаете угол (как видно из фрагмента выше) и гипотенузу (которая в этом случае является y-высотой текстуры всплывающего изображения, как если бы она была плоской), тогда вы можете решить противоположную сторону треугольника, умножая грех угла на время гипотенузы. Это значение соответствует глубине, при которой всплывающий край должен быть поднят с земли. Так как sin (угол) = противоположной/гипотенузы, можно решить за «противоположный», как, например:

popUpValueZ = sinf(viewingAngle) * imageHeight; 

Далее, мне нужно вычислить у-размер всплывающего изображения. В воображаемом треугольнике выше это соответствует стороне, смежной с углом всплывающего окна. Таким образом, косинус используется для расчета его стоимости:

popUpValueY = cosf(viewingAngle) * imageHeight; 

Теперь я могу использовать popUpValueY и popUpValueZ определить свои вершины. Они будут действовать как высота и глубина моего квадроцикла, соответственно. Когда угол обзора становится ниже земли, значение Z увеличивается с земли, а значение Y становится короче и короче, так что оно начинает напоминать вертикальную плоскость вместо горизонтальной.

Другая вещь, которую я должен был сделать:

glDisable(GL_DEPTH_TEST); 

Я обнаружил, что эти всплывающие окна с «псевдо-спрайтов» дрались с 3D местности, так что я просто отключить тест глубины перед нанесением их. Таким образом, они масштабируются точно так, как они должны основываться на их позиции в перспективном видовом экране, но они всегда появляются поверх всего, что было нарисовано раньше, чем они. В моем конкретном случае я хочу, чтобы эти спрайты были закрыты рельефом, нарисованным перед ним, поэтому я только что снова включил глубинное тестирование при рисовании более близкого ландшафта.

Смежные вопросы