Java “JOGL对象”;“消失”;在场景中移动时

Java “JOGL对象”;“消失”;在场景中移动时,java,opengl,jogl,Java,Opengl,Jogl,我正在尝试用Java实现一个基本的物理引擎,我正在使用JOGL绑定,以便能够可视化结果。我可以很容易地创建和旋转形状,但在操作视口和移动形状时遇到了问题 我不认为这是一个剪辑问题——我曾尝试过在大范围(0.0001f-10000f)内使用gluPerspective方法,但没有成功。当我将相机移离我的对象或移动对象本身时,它们会消失 关于JOGL的教程很少,而且很多都使用不同版本的OpenGL,所以我转向我唯一剩下的朋友:stack overflow的优秀用户。:) 撇开奉承不谈,代码如下: p

我正在尝试用Java实现一个基本的物理引擎,我正在使用JOGL绑定,以便能够可视化结果。我可以很容易地创建和旋转形状,但在操作视口和移动形状时遇到了问题

我不认为这是一个剪辑问题——我曾尝试过在大范围(0.0001f-10000f)内使用gluPerspective方法,但没有成功。当我将相机移离我的对象或移动对象本身时,它们会消失

关于JOGL的教程很少,而且很多都使用不同版本的OpenGL,所以我转向我唯一剩下的朋友:stack overflow的优秀用户。:)

撇开奉承不谈,代码如下:

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();
}
公共类JoglEventListener实现了GLEventListener、KeyListener、MouseListener、MouseMotionListener{
//保持指向关联画布的指针,以便刷新屏幕(相当于glutPostRedisplay())
公共画布;
公共粒子三位一体;
公共浮动x;
//建造师
公共JoglEventListener(GLCanvas画布){
this.canvas=画布;
}
@凌驾
公共空白显示(GLAutoDrawable){
更新();
渲染(可绘制);
}
@凌驾
公共void init(GLAutoDrawable){
triforce=新粒子();
x=0;
}
私有void更新(){
三力积分(0.0001);
x=x+0.25f;
}
私有void渲染(GLAutoDrawable){
GL2 gl=drawable.getGL().getGL2();
GLU-GLU=新的GLU();
gl.glClear(gl.gl_颜色_缓冲_位| gl.gl_深度_缓冲_位);
gl.glMatrixMode(GL2.gl_投影);
gl.glLoadIdentity();
//gl.gl平截头体(.5f、.5f、.5f*1080、.5f*960、1.f、500.f);
glu.glu(0,1,0.1f,100f);
gl.glMatrixMode(GL2.gl\u MODELVIEW);
gl.glLoadIdentity();
gl.glHint(GL2.gl\u CLIP\u VOLUME\u CLIPPING\u HINT\u EXT,GL2.gl\u faster);
glu.gluLookAt(0,0,1.5,0,0,-10,0,1,0);
//gl.glRotatef(90,0楼,1楼,0楼);
//画一些比例线
总帐总帐开始(总帐总帐行);
gl.glColor3f(0.75f,0.75f,0.75f);
对于(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\U三角形\U带);
gl.GL3F(1f、0f、0f);
gl.glVertex3d(0,0,-2);
gl.GL3F(0f,1f,0f);
gl.glVertex3d(0,0.25d,-2);
gl.GL3F(0f,0f,1f);
gl.glVertex3d(0.25d,0,-2);
gl.GL3F(1f、1f、0f);
gl.glVertex3d(0.25d,0.25d,-2.25d);
gl.glEnd();
gl.glPopMatrix();
gl.glFlush();
}
//(省略空的重写方法)

公共粒子(){
设定质量(200d);
速度=新矢量3(0d、30d、40d);
加速度=新矢量3(0d,-20d,0d);
位置=新矢量3(0d,0d,0d);
阻尼=0.99d;
}
公共空间整合(双倍持续时间){
如果(逆质量0.0);
位置.addScaledVector(速度、持续时间);
Vector3 resultingAcc=新的Vector3(加速度.x,加速度.y,加速度.z);
velocity.addScaledVector(结果ACC,持续时间);
速度。多重质量(数学。功率(阻尼,持续时间));
//清除累加器();
}
公共空间设置质量(双质量)
{
断言(质量!=0);
逆质量=(1.0d)/质量;
}    
移动/开始位置前:

形状向上漂移,从右侧和顶部模糊,变得不可见:


任何帮助都将不胜感激!谢谢!

巨大的视野范围可能是一个问题。对象的坐标非常精确,在巨大的视野范围内,应该彼此靠近的对象被确定在同一点上。这可能会导致应该在另一个对象前面的对象消失在后面。请尝试使用较小的视图范围。

较大的视图范围可能是一个问题。对象的坐标非常精确,在较大的视图范围内,应该彼此靠近的对象被确定在同一点上。这可能会导致位于另一个对象前面的对象消失在后面。请尝试使用较小的视图范围。

最后,我一直无法追踪到这个问题,重新开始。我没有在我的新版本中遇到任何进一步的剪辑问题


对于我最初的失败,我的最佳猜测是一个使用不当的glHint或glClear调用,或者可能是我引用的JOGL版本有问题。

最后,我无法跟踪问题,重新开始。我的新版本没有遇到任何进一步的剪辑问题


对于我最初的失败,我的最佳猜测是使用不当的glHint或glClear调用,或者可能是我引用的JOGL版本有问题。

我也有同样的问题。对象消失,而一些保留在场景中。删除后:

gl.glEnable(GL2.GL_CULL_FACE);

一切正常!当然,这是JOGL代码,在C中,命令将不包含所有这些对象。只是为了让每个人都清楚地知道这个答案。

我也遇到了同样的问题。对象消失,而一些对象保留在场景中。移除后:

gl.glEnable(GL2.GL_CULL_FACE);

一切正常!当然这是JOGL代码,在C中,该命令将不包含所有这些对象。为了让每个人都清楚地知道这个答案。

渲染
函数中,将
透视
的最后一个参数的值从100f更改为1000f。这将解决您的问题

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

我认为在你的代码中,你在上面的代码中犯了一个错误

我想是
gl.glu
gl.gluPerspective(0, 1, 0.1f, 500f);