LWJGL Circle程序创建一个椭圆形的形状

N1ghtk1n9

我正在尝试在LWJGL中绘制一个圆,但是当我尝试绘制它时,它使它的形状更像是一个椭圆而不是一个圆形。另外,当我更改circleVertexCount 350+时,形状会翻转。我真的不知道创建顶点的代码是如何工作的(我采用了Geometry,我知道基本的触发比率)。我还没有真正找到关于创建圈子的好教程。这是我的代码:

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椭圆形公仔

400 Vertex Count-我删除了此图像,它已被窃听,应该是从右侧切出的细小条,像割线一样

500顶点数 圆-500个顶点

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

亚历克斯-GlassEditor.com

您的问题之一是:

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位置乘以显示高度除以显示宽度,最好是在着色器中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我想用箭头将一个椭圆形的css形状变成椭圆形

来自分类Dev

我想用箭头将一个椭圆形的css形状变成椭圆形

来自分类Dev

如何创建一个椭圆形的UIView?

来自分类Dev

Python从4点创建一个椭圆形

来自分类Dev

LWJGL仅渲染一个对象

来自分类Dev

如何制作一个圆形的椭圆形按钮?

来自分类Dev

使用LWJGL创建相机类

来自分类Dev

使用LWJGL创建相机类

来自分类Dev

Java LWJGL键盘处理程序

来自分类Dev

基本LWJGL程序中的黑屏

来自分类Dev

如何在Flutter中在屏幕顶部创建一个半椭圆形?

来自分类Dev

LWJGL如何呈现白色的纹理形状

来自分类Dev

lwjgl,仅在屏幕上旋转一个对象?

来自分类Dev

lwjgl,仅在屏幕上旋转一个对象?

来自分类Dev

在OpenGL中创建椭圆形或椭圆形光源?

来自分类Dev

帆布弹跳球,显示一个椭圆形的黑色球

来自分类Dev

如何在css中制作一个椭圆形?

来自分类Dev

Android从canvis中删除一个椭圆形的部分

来自分类Dev

帆布弹跳球,显示一个椭圆形的黑球

来自分类Dev

使用CSS创建一半垂直的椭圆形

来自分类Dev

形状计算算法(椭圆形)

来自分类Dev

保存和还原LibGDX应用程序(LWJGL)的窗口位置

来自分类Dev

在Intellij Idea中运行LWJGL应用程序

来自分类Dev

将LWJGL Java应用程序放在jpanel或canvas中

来自分类Dev

在Linux终端上使用LWJGL运行程序

来自分类Dev

在LWJGL中快速渲染2万个矩形

来自分类Dev

当我分配一个 backgroundImage 时,我不能让 CircleAvatar 变成一个椭圆形

来自分类Dev

LWJGL IllegalStateException

来自分类Dev

LWJGL IllegalStateException