2014-09-28 56 views
0

我想在Opengl中渲染一個圓柱體。對於我寫了一個簡單的算法,即 生成我的點網格由參數半徑,高度,xSubDivisions和ySubDivisions: (爪哇)圓柱算法的奇怪之處

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 
    }; 
} 

結果實際上是一個氣缸中,(i創建的IBO到渲染這一點),但有時,與x和yDivisions不同的投入有一個奇怪的差距。 我找不到規則,但是我發現此錯誤的值是200,100。 要調試我只渲染了點。其結果是:

enter image description here

這怎麼可能?有一點只是缺失(我添加了塗料的蘆葦圈)。 我的算法問題在哪裏?

+0

是這點在你的渲染唯一缺少的,或者是它也不會在你的輸入? – usr2564301 2014-09-28 15:40:35

+0

在輸入中似乎也錯過了。問題是我不能真正檢查這個,因爲對於分區的小值不會出現...但是我會盡力確保 – 2014-09-28 15:53:50

+1

它在渲染過程中不會出錯。Im渲染:「GL11.glDrawArrays(GL11.GL_POINTS,0,vertices.length/5);」 這應該是數組中的所有點... – 2014-09-28 15:57:38

回答

1

我不是Java編碼,但你混合int和float一起

  • 例如:
  • ​​
  • [float] [float] [int] [int]
  • 我寧願用這個:
  • xDegrees = float(360*xDivision)/float(xDivisionCount)
  • 乘法應該去總是先(如果操作數都是> = 1)
  • 後,爲了維護準確性
  • 一些奇怪的舍入可能會導致您的問題,但它會是下xDivisionCount不是更大更明顯的一個

錯誤斷點

  • 添加到您的代碼,最後生成點
  • 後新點的計算從最後計算距離點
  • 添加if (|distance-some_avg_distance|>1e-10)
  • ,往其中加
  • some_avg_distance的距離應該在那裏設置斷點(從跟蹤得到它)
  • 這種方式,您可以斷點點造成的問題(或下一個點的話)
  • 所以你可以看到什麼是錯的
  • 我的賭注是,通過四捨五入你得到同樣的角度上/下一個點
  • ,因此你沒有遺漏點,但一些重複的,而不是
  • 您可以檢查也Blending