Хорошо, я понял это. В основном я рисовал квадроциклы, которые действуют как «всплывающие» вырезы, где угол всплывающего окна определяется текущим вращением просмотра. Затем я отключу проверку глубины при выполнении чертежа, чтобы они не разрезали на трехмерную поверхность, на которой они нарисованы. Преимущество такого подхода заключается в том, что мне не нужно вычислять значение шкалы - это позаботится, потому что я рисую обычные квадратики в перспективном видовом экране.
Во-первых, мне нужно определить угол обзора по шкале от 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 местности, так что я просто отключить тест глубины перед нанесением их. Таким образом, они масштабируются точно так, как они должны основываться на их позиции в перспективном видовом экране, но они всегда появляются поверх всего, что было нарисовано раньше, чем они. В моем конкретном случае я хочу, чтобы эти спрайты были закрыты рельефом, нарисованным перед ним, поэтому я только что снова включил глубинное тестирование при рисовании более близкого ландшафта.
Это ES 1 или ES 2? –
ES 1. Я обновлю оригинальный вопрос. –
Вы уверены, что используете орфографию? в вашей настройке вы используете glOrthof или glFrustumf? – led42