2014-09-28 3 views
0

Я хочу сделать цилиндр в Opengl. Для этого я написал простой алгоритм, который генерирует мне сетку точек радиуса параметров, высоту, xSubDivisions и ySubDivisions: (Java)странная вещь с алгоритмом цилиндра

for(int yDivision = 0; yDivision < yDivisionCount; yDivision++){ 
    for(int xDivision = 0; xDivision < xDivisionCount; xDivision++){ 
     float line[] = getVboLine(xDivision, yDivision, radius, height, xDivisionCount, yDivisionCount); 
     string.append(line[0] + ", " + line[1] + ", " + line[2] + ", " + line[3] + ", " + line[4] + ", "); 
    } 
} 



public float[] getVboLine(int xDivision, int yDivision, float radius, float height, int xDivisionCount, int yDivisionCount){ 
    float xDegrees = 360.0f/xDivisionCount * xDivision; 
    float xRadian = (float) Math.toRadians(xDegrees); 
    float x = (float) Math.sin(xRadian) * radius; 
    float z = (float) Math.cos(xRadian) * radius; 
    float y = (float) yDivision * (height/(yDivisionCount - 1)); 
    float s = xDegrees * (1.0f/360.0f); 
    float t = yDivision * (1.0f/(yDivisionCount - 1)); 
    return new float[]{ 
      x, y, z, s, t 
    }; 
} 

Результат является фактически цилиндром, (я создал IBO в эти моменты), но иногда, с разными входами для x и yDivisions, в нем есть странный пробел. Я не мог найти правило, но значения, которые я нашел, это ошибка, равная 200, 100. Для отладки я отобразил только точки. Результат был:

enter image description here

Как это возможно? Одно очко просто отсутствует (где я добавил кружок с краской). Где проблема с моим алгоритмом?

+0

Является ли этот пункт отсутствует в вашей визуализации только, или это тоже не в вашем входе? – usr2564301

+0

Кажется, что пропустить во входной тоже. Проблема в том, что я не могу это проверить, потому что с небольшими значениями для делений не появляется ... Но я постараюсь обеспечить –

+1

, это не может быть ошибкой в ​​рендеринге на самом деле.Im render с: "GL11.glDrawArrays (GL11.GL_POINTS, 0, vertices.length/5);" Это должны быть все точки из массива ... –

ответ

1

Я не JAVA кодировщик, но вы смешиваете Int и плавать вместе

  • , например:
  • xDegrees = 360.0f/xDivisionCount * xDivision
  • [float] [float] [int] [int]
  • Я предпочел бы использовать это:
  • xDegrees = float(360*xDivision)/float(xDivisionCount)
  • умножение должно идти всегда первый (если операнды> = 1)
  • и деления после того, что для сохранения точности
  • некоторых странное округление может привести к вашим проблемам, но это будет более заметным для нижней xDivisionCount не большей один

ошибка останова

  • добавить в код последней генерируемой точки
  • после новой точки вычислений вычислить расстояние от последнего точка
  • добавить if (|distance-some_avg_distance|>1e-10)
  • и добавить точку останова внутри
  • some_avg_distance установленного расстояния, которые должны быть там (получить его от следов)
  • Таким образом, вы можете BreakPoint точки вызывают проблемы (или следующий пункт к нему)
  • так что вы можете увидеть, что это неправильно
  • моя ставка является то, что при округлении вы получите тот же угол, что и предыдущая/следующий пункт
  • и поэтому вам не хватает точки, но некоторые дубликата вместо
  • вы можете проверить, что также Blending
Смежные вопросы