gpt4 book ai didi

java - LWJGL Circle 程序创建椭圆形形状

转载 作者:行者123 更新时间:2023-12-01 12:55:24 25 4
gpt4 key购买 nike

我试图在 LWJGL 中绘制一个圆形,但是当我绘制时,我尝试绘制它,它会形成一个更像椭圆形而不是圆形的形状。另外,当我将 CircleVertexCount 更改为 350+ 时,形状会翻转。我真的不确定创建顶点的代码是如何工作的(我已经学习了几何并且我知道基本的三角比率)。我还没有真正找到关于创建圈子的好教程。这是我的代码:

public class Circles {

// Setup variables
private int WIDTH = 800;
private int HEIGHT = 600;
private String title = "Circle";

private float fXOffset;

private int vbo = 0;
private int vao = 0;

int circleVertexCount = 300;

float[] vertexData = new float[(circleVertexCount + 1) * 4];

public Circles() {
setupOpenGL();
setupQuad();

while (!Display.isCloseRequested()) {
loop();
adjustVertexData();
Display.update();
Display.sync(60);
}

Display.destroy();
}

public void setupOpenGL() {
try {
Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
Display.setTitle(title);
Display.create();

} catch (LWJGLException e) {
e.printStackTrace();
System.exit(-1);
}

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}

public void setupQuad() {
float r = 0.1f;
float x;
float y;
float offSetX = 0f;
float offSetY = 0f;
double theta = 2.0 * Math.PI;

vertexData[0] = (float) Math.sin(theta / circleVertexCount) * r + offSetX;
vertexData[1] = (float) Math.cos(theta / circleVertexCount) * r + offSetY;

for (int i = 2; i < 400; i += 2) {
double angle = theta * i / circleVertexCount;
x = (float) Math.cos(angle) * r;
vertexData[i] = x + offSetX;
}

for (int i = 3; i < 404; i += 2) {
double angle = Math.PI * 2 * i / circleVertexCount;
y = (float) Math.sin(angle) * r;
vertexData[i] = y + offSetY;
}

FloatBuffer vertexBuffer = BufferUtils.createFloatBuffer(vertexData.length);
vertexBuffer.put(vertexData);
vertexBuffer.flip();

vao = glGenVertexArrays();
glBindVertexArray(vao);

vbo = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER,vertexBuffer, GL_STATIC_DRAW);

glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindVertexArray(0);

}

public void loop() {
glClear(GL_COLOR_BUFFER_BIT);

glBindVertexArray(vao);
glEnableVertexAttribArray(0);

glDrawArrays(GL_TRIANGLE_FAN, 0, vertexData.length / 2);

glDisableVertexAttribArray(0);
glBindVertexArray(0);
}

public static void main(String[] args) {
new Circles();
}

private void adjustVertexData() {
float newData[] = new float[vertexData.length];
System.arraycopy(vertexData, 0, newData, 0, vertexData.length);

if(Keyboard.isKeyDown(Keyboard.KEY_W)) {
fXOffset += 0.05f;
} else if(Keyboard.isKeyDown(Keyboard.KEY_S)) {
fXOffset -= 0.05f;
}

for(int i = 0; i < vertexData.length; i += 2) {
newData[i] += fXOffset;
}

FloatBuffer newDataBuffer = BufferUtils.createFloatBuffer(newData.length);
newDataBuffer.put(newData);
newDataBuffer.flip();

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferSubData(GL_ARRAY_BUFFER, 0, newDataBuffer);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
}

300 顶点数(这是我的主要问题) LWJGL Oval Figure

400 顶点数 - 我删除了这张图像,它被窃听了,应该是从右侧切下的一条小条,就像割线一样

500 顶点数 Circle - 500 Vertices

每 100,它就会删除越来越多的圆圈,依此类推。

最佳答案

您的问题之一是:

for (int i = 2; i < 400; i += 2) {
double angle = theta * i / circleVertexCount;
x = (float) Math.cos(angle) * r;
vertexData[i] = x + offSetX;
}

for (int i = 3; i < 404; i += 2) {
double angle = Math.PI * 2 * i / circleVertexCount;
y = (float) Math.sin(angle) * r;
vertexData[i] = y + offSetY;
}

您对每个顶点的 x 和 y 位置使用不同的角度值。

你可以尝试这个:

for (int i = 0; i <= circleVertexCount; i++) {
double angle = i * theta / circleVertexCount;
x = (float) Math.cos(angle) * r;
y = (float) Math.sin(angle) * r;
vertexData[i * 2] = x + offSetX;
vertexData[i * 2 + 1] = y + offSetY;
}

圆的部分在较高顶点数下被剪切的原因是 i < 400在你的 for 循环中,所以我将其更改为 i <= circleVertexCount .

另一个问题是您的窗口不是方形的,并且您没有使用着色器(或已弃用的内置矩阵)来纠正此问题。这意味着向上一个单位看起来与右侧一个单位的长度不同,从而导致椭圆形而不是圆形。要解决此问题,您可以将顶点 x 位置乘以显示高度除以显示宽度,最好在着色器中。

关于java - LWJGL Circle 程序创建椭圆形形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23957727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com