0

有以下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调用之后)并开始将其转换为另一个tranX, tranY, tranZvalues 。

gl.glPushMatrix()考虑到上述情况,我怎么能保存这个对象位置gl.glPopMatrix()

4

2 回答 2

1

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

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

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

于 2013-08-15T16:51:15.557 回答
1

假设您是从原点平移(即使您不是) - 在这种情况下,应该很有可能保存对象相对于原点的位置。您可以使用将数据存储在三个字段(xPosition、yPosition、zPosition)中的对象。

要稍后平移对象,您将首先平移到该位置,然后根据需要从那里平移。

于 2013-08-15T16:52:28.343 回答