Войти
ПрограммированиеФорумОбщее

Вращение камеры вокруг главного героя(игра от 3 лица)

#0
17:34, 7 дек. 2010

Всем привет.
Нужно реализовать код, чтобы камера вращалась вокруг заданной точки(игрока).
Ни как не могу добиться этого при помощи glRotatef().Перепробывал все, что мог, но камера крутится либо вокруг своей оси как в
шуторе, либо вокруг точки 0.0

пример

float camera=-5.0f;   // Камера
float player=-1.0f;     // Координаты главного героя
float rot=0.0f;           // Вращение камеры

void Games()
{
  glTranslatef(0,0,camera);  // Движение камеры
  glRotatef(cc,0.0,1,0.0);      // Вращение камеры вокруг точки 0.0  а надо вокруг точки player
   
  rot+=1.0f;          // Вращение камеры вокруг оси
  camera+=1.0f;

                glPushMatrix();
                glTranslatef(0,0,player);                // Движение главного героя
                MODEL_SmdLoad("player.smd");  // Модель главного героя
                player+=1.0f;                                
                glPopMatrix();
}


#1
17:38, 7 дек. 2010

Metanoed
1. Сбрасываешь матрицы вращения, позиции и масштаба камеры.
2. Вращаешь камеру на нужное число градусов (радиан).
3. Перемещаешь камеру в точку, где у тебя стоит игрок.

#2
17:39, 7 дек. 2010

или можешь не вращать камеру, а вращать мир вокруг игрока))

#3
19:47, 7 дек. 2010

Ничего не получается,а пока я вожусь с камерой мобы в игре пользуются моментом и беспощадно убивают


вот код но действует если модель статична, а не в движении

  glTranslatef(0,0,camera);     // Координаты камеры
  glRotatef(rot,0.0,1,0.0);       // Вращение камеры вокруг точки
  glTranslatef(0,0,точка вокруг которой будет вращятся камера);   


Ктонибудь может предоставить пример, чтобы камера вращалась вокруг заданной точки(игрока) и при этом она была отдалена от него и перемещалась за игроком.
Всем спасибо кто пытается мне помочь.

#4
19:50, 7 дек. 2010

Metanoed
Будет профит, если выкинуть стек матриц и использовать шейдеры.

#5
20:00, 7 дек. 2010

Metanoed
Я не силён в OpenGL, но смотри:

glTranslatef(0,0,camera);     // Координаты камеры

Зачем ты это делаешь? Ты для начала сбрось матрицу (сделай её единичной). После этого поворачивай относительно центра сцены. А уже после поворота можешь делать перемещение в любую точку.

#6
23:30, 7 дек. 2010

-Eugene-
будет профит, если самым умным молчать, пока начинающие разбираются с матрицами.

#7
4:21, 8 дек. 2010

2Metanoed: сначала замути подобие иерархических отношений между объектами (линковал когда-нибудь объекты в максе? видел графики иерархий в мае? юзал какие-нибудь движки-конструкторы?). суть в том что позиция/ротейт/скейл чайлдов-объектов умножаются на соответствующие в паренте, в паренте парента и так до конца.
потом просто цепляешь камеру в иерархию пустого объекта, а пустой объект в главного героя. пустой объект пусть сидит у чела в голове или торсе, а камера от него отодвинута. таким образом камера всегда едет за пустым объектом, который едет за челом. и если крутить пустой объект, то камера будет как раз крутиться ВОКРУГ него по кругу (и можно будет глядеть чела с разных сторон но при этом ходить с ним).

#8
7:57, 8 дек. 2010

EvilSpirit
Все равно придется переписывать половину кода при переходе на шейдеры... Не лучше уж сразу?

#9
8:07, 8 дек. 2010

Metanoed

glRotatef вращает вокруг вектора, который проходит через начало координат. Поэтому, чтобы вращать вокруг перса, нужно:

1. Translate, переводящий перса в начало координат.
2. Rotate
3. Translate, переводящий перса в исходную точку.

#10
8:23, 8 дек. 2010

