我目前正在学习LWJGL(LightWeight Java游戏库),OpenGL-Java端口,并试图找出如何使用VBO绘制圆圈。
当我搜索有关我的问题的代码示例时(我搜索OpenGL b / c,OpenGL和LWJGL的语法非常相似),我发现只有人使用glBegin(GL_QUADS)
等等,我不这样做喜欢由于其糟糕的表现和不足。我知道它使用像Math.PI
之类的东西(我采用几何学,数学并不是我认为的难点)。
我想知道如何使用Math.cos
&获得我收到的X和Y值Math.sin
进入VBO,b / c使用glDrawArrays
时,必须指定顶点数。
答案 0 :(得分:1)
你似乎有很多混乱。 LWJGL和openGL实际上与此无关,是否使用glDrawArrays
或glBegin
并不重要。
LWJGL中没有任何drawCircle
函数,你必须使用三角形绘制圆圈,如果你想提高效率,三角扇就更好了。
这是我编写的一个方法,它为您提供了填充弧的顶点(为startingAngleDeg
指定0和360,为整圆指定endAngleDeg
。)
public static float[] getFilledArcVertexes(float x, float y, float r, double startingAngleDeg, double endAngleDeg, int slices) {
if(startingAngleDeg < 0)
Heatstroke.error("Starting angle cannot be smaller than 0");
if(endAngleDeg >= 720)
Heatstroke.error("End angle cannot be greater or equal to than 720");
if(endAngleDeg < startingAngleDeg)
Heatstroke.error("End angle cannot be smaller than starting angle");
int radius = (int) r;
double arcAngleLength = (endAngleDeg - startingAngleDeg) / 360f;
float[] vertexes = new float[slices*6+6];
double initAngle = Math.PI / 180f * startingAngleDeg;
float prevXA = (float) Math.sin(initAngle) * radius;
float prevYA = (float) Math.cos(initAngle) * radius;
for(int arcIndex = 0; arcIndex < slices+1; arcIndex++) {
double angle = Math.PI * 2 * ((float)arcIndex) / ((float)slices);
angle += Math.PI / 180f;
angle *= arcAngleLength;
int index = arcIndex * 6;
float xa = (float) Math.sin(angle) * radius;
float ya = (float) Math.cos(angle) * radius;
vertexes[index] = x;
vertexes[index+1] = y;
vertexes[index+2] = x+prevXA;
vertexes[index+3] = y+prevYA;
vertexes[index+4] = x+xa;
vertexes[index+5] = y+ya;
prevXA = xa;
prevYA = ya;
}
return vertexes;
}
这是一个非常糟糕的编码方法,由我自己匆忙制作。在使用它之前一定要了解它,但是,这里有一个如何工作的细分:
slices
的每个数字,此参数是您想要圆圈的详细程度,更高意味着更多三角形,但是一旦达到某个级别,就不会再添加任何细节,只会吃掉cpu时间。Math.sin
和Math.cos
计算圆圈外部特定点的x和y值vertexes
数组这将返回应与GL_TRIANGLES
一起使用的浮点数组,您可以尝试改进它以使用GL_TRIANGLE_FAN
答案 1 :(得分:-1)
//您可以使用这个小的glBegin()代码并转换为VBO
double k=0;
glBegin(GL_POINTS);
for(k=0;k<=360;k+=0.1){
glVertex2f((float)(x+r*Math.cos(Math.toRadians(k))),(float)(y-r*Math.sin(Math.toRadians(k))));
}
glEnd();