OpenGL Plugin ¸¸µé±â (2007/8/13)

JLab Çã¿øÁø

¡¡

SWT 3.2ºÎÅÍ OpenGLÀ» À§ÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇϰí ÀÖ´Ù. À̸¦ ÀÌ¿ëÇÏ¿© OpenGL Ç÷¯±×ÀÎÀ» ¸¸µé¾îº¸ÀÚ.

¡¡

½ÃÀÛ Áغñ

PDE¿¡ ´ëÇÑ ÀÌÇØ°¡ ÃæºÐÇÏ´Ù¸é ÀÚ½ÅÀÌ ¿øÇÏ´Â º¥´õÀÇ OpenGL ¶óÀ̺귯¸®¸¦ ¼±ÅÃÇÏÀÚ. OpenGL API´Â ÇÔ¼ö ÇüŰ¡ ¸ðµÎ °°±â ¶§¹®¿¡ ÀÚ½ÅÀÌ ¼±È£ÇÏ´Â ¶óÀ̺귯¸®¸¦ »ç¿ëÇØµµ »ó°ü ¾ø´Ù. ´ÙÀ½°ú °°Àº Áغñ°¡ ÇÊ¿äÇÏ´Ù.

Eclipse 3.2 ÀÌ»óÀÇ SDK ¶Ç´Â SWT 3.2

OpenGL Java ¶óÀ̺귯¸®

SWT 3.2´Â Eclipse 3.2 SDK¿¡ ±âº»À¸·Î Æ÷ÇԵǾî ÀÖ´Ù. ÀÌ ±â»ç¿¡¼­ OpenGL ¶óÀ̺귯¸®´Â Lightweight Java Game Library (LWJGL) 1.1.1 ¹öÀüÀ» »ç¿ëÇß´Ù. ÀÚ±â Ç÷§Æû¿¡ ¸Â´Â ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇÏ¸é µÈ´Ù.

 

PDE ÇÁ·ÎÁ§Æ®¸¦ ¸¸µéÀÚ

PDE ÇÁ·ÎÁ§Æ® ¸ð½À

ÀÚ½ÅÀÇ »ç¿ëÇÏ´Â OpenGL ¶óÀ̺귯¸®¸¦ ÇÁ·ÎÁ§Æ® Æú´õ¿¡ º¹»çÇϰųª º°µµÀÇ Ç÷¯±×ÀÎÀ¸·Î ÆÐÅ°Â¡ÇØ¾ßÇÑ´Ù.

 

plugin.xml

ÇÁ·ÎÁ§Æ® Æú´õ ³»¿¡ º¹»çÇÒ °æ¿ì À§¿Í°°ÀÌ Å¬·¡½ºÆÐ½º¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù.

 

OpenGL Viewer¸¦ ¸¸µéÀÚ ¡¡