Mr F
> сначала замути подобие иерархических отношений между объектами
+1 нужно мыслить объектно вместо того чтобы оперировать матрицами и лепить все в одну кучу. т.е. объект отдельно, камера отдельно, у каждого свои позиция и ориентация, тогда все станет понятно и встанет на свои места. на самом деле камеру нужно повернуть вокруг своей оси а затем сместить на вектор, являющийся суммой вектора положения объекта и вектора смещения камеры относительно объекта.

-Eugene-
> Все равно придется переписывать половину кода при переходе на шейдеры
это почему? у мну, например, сцена существует абсолютно независимо от рендерера и трансформации там расчитываются без единой строчки апи-специфик кода вообще, а уж куда потом эта матрица попадет - в шейдер или в фиксированный конвейер это дело десятое. а начиналось тоже с ID3DXMatrixStack

#11
8:43, 8 дек. 2010

-Eugene-
> Все равно придется переписывать половину кода при переходе на шейдеры... Не
> лучше уж сразу?
как показывает опыт - все и сразу никогда не получается, особенно если ты только учишься.

#12
9:28, 8 дек. 2010

Metanoed
> Всем привет.
> Нужно реализовать код, чтобы камера вращалась вокруг заданной точки(игрока).
> Ни как не могу добиться этого при помощи glRotatef().Перепробывал все, что мог,
> но камера крутится либо вокруг своей оси как в
> шуторе, либо вокруг точки 0.0
Написал небольшую программку, возможно она облегчит решение твоей задачи.
Итак, предлагаю простой и проверенный десятилетиями способ - вид от третьего лица на основе gluLookAt:

http://igrodel.ru/files/0.Third_person_camera.zip  (219kb, EXE+исходники на Delphi)
Перемещение игрока: W - вперёд,A - поворот влево, D - поворот вправо
Перемещение камеры и смена угла - скроллбаррами. Чекбокс включает автоповорот.

Изображение

Суть метода проста:
1) берём координаты игрока в плоскости пола -  PlayerX, PlayerZ
2) прибавляем к этой координате вектор, указывающий куда поместить камеру:

  CameraX:=PlayerX+CameraDist*sin(CameraPhi*3.14/180);
  CameraY:=ScrollBar3.Position;
  CameraZ:=Playerz+CameraDist*cos(CameraPhi*3.14/180);
3) подаём числа на вход старой доброй функции gluLookAt(CameraX,Y,Z, PlayerX,Y,Z, 0,1,0)

#13
9:54, 8 дек. 2010

просто нео6ходимо понять принципы принципы рисования о6ъектов OpenGl. Такого понятия как "камера" по сути нету. о6ъекты рисуются трансформированными по заданной матрице.
я сделал так: из матрицы трансформации камеры(как о6ъекта) получаю матрицу трансформации мира относительно камеры:
транспонируu матрицу поворота, отражаu пр оси Z, позицию умножаu на -1.
далее при рисовании, данную матрицу умножаu на матрицу каждого из о6ъектов.

#14
20:39, 8 дек. 2010

Все получилось спасибо всем за помощь особенно tmtlib пример на Delphi здорово помог.
А вот и код может кому пригодится

// Игрок
float PLAYER_Player_X=0.0f;         
float PLAYER_Player_Y=0.0f;         
float PLAYER_Player_Z=5.0f;

// Камера
float CAMERA_X=0.0f;   
float CAMERA_Y=0.0f;   
float CAMERA_Z=0.0f;   

float PLAYER_MouseRotX=0.0f;  // Вращение камеры при помощщи мыши

float CAMERA_Distance=10.0f;         // Дистанция камеры от игрока

void game()
{
   gluLookAt(CAMERA_X=PLAYER_Player_X+CAMERA_Distance*sin(PLAYER_MouseRotX),CAMERA_Y,
   CAMERA_Z=PLAYER_Player_Z+CAMERA_Distance*cos(PLAYER_MouseRotX),
   PLAYER_Player_X,PLAYER_Player_Y,PLAYER_Player_Z,0,1,0);

  glPushMatrix();  
  glTranslatef(PLAYER_Player_X, PLAYER_Player_Y, PLAYER_Player_Z);
  /*
  Мадель игрока
 */
 glPopMatrix();
}
ПрограммированиеФорумОбщее

Тема в архиве.