JOGL,Animator,Scaling,Overlay

时间:2015-10-27 17:48:52

标签: java opengl graphics jogl

我有两个图形对象。每个对象由数万个三角形基元组成。为了这个例子,我们只考虑两个对象为三角形 - 蓝色三角形和橙色三角形。

我想在背景中绘制一次蓝色三角形,然后使用动画制作工具将几个橙色三角形叠加在蓝色上。将蓝色三角形视为画布,将橙色三角形绘制在图案上。现在画布和橙色三角形整体旋转。另外,如何缩放整个设置并围绕不同的轴旋转它们?

在这个例子中,我希望所有橙色三角形都叠加在蓝色上。 这是SSCCE。如果您在示例中看到,蓝色三角形位于橙色上方。我希望所有的橙色三角形都在蓝色的顶部。

另外,如何从按钮单击等外部事件中清除画布并完全重新开始重绘场景?

import java.awt.EventQueue;
import javax.swing.JFrame;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.Animator;

import javax.swing.JButton;

import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class MainWin implements GLEventListener {

private JFrame frame;
private int iter = 0;
private float rotAng = 0;
private GLProfile profile;
private GLCapabilities capabilities;
private GLCanvas canvas;
private Animator animator;
private int totIter = 15;
private float scaleFac = 1f;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                MainWin window = new MainWin();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public MainWin() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 600, 450);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton btnZoom = new JButton("Zoom");
    btnZoom.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            zoomObj();
        }

        private void zoomObj() {
            canvas.invalidate();
            scaleFac -= 0.5f;
        }
    });
    frame.getContentPane().add(btnZoom, BorderLayout.NORTH);

    // Initilaize graphics profile, capabilites, canvas and animator
    profile = GLProfile.get(GLProfile.GL2);
    capabilities = new GLCapabilities(profile);
    capabilities.setNumSamples(2);
    capabilities.setSampleBuffers(true);
    canvas = new GLCanvas(capabilities);
    canvas.addGLEventListener(this);
    canvas.requestFocusInWindow();

    animator = new Animator();
    animator.add(canvas);
    animator.start();

    frame.getContentPane().add(canvas); // add to the frame
}

@Override
public void display(GLAutoDrawable drawable) {
    GL2 gl = drawable.getGL().getGL2();
    gl.glRotatef(15, 0, 1, 0); // rotate both blue and orange objects around Y axis
    gl.glScalef(scaleFac, scaleFac, scaleFac);

    //blue object
    gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_FILL);
    gl.glEnable(GL2.GL_MULTISAMPLE);
    gl.glPushMatrix();
    gl.glCallList(2);
    gl.glPopMatrix();
    gl.glDisable(GL2.GL_MULTISAMPLE);

    // orange object
    gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_LINE);
    if (iter < totIter) {
        iter++;
        rotAng = 5;
        gl.glRotatef((float) rotAng, 0, 0, 1); // rotate each iter by 5 aroung Z. Only the orange.
        gl.glEnable(GL2.GL_MULTISAMPLE);
        gl.glPushMatrix();
        gl.glCallList(1);
        gl.glPopMatrix();
        gl.glDisable(GL2.GL_MULTISAMPLE);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    if (iter == totIter - 1) {
        animator.stop();
    }

    gl.glFlush();
}

@Override
public void dispose(GLAutoDrawable drawable) {
}

@Override
public void init(GLAutoDrawable drawable) {
    GL2 gl = drawable.getGL().getGL2();
    gl.glClearColor(.0f, .0f, .2f, 0.9f);
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    // buffers for multisampling
    int buf[] = new int[1];
    int sbuf[] = new int[1];
    gl.glGetIntegerv(GL2.GL_SAMPLE_BUFFERS, buf, 0);
    gl.glGetIntegerv(GL2.GL_SAMPLES, sbuf, 0);

    initObj1(gl); // Orange
    initObj2(gl); // Blue
}

/**
 * Blue triangle. In actual code, this is a complicated 3D object made up of atleast a few tens of thousands of
 * primitives in a mesh.
 * 
 * @param gl
 */
private void initObj2(GL2 gl) {
    gl.glNewList(2, GL2.GL_COMPILE);
    gl.glColorMaterial(GL2.GL_FRONT, GL2.GL_DIFFUSE);
    gl.glEnable(GL2.GL_COLOR_MATERIAL);

    gl.glBegin(GL2.GL_TRIANGLES);
    gl.glColor4f(.2f, .5f, 0.8f, 0.5f);
    gl.glVertex3f(-0.5f, 0, 0);
    gl.glVertex3f(0.5f, 0, 0);
    gl.glVertex3f(0, 0.5f, 0);
    gl.glEnd();
    gl.glEndList();
}

/**
 * Orange Triangle. In actual code, this is a complicated 3D object made up of atleast a few tens of thousands of
 * primitives in a mesh.
 * 
 * @param gl
 */
private void initObj1(GL2 gl) {
    gl.glNewList(1, GL2.GL_COMPILE);
    gl.glColorMaterial(GL2.GL_FRONT, GL2.GL_DIFFUSE);
    gl.glEnable(GL2.GL_COLOR_MATERIAL);

    gl.glBegin(GL2.GL_TRIANGLES);
    gl.glColor4f(.95f, .45f, 0.15f, 0.5f);
    gl.glVertex3f(-1, 0, 0);
    gl.glVertex3f(1, 0, 0);
    gl.glVertex3f(0, 1, 0);
    gl.glEnd();
    gl.glEndList();
}

@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
}

}

0 个答案:

没有答案