OpenGL ºä¾îµµ ÀÏ¹Ý PDE ºä¾î¿Í °°´Ù. ´ÜÁö creareControl ¸Þ¼Òµå¸¦ OpenGL¿¡ ¸Â°Ô ¿À¹ö¶óÀ̵ù ÇßÀ»»ÓÀÌ´Ù. ¼ø¼ö OpenGL API ¼³¸íÀ̳ª GraphicsÀ̷п¡ ´ëÇÑ ¼³¸íÀº »ý·«ÇϰڴÙ.

  /**
   * This is a callback that will allow us to create the viewer and initialize
   * it.
   */
  public void createPartControl(Composite parent) {
    parent.setLayout(new FillLayout());
    GLData data = new GLData();
    data.doubleBuffer = true;
    canvas = new GLCanvas(parent, SWT.NONE, data);

    canvas.setCurrent();
    try {
      GLContext.useContext(canvas);
    catch (LWJGLException e) {
      e.printStackTrace();
    }

    canvas.addListener(SWT.Resize, new Listener() {
      public void handleEvent(Event event) {
        Rectangle bounds = canvas.getBounds();
        float fAspect = (floatbounds.width / (floatbounds.height;
        canvas.setCurrent();
        try {
          GLContext.useContext(canvas);
        catch (LWJGLException e) {
          e.printStackTrace();
        }
        GL11.glViewport(00, bounds.width, bounds.height);
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GLU.gluPerspective(45.0f, fAspect, 0.5f400.0f);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glLoadIdentity();
      }
    });

    GL11.glClearColor(1.0f1.0f1.0f1.0f);
    GL11.glColor3f(1.0f0.0f0.0f);
    GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
    GL11.glClearDepth(1.0);
    GL11.glLineWidth(2);
    GL11.glEnable(GL11.GL_DEPTH_TEST);

    Refresher refresher = new Refresher(this);
    refresher.start();
  }


  public void draw3D() {
    if (!canvas.isDisposed()) {
      canvas.setCurrent();
      try {
        GLContext.useContext(canvas);
      catch (LWJGLException e) {
        e.printStackTrace();
      }
      GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
      GL11.glClearColor(.3f.5f.8f1.0f);
      GL11.glLoadIdentity();
      GL11.glTranslatef(0.0f0.0f, -10.0f);
      float frot = rot;
      GL11.glRotatef(0.15f * rot, 2.0f * frot, 10.0f * frot, 1.0f);
      GL11.glRotatef(0.3f * rot, 3.0f * frot, 1.0f * frot, 1.0f);
      rot++;
      GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
      GL11.glColor3f(0.9f0.9f0.9f);
      drawTorus(11.9f ((floatMath.sin((0.004f * frot)))1515);
      drawTorus(11.9f ((floatMath.sin((0.004f * frot)))3030);

    }

  }

}

class Refresher extends Thread {
  public static final int DELAY = 10;

  private GLCanvas scene;

  JLab3DPlane plane;

  public Refresher(JLab3DPlane scene) {
    this.scene = scene.get3DCanvas();
    plane = scene;
  }

  public void run() {
    if (this.scene != null && !this.scene.isDisposed()) {
      this.scene.getDisplay().asyncExec(new Runnable() {

        public void run() {
          // while (true) {
          // plane.draw3D();
          // scene.swapBuffers();
          // try {
          // sleep(10);
          // } catch (InterruptedException e) {
          // // TODO Auto-generated catch block
          // e.printStackTrace();
          // }
          // }
          plane.draw3D();
          scene.swapBuffers();
          scene.getDisplay().timerExec(DELAY, this);
        }
      });

    }
  }
}

SWTÀÇ canvas widgetÀº ÄÁÆ®·ÑÀ» À§ÇÑ °ø°£À» Á¦°øÇÏÁö¸¸, ÀÌ Ä˹ö½º´Â 3D Ãâ·ÂÀ» À§ÇÑ 3D °ø°£À» Á¦°øÇÑ´Ù.

ºäÀÇ Å©±â°¡ º¯ÇüµÇ¸éview port³ª perspectiveµµ ¹Ù²ï´Ù. À̸¦ ó¸®Çϱâ À§ÇÑ ÄÚµåÀÌ´Ù.

ÇÑÀåÀÇ 3DÈ­¸éÀ» Ãâ·ÂÇϱâ À§ÇÑ ÄÚµåÀÌ´Ù. ¿¡´Ï¸ÞÀ̼ÇÀ» »ý°¢ÇÏ¸é µÈ´Ù.

ÀÇ Äڵ带 ÀÏÁ¤ ÁÖ±â·Î ÄÝÇØÁÖ´Â ÄÚµåÀÌ´Ù. ÀÌ Äڵ尡 ¾øÀ» °æ¿ì Çѹø Ãâ·ÂµÈ ÈÄ ´Ù½Ã Ãâ·ÂµÇÁö ¾Ê±â¶§¹®¿¡ canvas À§·Î ´Ù¸¥ À©µµ¿ì°¡ Áö³ª°¡°Å³ª »çÀÌÁî°¡ º¯ÇüµÇ¸é ¿µ¿ªÀÌ È¸¼ÕµÈ´Ù. ÀÌ Äڵ带 ÁÖ¼® ó¸®ÇÑ ºÎºÐ°ú °°ÀÌ Ã³¸®Çϸé SWT Queue´Â ºí·Ï µÈ´Ù. Job Queue¿¡ ¹«ÇÑ ·çÇÁ°¡ µé¾î°¥ °æ¿ì ´ÙÀ½ Queue¿¡ ÀÖ´Â ÀÏÀ» ó¸®ÇÒ ¼ö ¾ø´Ù.

Display¿Í Job Queue °ü°è

À§ ±×¸²À» º¸¸é Job queue¿¡ 4°³ÀÇ JobÀÌ µé¾î ÀÖ´Ù. ÇÏÁö¸¸ 3¹øÂ° Job¿¡ ÀÇÇØ¼­ ÀÌÈÄ ¹ß»ýÇÏ´Â JobÀ» ó¸®ÇÒ ¼ö°¡ ¾ø´Ù. SWT¿¡¼­ ÁÖÀÇÇØ¾ßÇÒ ºÎºÐÀÌ´Ù. ½ÇÁ¦·Î ÁÖ¼® ó¸®ÇÑ ºÎºÐÀ¸·Î Äڵ带 ¹Ù²Ù°Ô µÇ¸é Æ©ºê°¡ µ¹¾Æ°¡´Â ¸ð½ÀÀº º¸ÀÌÁö¸¸ ÀÌŬ¸³½º ¿öÅ©¹êÄ¡´Â ÀüÇô µ¿ÀÛÀ» ¸øÇÑ´Ù.

 

OpenGL ViewerÀÇ ¸ð½À

OpenGL API¸¦ »ç¿ëÇØº» °æÇèÀÌ ÀÖ´Ù¸é ±âÁ¸ÀÇ OpenGL ¾îÇø®ÄÉÀ̼ÇÀ» Ç÷¯±×ÀÎÀ¸·Î ½±°Ô Æ÷ÆÃÇÒ ¼ö ÀÖÀ»°ÍÀÌ´Ù.

ÀÌ ±â»çÀÇ ÄÚµåÁß GLCanvas ÃʱâÈ­¿Í Æ©ºê±×¸®´Â ÄÚµå´Â org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet195.java ¸¦ ÀοëÇß´Ù.

[¼Ò½º ÄÚµå ´Ù¿î·Îµå]


About Author

Çã¿øÁø

Á¦ÀÌ·¦ ´ëÇ¥ ¿î¿µÀÚ, Total Eclipse ´ëÇ¥ ÀúÀÚ, Eclipse Consultant, Juliet Scandal Project Leader. ÀÌŬ¸³½º ÇÁ·ÎÁ§Æ®µéÀ» Àû±Ø ÀÌ¿ëÇØ¼­ Àúºñ¿ëÀ¸·Î Äè¼Ó°³¹ßÀ» Çϴµ¥ °ü½ÉÀÌ ¸¹´Ù. Contact


www.jlab.net

ÀÌ ÄÁÅÙÃ÷´Â JPL¿¡ ÀÇÇØ¼­ º¸È£ ¹Þ½À´Ï´Ù. ¿ÀÅ» ÀÚ³ª °ÇÀÇ´Â À̰÷¿¡ ÇØÁֽʽÿÀ

¡¡