es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo rellenar una forma Java en OpenGL?

Bien, digamos que tengo la forma de una O y quiero representarla.
enter image description here

Ahora mi código de representación actual es este:

public void fill(Shape shape, float xOffset, float yOffset) {
        AffineTransform transform = new AffineTransform();
        transform.translate(xOffset, yOffset);
        PathIterator pi = shape.getPathIterator(transform, 1);
        int winding = pi.getWindingRule();
        ShapeRenderer r = getInstance();
        float[] coords = new float[6];
        boolean drawing = false;
        while (!pi.isDone()) {
            int segment = pi.currentSegment(coords);
            switch (segment) {
            case PathIterator.SEG_CLOSE:
                if (drawing) {
                    r.endPoly();
                }
                break;
            case PathIterator.SEG_LINETO:
                r.lineTo(coords);
                break;
            case PathIterator.SEG_MOVETO:
                if (drawing) {
                    r.endPoly();
                }
                drawing = true;
                r.beginPoly(winding);
                r.moveTo(coords);
                break;
            default:
                throw new IllegalArgumentException("Valor inesperado: " + segment);
            }
            pi.next();
        }
    }

ShapeRenderer:

private final Deque<><float>> vertices = new ConcurrentLinkedDeque<>();

@Override
public void beginPoly(int windingRule) {
}

@Override
public void endPoly() {
    Queue<float> q;
    GL11.glBegin(GL11.GL_LINE_LOOP);
    while ((q = vertices.poll()) != null) {
        Float x, y;
        while ((x = q.poll()) != null && (y = q.poll()) != null) {
            GL11.glVertex2f(x, y);
        }
    }
    GL11.glEnd();
}

@Override
public void moveTo(float[] vertex) {
    Queue<float> q = new ConcurrentLinkedQueue<>();
    vertices.offer(q);
    lineTo(vertex);
}

@Override
public void lineTo(float[] vertex) {
    Queue<float> q = vertices.peekLast();
    q.offer(vertex[0]);
    q.offer(vertex[1]);
}

Entonces, digamos que quiero rellenar esa forma, al igual que lo hace Java AWT, con éxito… ¿Cómo lo haría? (Ya intenté usar GL_POLYGON, pero solo rellena toda la O y yo tengo un círculo relleno, no una O. También intenté usar partes de jogamp glu pero no se renderizó nada, sin idea de por qué)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para completar la forma de una O utilizando OpenGL, puedes modificar el código de renderizado actual de la siguiente manera:

    • Reemplaza GL11.GL_LINE_LOOP con GL11.GL_TRIANGLE_FAN en ShapeRenderer.endPoly(). Esto dibujará un círculo relleno.
    • Agrega una verificación para saltar el centro del círculo en ShapeRenderer.beginPoly(), ya que solo queremos dibujar la forma de una O. Puedes hacer esto agregando el siguiente código después de GL11.glBegin(GL11.GL_TRIANGLE_FAN);:
        if (windingRule == PathIterator.WIND_NON_ZERO) {
            // Omitir centro para regla de enroscamiento no cero
            GL11.glVertex2f(0, 0);
        }
    
    • Por último, cambia fill(Shape shape, float xOffset, float yOffset) para llamar a ShapeRenderer.beginPoly(GL11.GL_TRIANGLE_FAN) en lugar de ShapeRenderer.beginPoly(1). Esto utilizará la regla de enroscamiento no cero y aplicará la lógica de omitir el centro mencionada anteriormente.

    Con estos cambios, deberías poder llenar la forma de una O utilizando OpenGL con la función fill() modificada.

Comments are closed.