Это только нарисует круг.Цилиндр более сложен, так как вам нужно будет определить вершины в переведенной плоскости z.И определите их с помощью правильных нормалей (либо обращенных внутрь, как будто вы находитесь внутри цилиндра - то есть туннеля, либо снаружи, как при взгляде на трубу), что является более сложной частью.
В настоящее время я делаю это сейчас (что и привело меня сюда), и нарисовал цилиндр, но почти уверен, что мои нормали неверны, так как мое освещение выглядит немного не так.Когда я это выясню, я опубликую некоторый код.
Правка: понял, что код на самом деле не рисует круг.Вот как это сделать (в 2D):
R = Radius
NUM_VERTICES = Number of vertices you want to use in circle
delta = (Math.PI / 180) * (360 / NUM_VERTICES); //get delta in radians between vertex definition
for i = 0 ; i < NUM_VERTICES ; i ++
x = R * cos(Delta * i)
y = R * sin(Delta * i))
vertices[i] = x; vertices[i+1] = y; vertices[i+2] = 0;
end for
// Примечание может потребоваться переопределить исходную вершину, чтобы завершить круг в зависимости от того, какой тип рисования GL вы используете.Если это так, просто возьмите аргумент sin / cos, равный 0, чтобы завершить цикл
Последнее редактирование *: только что понял, что я слишком усложняю нормали, повторно используя некоторые вычисления нормалей из кода треугольника, который у меня был.Вместо этого я понял, насколько простым является нормальное вычисление для цилиндра, если исходную точку 0,0 считать центром каждой круглой полосы.Нормаль будет = положение вершины, масштабированное до длины 1. Для нормалей, обращенных внутрь на цилиндре (то есть туннеле), значения x, y будут инвертированы (это предполагает, что вы смотрите вниз по оси -z).