JOGL объекты "Исчезают" при перемещении по сцене - PullRequest
0 голосов
/ 05 августа 2011

Я пытаюсь реализовать базовый физический движок в Java и использую привязки JOGL, чтобы я мог визуализировать результаты.Я могу достаточно легко создавать и вращать фигуры, но у меня возникли проблемы при манипулировании с областью просмотра и при перемещении фигур.

Я не думаю, что проблема с отсечкой - я пытался использовать метод gluPerspective с массивнымдиапазон (0,0001f - 10000f) без успеха.Когда я перемещаю камеру подальше от своих объектов или перемещаю сами объекты, они исчезают.

Учебники по JOGL немногочисленны, и многие также используют разные версии OpenGL, поэтому я обращаюсь к единственному другу, которого яоставили: замечательные пользователи переполнения стека.:)

Лесть в стороне, код выглядит следующим образом:

public class JoglEventListener implements GLEventListener, KeyListener, MouseListener, MouseMotionListener {
// keep pointer to associated canvas so we can refresh the screen (equivalent to glutPostRedisplay())     
public GLCanvas canvas;
public Particle triforce;
public float x;

// constructor
public JoglEventListener(GLCanvas canvas) {
    this.canvas = canvas;
}

@Override
public void display(GLAutoDrawable drawable) {
    update();
    render(drawable);
}

@Override
public void init(GLAutoDrawable drawable) {
    triforce = new Particle();
    x = 0;
}

private void update() {
    triforce.integrate(0.0001);
    x = x + 0.25f;
}

 private void render(GLAutoDrawable drawable) {
    GL2 gl = drawable.getGL().getGL2();
    GLU glu = new GLU();

    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL2.GL_PROJECTION);        
    gl.glLoadIdentity();
    //gl.glFrustum (.5f, -.5f, -.5f * 1080, .5f * 960, 1.f, 500.f);
    glu.gluPerspective(0, 1, 0.1f, 100f);        


    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
    gl.glHint(GL2.GL_CLIP_VOLUME_CLIPPING_HINT_EXT,GL2.GL_FASTEST);
    glu.gluLookAt(0, 0, 1.5, 0, 0, -10, 0, 1, 0);        
    //gl.glRotatef(90, 0f , 1f , 0f );
    //Draw some scale lines
    gl.glBegin(GL.GL_LINES);
    gl.glColor3f(0.75f, 0.75f, 0.75f);
    for (int i = 0; i < 20; i += 1)
    {
        gl.glVertex3f(-5.0f, 0.0f, i + 0.5f);
        gl.glVertex3f(5.0f, 0.0f, i + 0.5f);
    }
    gl.glEnd();

    //gl.glRotatef(x, 1f , 1f , 1f );         

    gl.glPushMatrix();
    gl.glTranslated(triforce.position.x, triforce.position.y, triforce.position.z);
    gl.glBegin(GL.GL_TRIANGLE_STRIP);                       
    gl.glColor3f(1f, 0f, 0f);                       
    gl.glVertex3d(0, 0, -2);
    gl.glColor3f(0f, 1f, 0f);                       
    gl.glVertex3d(0, 0.25d, -2);                
    gl.glColor3f(0f, 0f, 1f);                       
    gl.glVertex3d(0.25d, 0, -2);
    gl.glColor3f(1f, 1f, 0f);                       
    gl.glVertex3d(0.25d, 0.25d, -2.25d);
    gl.glEnd();                                       
    gl.glPopMatrix();

    gl.glFlush();
}

// (пустые переопределенные методы опущены)

public Particle () {
    setMass(200d);
    velocity = new Vector3(0d, 30d, 40d);
    acceleration = new Vector3(0d, -20d, 0d);
    position = new Vector3(0d, 0d, 0d);
    damping = 0.99d;
}

public void integrate (double duration) {
    if (inverseMass <= 0.0d) {
        return;
    }
    assert (duration > 0.0);
    position.addScaledVector(velocity, duration);
    Vector3 resultingAcc = new Vector3(acceleration.x, acceleration.y, acceleration.z);
    velocity.addScaledVector(resultingAcc, duration);
    velocity.multEquals(Math.pow(damping, duration));
    //clearAccumulator();
}

public void setMass(double mass)
{
    assert(mass != 0);
    inverseMass = (1.0d)/mass;
}    

Перед перемещением / стартовой позицией:

Before

Форма смещается вверх и скрывается справа и сверху, становясь невидимой:

During

Любая помощь будет принята с благодарностью!Спасибо!

Ответы [ 4 ]

1 голос
/ 05 июня 2017

В функции render измените значение последнего параметра gluPerspective со 100f на 1000f. Это решит вашу проблему.

gl.gluPerspective(0, 1, 0.1f, 100f);

до

gl.gluPerspective(0, 1, 0.1f, 500f);

И я думаю, что в вашем коде вы допустили ошибку в написании строки выше glu.gluperspective

Я думаю, что это gl.gluPerspective.

1 голос
/ 05 апреля 2013

У меня была такая же проблема.Объекты исчезают, а некоторые остаются на сцене.После удаления:

gl.glEnable(GL2.GL_CULL_FACE);

все работало просто отлично!Конечно, это код JOGL, в Си команда будет без всех этих объектов.Просто чтобы этот ответ был понятен всем.

1 голос
/ 05 августа 2011

Огромный диапазон обзора может быть проблемой. Координаты объектов только настолько точны, и с огромным диапазоном обзора вещи, которые должны быть рядом друг с другом, определяются как находящиеся в одной точке. Это может привести к тому, что объект, который должен находиться перед другим, исчезнет за ним. Попробуйте использовать меньший диапазон просмотра.

0 голосов
/ 02 сентября 2011

В конце концов, я так и не смог отследить проблему и начал все заново. Я не столкнулся с какими-либо дальнейшими проблемами с обрезкой в ​​моей новой сборке.

Мое лучшее предположение относительно моей первоначальной ошибки - неправильно используемый вызов glHint или glClear, или, возможно, какая-то проблема с версией JOGL, на которую я ссылался.

...