我目前正在学习 LWJGL(LightWeight Java 游戏库),OpenGL-Java 端口,并试图弄清楚如何使用 VBO 画圆。
当我搜索有关我的问题的代码示例时(我搜索 OpenGL b/c OpenGL 和 LWJGL 的语法非常相似),我发现的只是人们使用 glBegin(GL_QUADS)
等,我不喜欢它,因为它的性能不佳且不足。我知道它使用诸如 Math.PI 之类的东西(我已经学习了几何,在我看来数学并不是困难的部分)。
我想知道如何将使用 Math.cos
和 Math.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;
}
这是我自己仓促编写的一个相当糟糕的编码方法。在使用之前请确保您理解它,但是,以下是其工作原理的详细说明:
- 计算出初始角度(仅适用于绘制圆弧)
- 循环从 0 到
slices
之间的每个数字,此参数是您希望圆具有的细节级别,较高意味着更多三角形,但是一旦达到特定级别,将不会添加更多细节并且只会消耗 CPU 时间。 - 计算出以弧度为单位的角度
- 使用
Math.sin
和Math.cos
计算出圆外侧特定点的 x 和 y 值 - 将适当的顶点添加到
vertexes
数组
这将返回一个应与 GL_TRIANGLES
一起使用的 float 组,您可以尝试改进它以使用 GL_TRIANGLE_FAN
关于java - 如何使用 VBO 使用 OpenGL(特别是 LWJGL)绘制圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23635749/