Независимый перевод OpenGL после выполнения перевода + ротация? - PullRequest
1 голос
/ 06 января 2012

Я хочу получить переводы / повороты, как показано в следующем видео -

http://www.youtube.com/watch?v=92h0xuV4Yrg

Я знаю, что для независимого перевода и поворота типичный метод - сначала повернуть объект, а затем перевести.

Как показано здесь:

PushMatrix();
LoadIdentity(); 
Translate(posx,posy,posz);     // Second, move the object to its final destination
Rotate();        // First, apply rotations (which rotate around object-origin
Draw();         
PopMatrix();

Но мое требование - вращать объект вокруг мировой координаты и перемещать его с помощью мыши.

Как видно из видео,вращение происходит вокруг источника мира, а не вокруг объекта-источника. Это означает, что логика должна быть противоположна приведенной выше (сначала переведите, а затем выполните вращение)

PushMatrix();
LoadIdentity(); 
Rotate();        // Second, apply rotations (which rotate around world-origin)
Translate(posx,posy,posz);     // First, move the object to its final destination
Draw();         
PopMatrix();

Но окончательный перевод в видеовыполняется относительно конечной позиции после поворотов (что не совпадает со значениями posx, posy, posz, которыми я манипулирую с помощью мыши).

Как добиться такого рода переводов

1 Ответ

2 голосов
/ 06 января 2012

Чтобы повернуть объект вокруг любой точки (x, y, z), вы делаете следующее:

translate (-x,-y,-z);
rotate (angle);
translate (x, y, z);

Эта точка не обязательно должна быть точкой на объекте. Это может быть источник или любое случайное значение, например (1000, 0,0023, 97,5). Возможно, вам придется сделать дополнительный перевод в вашем случае. Например, если ваш объект определен в источнике, и пользователь поместил его в (x1, y1, z1), и вы хотите повернуть его вокруг (x, y, z), вам нужно добавить:

translate (x1,y1,z1);

после перевода (x, y, z).

...