如何使用gl.glTranslatef()定期更改坐标?

时间:2013-08-15 15:57:29

标签: java opengl jogl

拥有以下display() -

float tranX , tranY , tranZ ; 
public void display(GLAutoDrawable gLDrawable) {
    final GL gl = gLDrawable.getGL();
    gl.glLoadIdentity();
    gl.glPushMatrix();
    gl.glTranslatef(tranX ,tranY ,tranZ);
    gl.glCallList(i);
    gl.glPopMatrix();
    tranX += 0.05;
    tranY += 0.05;
    tranZ += 0.05;
}

您可以看到每个display()调用保存gl.glCallList(i)中对象的矩阵,并且gl.glTranslatef(tranX ,tranY ,tranZ)更改坐标。

假设在某个阶段我想将此对象保存在当前位置(在gl.glTranslatef调用之后)并开始将其转换为另一个tranXtranY,{{1} }值。

考虑到上述tranZgl.glPushMatrix(),我如何保存此对象位置?

2 个答案:

答案 0 :(得分:1)

Push / pop矩阵用于累积复杂的矩阵变换,否则手工操作会很痛苦。对于存储和移动对象位置,保持变量是正确的。要扩展它,并且正如你所说的开始在另一个中移动,添加directionX / y / Z.例如,tranX + = directionX等。然后当你想改变方向时,只需将directionX / Y / Z设置为不同的值。

速度会根据计算机的速度而变化。你想要找到自上一帧(或最后一次显示调用)以来的时间,并执行以下操作:transX + = velocityX * deltaTime等。

如果要将对象从一个点移动到另一个特定点,则需要查看关键帧插值。例如,position = pointA *(1.0 - x)+ pointB * x并且make x从0移动到1(x + = speed * deltaTime)。当x高于1时,pointA变为pointB,pointB被设置为列表中的下一个位置。然后从x中减去1.0并继续。

答案 1 :(得分:1)

假设您正在从原点进行翻译(即使您没有翻译) - 在这种情况下,应该可以保存对象相对于原点的位置。您可以使用将数据存储在三个字段(xPosition,yPosition,zPosition)中的对象。

要稍后翻译对象,您首先要转换到此位置,然后根据需要从那里进行翻译。