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