如何使用VBO使用OpenGL(特定于LWJGL)绘制圆

时间:2014-05-13 15:41:05

标签: java lwjgl

我目前正在学习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时,必须指定顶点数。

2 个答案:

答案 0 :(得分:1)

你似乎有很多混乱。 LWJGL和openGL实际上与此无关,是否使用glDrawArraysglBegin并不重要。

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

这是一个非常糟糕的编码方法,由我自己匆忙制作。在使用它之前一定要了解它,但是,这里有一个如何工作的细分:

  1. 计算出初始角度(仅适用于绘制弧线)
  2. 循环遍历从0到slices的每个数字,此参数是您想要圆圈的详细程度,更高意味着更多三角形,但是一旦达到某个级别,就不会再添加任何细节,只会吃掉cpu时间。
  3. 以弧度计算角度
  4. 使用Math.sinMath.cos计算圆圈外部特定点的x和y值
  5. 将适当的顶点添加到vertexes数组
  6. 这将返回应与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();