Java 爪哇及;OpenGL;使用增量计算与帧无关的移动时渲染瑕疵

Java 爪哇及;OpenGL;使用增量计算与帧无关的移动时渲染瑕疵,java,opengl,lwjgl,delta,Java,Opengl,Lwjgl,Delta,所以,作为练习,我一直在使用opengl用java制作一个小的演示程序。在我实现getTime()之前,一切都进展顺利;和getDelta();函数来计算每帧所需的时间。然后,我将它们的速度乘以getDelta(),将其应用到我所有的运动计算中;它工作得很好,只是当帧随机轻微下降时,getDelta();返回稍大一点的值,我的计算开始输出非常奇怪的值,这些值仍然在计算计算的移动范围内,但不正确,这会发生在几帧内,直到帧速率上升到正常值(在本例中为250FPS),移动继续正常,甚至从确切位置开始。

所以,作为练习,我一直在使用opengl用java制作一个小的演示程序。在我实现getTime()之前,一切都进展顺利;和getDelta();函数来计算每帧所需的时间。然后,我将它们的速度乘以getDelta(),将其应用到我所有的运动计算中;它工作得很好,只是当帧随机轻微下降时,getDelta();返回稍大一点的值,我的计算开始输出非常奇怪的值,这些值仍然在计算计算的移动范围内,但不正确,这会发生在几帧内,直到帧速率上升到正常值(在本例中为250FPS),移动继续正常,甚至从确切位置开始。我不知道这是什么原因,因为getDelta();似乎功能正常

下面是一些代码:

private void movementCalculations(double delta) {

    sinInc += 0.0015;
    sinInc2 += 0.010;

    xMove[0] = xSpeed * (float) Math.sin(Math.toDegrees(sinInc / 100 * delta)) * 7500;
    yMove[0] = ySpeed * (float) Math.sin(Math.toDegrees(sinInc / 200 * Math.PI * delta)) * 2500;
    zMove[0] = zSpeed * (float) Math.sin(Math.toDegrees(sinInc / 200 * delta)) * 1250;

    for (int i = 1; i<16; i++) {
        xMove[i] = xSpeed * (float) Math.sin(sinInc2 / 128 * Math.PI * i/2 * delta) * WIDTH * 16;
        yMove[i] = ySpeed * (float) Math.sin(sinInc2 / 64 * Math.PI * i * delta) * HEIGHT * 4;
    }

    xMove[16] = xSpeed * (float) Math.sin(sinInc2 / 64 * Math.PI * 2 * delta) * WIDTH * 8;
    yMove[16] = ySpeed * (float) Math.sin(sinInc2 / 32 * Math.PI * 2 * delta) * HEIGHT * 4;

    xMove[17] = xSpeed * (float) Math.sin(sinInc2 / 32 * Math.PI * 2 * delta) * HEIGHT * 10;
}
private void movementCalculations(双增量){
sinInc+=0.0015;
sinInc2+=0.010;
xMove[0]=xSpeed*(float)Math.sin(Math.toDegrees(sinInc/100*delta))*7500;
yMove[0]=ySpeed*(float)Math.sin(Math.toDegrees(sinInc/200*Math.PI*delta))*2500;
zMove[0]=zSpeed*(float)Math.sin(Math.toDegrees(sinInc/200*delta))*1250;

对于(int i=1;i您当前正在将
sinInc
sinInc2
与增量相乘,那么与帧率无关的是…旋转速度

您可能希望将移动速度相乘(
{x | y | z}速度
),尽管这很难确定

您应该首先将增量乘法向上移动到公因数,而不是到处粘贴
*delta

sinInc += (0.0015 * delta);
将明确正弦增量与帧率无关,每单位时间0.0015个单位

至于移动,我怀疑你在某处做了
someXCoordinate[I]+=xMove[I]
。如果是这样,那么这就是放置delta:

obj.xPosition += (obj.xVelocity * delta);

您当前正在将
sinInc
sinInc2
与增量相乘,那么与帧率无关的是…旋转速度

您可能希望将移动速度相乘(
{x | y | z}速度
),尽管这很难确定

您应该首先将增量乘法向上移动到公因数,而不是到处粘贴
*delta

sinInc += (0.0015 * delta);
将明确正弦增量与帧率无关,每单位时间0.0015个单位

至于移动,我怀疑你在某处做了
someXCoordinate[I]+=xMove[I]
。如果是这样,那么这就是放置delta:

obj.xPosition += (obj.xVelocity * delta);

正弦的输出范围为[-1,1]。这可能是问题所在吗?正弦的输出范围为[-1,1].这可能是问题吗?是的,就是这样!我只需要将sinInc和sinInc2与delta相乘。我以前尝试过这个方法,但不知怎的认为它不会像那样工作,因为现在有delta,它的速度稍微提高了一点,当时看起来是错误的。不管怎样,我现在优化了代码,它工作起来很有魅力,谢谢!是的,就是这样!我只需要将sinInc和sinInc2与delta相乘。我以前试过这个,但不知怎的认为它不会那样工作,因为它在有delta的情况下稍微提高了速度,当时看起来是错误的。不管怎样,我现在对代码进行了一些优化,效果非常好,谢谢!