2013-08-15 1 views
0

Имея следующие display() -Как правильно менять координату с помощью gl.glTranslatef()?

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, tranZ значения.

Как сохранить эту позицию объекта с учетом вышеизложенного gl.glPushMatrix() и gl.glPopMatrix()?

+0

Почему вы отправляете почти тот же вопрос через 4 часа? – Vallentin

ответ

1

Матрицы Push/Pop предназначены для накопления сложных матричных преобразований, которые в противном случае было бы болезненно делать вручную. Для хранения и перемещения позиций объектов сохранение переменных, как вы это сделали, является правильным. Чтобы расширить это, и, как вы говорите, начните движение в другом, добавьте направлениеX/y/Z. Например, tranX + = directionX и т. Д. Затем, когда вы хотите изменить направление, просто установите directionX/Y/Z на другое значение.

Скорость будет меняться в зависимости от скорости вашего компьютера. Вам нужно найти время со времени последнего кадра (или последний вызов для отображения) и сделать что-то вроде этого: transX + = speedX * deltaTime и т. Д.

Если вы хотите переместить объект из одной точки в другую point, вы хотите изучить интерполяцию с ключевыми кадрами. Например, position = pointA * (1.0 - x) + pointB * x и заставить x перемещаться от 0 до 1 (x + = скорость * deltaTime). Когда x выше одного, точка A становится точкой B, а точка B устанавливается в следующую позицию в списке. Затем вычитайте 1.0 из x и продолжайте.

+0

На самом деле это не было бы никакой болью, так как вам просто нужно делать противоположные переводы и вращения в обратном порядке того, как вы их применяли. Чтобы вернуться к предыдущему «Матричному состоянию». – Vallentin

1

Предполагая, что вы переводите с начала (и даже если это не так) - в этом случае вполне возможно сохранить положение объекта относительно начала координат. Вы можете использовать объект, который хранит данные в трех полях (xPosition, yPosition, zPosition).

Чтобы позже перевести объект, сначала переведите на эту позицию, а затем переведите оттуда по мере необходимости.