gpt4 book ai didi

java - 在场景中移动时 JOGL 对象 "Disappearing"

转载 作者:行者123 更新时间:2023-12-02 00:38:56 27 4
gpt4 key购买 nike

我正在尝试用 Java 实现一个基本的物理引擎,并且使用 JOGL 绑定(bind),以便可以可视化结果。我可以轻松地创建和旋转形状,但在操作视口(viewport)和移动形状时遇到了问题。

我不认为存在裁剪问题 - 我尝试使用大范围(0.0001f - 10000f)的 gluPerspective 方法,但没有成功。当我将相机移离物体或移动物体本身时,它们就会消失。

关于 JOGL 的教程少之又少,而且许多教程还使用不同版本的 OpenGL,所以我求助于我唯一剩下的 friend :堆栈溢出的优秀用户。 :)

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

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

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

最佳答案

巨大的视野范围可能是一个问题。物体的坐标只有这么精确,而且视野范围很大,本来应该靠近的东西都被判定在同一个点上。这可能会导致一个应该位于另一个物体前面的物体消失在另一个物体后面。尝试使用较小的 View 范围。

关于java - 在场景中移动时 JOGL 对象 "Disappearing",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6957572/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com