Hallo allo zusammen,
ich habe ein bescheidenes Problem mit JOGL/ LWJGL mit SWT. Ich muss aber sagen, dass ich ein totaler Anfänger bin bzgl. OpenGL. OpenGL binge ich mir selber bei und mache dies aber in C++. Dabei ist mir aufgefallen, dass eine wichtige Sache nicht richtig funktioniert. Ich habe eine einfache 3-d-Szene erstellt. Darin habe ich 2 Flächen mit einen y-Abstand übereinander gelegt unterschiedlicher Farben. Die Szene ist durch einen Mouse-Action-Listener drehbar und skalierbar. Und hier kommt der Fehler: Egal wie ich die Szene drehe, die zuletzt gezeichnete Fläche überdeckt immer die jeweils davorgezeichnete Fläche. Ich habe den Code für das Zeichnen der Flächen in Visual-C++ ausprobiert, die Initialisierung ist ebenfalls identisch - funktioniert tadellos. Habe ich im Code vielleicht doch einen Fehler drin oder ist das nen bekannter Bug ? Nun der Code und anbei noch ein Screenshot.
Hier die Klasse für die Interaktion:
Ich hoffe jemand kann mir hier weiterhelfen.
ich habe ein bescheidenes Problem mit JOGL/ LWJGL mit SWT. Ich muss aber sagen, dass ich ein totaler Anfänger bin bzgl. OpenGL. OpenGL binge ich mir selber bei und mache dies aber in C++. Dabei ist mir aufgefallen, dass eine wichtige Sache nicht richtig funktioniert. Ich habe eine einfache 3-d-Szene erstellt. Darin habe ich 2 Flächen mit einen y-Abstand übereinander gelegt unterschiedlicher Farben. Die Szene ist durch einen Mouse-Action-Listener drehbar und skalierbar. Und hier kommt der Fehler: Egal wie ich die Szene drehe, die zuletzt gezeichnete Fläche überdeckt immer die jeweils davorgezeichnete Fläche. Ich habe den Code für das Zeichnen der Flächen in Visual-C++ ausprobiert, die Initialisierung ist ebenfalls identisch - funktioniert tadellos. Habe ich im Code vielleicht doch einen Fehler drin oder ist das nen bekannter Bug ? Nun der Code und anbei noch ein Screenshot.
Code:
package diagramtest.jogl;
import javax.media.opengl.GL;
import javax.media.opengl.GLContext;
import javax.media.opengl.GLException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
public class Cube extends GLScene {
private SceneGrip grip;
public Cube(Composite comp) {
super(comp);
this.grip = new SceneGrip();
this.grip.setOffsets(0.0f, 0.0f, -15.0f);
this.grip.setRotation(45.0f, -30.0f);
this.getCanvas().addMouseListener(this.grip);
this.getCanvas().addMouseMoveListener(this.grip);
this.getCanvas().addListener(SWT.MouseWheel, this.grip);
this.getCanvas().addKeyListener(this.grip);
}
protected void initGL() {
super.initGL();
try {
if (GLContext.getCurrent() != this.getGLContext()) {
this.getGLContext().makeCurrent();
}
float LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
float LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
float LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };
GL gl = getGLContext().getGL();
gl.glShadeModel(GL.GL_SMOOTH); // Enable Smooth Shading
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
gl.glClearDepth(1.0f); // Depth Buffer Setup
gl.glEnable(GL.GL_DEPTH_TEST); // Enables Depth Testing
gl.glDepthFunc(GL.GL_LEQUAL); // The Type Of Depth Testing To Do
gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); // Really Nice Perspective Calculations
gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, LightAmbient, 0); // Setup The Ambient Light
gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE, LightDiffuse, 0); // Setup The Diffuse Light
gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION,LightPosition, 0); // Position The Light
gl.glEnable(GL.GL_LIGHT1); // Enable Light One
gl.glColor4f(1.0f, 1.0f, 1.0f, 0.5f); // Full Brightness. 50% Alpha
gl.glBlendFunc(GL.GL_SRC_ALPHA,GL.GL_ONE); // Set The Blending Function For Translucency
this.getGLContext().release();
} catch (GLException ex) {
ex.printStackTrace();
}
}
@Override
protected void drawScene() {
try {
if (GLContext.getCurrent() != this.getGLContext()) {
this.getGLContext().makeCurrent();
}
GL gl = this.getGLContext().getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
this.grip.adjust(gl);
gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
gl.glBegin(GL.GL_QUADS);
gl.glVertex3f(-6.0f, 0.0f, -9.0f);
gl.glVertex3f(9.0f, 0.0f, -9.0f);
gl.glVertex3f(9.0f, 0.0f, 2.0f);
gl.glVertex3f(-6.0f, 0.0f, 2.0f);
gl.glEnd();
gl.glTranslatef(0.0f, -3.0f, 0.0f);
gl.glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
gl.glBegin(GL.GL_QUADS);
gl.glVertex3f(-6.0f, 0.0f, -9.0f);
gl.glVertex3f(9.0f, 0.0f, -9.0f);
gl.glVertex3f(9.0f, 0.0f, 2.0f);
gl.glVertex3f(-6.0f, 0.0f, 2.0f);
gl.glEnd();
this.getGLContext().release();
} catch (GLException ex) {
ex.printStackTrace();
}
}
}
Code:
package diagramtest.jogl;
import javax.media.opengl.GL;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
public class SceneGrip extends MouseAdapter implements MouseMoveListener, Listener, KeyListener{
private float xrot;
private float yrot;
private float zoff;
private float xoff;
private float yoff;
private float xcpy;
private float ycpy;
private boolean move;
private int xdown;
private int ydown;
private int mouseDown;
public SceneGrip() {
this.init();
}
protected void init() {
this.xrot = this.yrot = 0.0f;
this.xoff = this.yoff = 0.0f;
this.zoff = -8.0f;
}
public void mouseDown(MouseEvent e) {
if (++ this.mouseDown == 1) {
if ((this.move = e.button == 3)) {
this.xcpy = xoff;
this.ycpy = yoff;
((Control) e.widget).setCursor(e.widget.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
} else {
this.xcpy = xrot;
this.ycpy = yrot;
((Control) e.widget).setCursor(e.widget.getDisplay().getSystemCursor(SWT.CURSOR_SIZEALL));
}
this.xdown = e.x;
this.ydown = e.y;
}
}
public void mouseUp(MouseEvent e) {
if (-- this.mouseDown == 0) {
((Control) e.widget).setCursor(e.widget.getDisplay().getSystemCursor(SWT.CURSOR_ARROW));
}
}
public void mouseMove(MouseEvent e) {
Point p = ((Control) e.widget).getSize();
if (this.mouseDown > 0) {
int dx = e.x - this.xdown;
int dy = e.y - this.ydown;
if (this.move) {
yoff = this.ycpy + ((zoff + 1.0f)*dy)/(2.0f*p.y);
xoff = this.xcpy - ((zoff + 1.0f)*dx)/(2.0f*p.x);
} else {
xrot = this.xcpy + dy/2.0f;
yrot = this.ycpy + dx/2.0f;
}
}
}
public void handleEvent(Event event) {
this.zoff += event.count/6.0f;
}
public void keyPressed(KeyEvent e) {
switch (e.keyCode) {
case SWT.ARROW_UP:
if ((e.stateMask & SWT.CTRL) != 0) {
this.xrot -= 0.5f;
} else {
this.yoff += 0.05f;
}
break;
case SWT.ARROW_DOWN:
if ((e.stateMask & SWT.CTRL) != 0) {
this.xrot += 0.5f;
} else {
this.yoff -= 0.05f;
}
break;
case SWT.ARROW_LEFT:
if ((e.stateMask & SWT.CTRL) != 0) {
this.yrot -= 0.5f;
} else {
this.xoff -= 0.05f;
}
break;
case SWT.ARROW_RIGHT:
if ((e.stateMask & SWT.CTRL) != 0) {
this.yrot += 0.5f;
} else {
this.xoff += 0.05f;
}
break;
case SWT.PAGE_UP:
this.zoff += 0.05f;
break;
case SWT.PAGE_DOWN:
this.zoff -= 0.05f;
break;
case SWT.HOME:
this.init();
break;
}
}
public void keyReleased(KeyEvent e) {
}
public void adjust(GL gl) {
gl.glTranslatef(this.xoff, this.yoff, this.zoff);
gl.glRotatef(this.xrot, 1.0f, 0.0f, 0.0f);
gl.glRotatef(this.yrot, 0.0f, 1.0f, 0.0f);
}
public void setOffsets(float x, float y, float z) {
this.xoff = x;
this.yoff = y;
this.zoff = z;
}
public void setRotation(float x, float y) {
this.xrot = x;
this.yrot = y;
}
}
Ich hoffe jemand kann mir hier weiterhelfen.