2014-09-28 60 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