Как нарисовать цилиндр в OpenGL-es на Android? - PullRequest
0 голосов
/ 07 сентября 2011

Может ли кто-нибудь помочь мне нарисовать цилиндр в OpenGL-es android. Все, что я рисую, выглядит как прямоугольник.

Буду признателен за любые советы или ссылки.

Вот код, который я пробовал:

  int VERTICES=180; // more than needed
      float coords[] = new float[VERTICES * 3];
      float theta = 0;

      for (int i = 0; i < VERTICES * 3; i += 3) {
        coords[i + 0] = (float) Math.cos(theta);
        coords[i + 1] = (float) Math.sin(theta);
        coords[i + 2] = 0;
        _vertexBuffer.put(coords[i + 0]);
        _vertexBuffer.put(coords[i + 1]);
        _vertexBuffer.put(coords[i + 2]);
        theta += Math.PI / 90;
      }

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

взгляните на Учебник по OpenGL ES для Android (часть V) , это дает вам пошаговое руководство до рисования цилиндра.

Если коротко взглянуть на ваш код, кажется, что у вас есть две проблемы:

1) cos и sin дают значения в диапазоне от 0 до 1, поэтому вам, вероятно, следует умножить его на некоторый радиус

2) Линия: координаты [i + 2] = 0; означает, что вы, скорее всего, рисуете 2D-круг, а не 3D-цилиндр

1 голос
/ 26 августа 2012

Это только нарисует круг.Цилиндр более сложен, так как вам нужно будет определить вершины в переведенной плоскости 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).

...