| 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 = (float) bounds.width / (float) bounds.height;
canvas.setCurrent();
try {
GLContext.useContext(canvas);
} catch (LWJGLException e) {
e.printStackTrace();
}
GL11.glViewport(0, 0, bounds.width, bounds.height);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45.0f, fAspect, 0.5f, 400.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
}
});
GL11.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
GL11.glColor3f(1.0f, 0.0f, 0.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, .8f, 1.0f);
GL11.glLoadIdentity();
GL11.glTranslatef(0.0f, 0.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.9f, 0.9f, 0.9f);
drawTorus(1, 1.9f + ((float) Math.sin((0.004f * frot))), 15, 15);
drawTorus(1, 1.9f - ((float) Math.sin((0.004f * frot))), 30, 30);
}
}
}
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¿¡ ÀÇÇØ¼ º¸È£ ¹Þ½À´Ï´Ù. ¿ÀÅ» ÀÚ³ª °ÇÀÇ´Â À̰÷¿¡ ÇØÁֽʽÿÀ
¡¡