java - 如何使用 VBO 使用 OpenGL(特别是 LWJGL)绘制圆

标签 java lwjgl

我目前正在学习 LWJGL(LightWeight Java 游戏库),OpenGL-Java 端口,并试图弄清楚如何使用 VBO 画圆。

当我搜索有关我的问题的代码示例时(我搜索 OpenGL b/c OpenGL 和 LWJGL 的语法非常相似),我发现的只是人们使用 glBegin(GL_QUADS) 等,我不喜欢它,因为它的性能不佳且不足。我知道它使用诸如 Math.PI 之类的东西(我已经学习了几何,在我看来数学并不是困难的部分)。

我想知道如何将使用 Math.cosMath.sin 收到的 X 和 Y 值输入 VBO,b/c 使用时glDrawArrays,您必须指定顶点数。

最佳答案

你似乎把很多事情搞混了。 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;
    }

这是我自己仓促编写的一个相当糟糕的编码方法。在使用之前请确保您理解它,但是,以下是其工作原理的详细说明:

  1. 计算出初始角度(仅适用于绘制圆弧)
  2. 循环从 0 到 slices 之间的每个数字,此参数是您希望圆具有的细节级别,较高意味着更多三角形,但是一旦达到特定级别,将不会添加更多细节并且只会消耗 CPU 时间。
  3. 计算出以弧度为单位的角度
  4. 使用 Math.sinMath.cos 计算出圆外侧特定点的 x 和 y 值
  5. 将适当的顶点添加到vertexes数组

这将返回一个应与 GL_TRIANGLES 一起使用的 float 组,您可以尝试改进它以使用 GL_TRIANGLE_FAN

关于java - 如何使用 VBO 使用 OpenGL(特别是 LWJGL)绘制圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23635749/

相关文章:

java - LWJGL 鼠标不响应 Cocoa 模拟鼠标事件

java - 在spark1.6 Java API中如何获取数据帧的所有分区值?

Java:类型删除器实现

java - java中如何检查数组中的元素是否存在?

java - LWJGL 窗口每秒只更新一次帧?

Java OpenAL : Sounds Playing on key press but only for a short time

java - chalice 。 Hibernate 延迟加载多个对象

java - 什么会导致bash无法执行在我自己的机器上编写和编译的.jar?

java - 使用 lwjgl 实现第三人称相机

java - 在 lwjgl 中制作立方体贴图