Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Вращение камеры вокруг объекта


Автор: coach 3.11.2006, 16:40
Как определить камеру с помощью gluLookAt() для готового 3D объекта.

Автор: cipher 3.11.2006, 16:57
А поточнее можно. Что необходимо?

Добавлено @ 16:58 
Что значит "определить"?

Автор: coach 3.11.2006, 19:00
cipher, 
Создан объект, необходимо относительно неподвижного объекта вращать камеру.

Автор: Rickert 4.11.2006, 08:19
Есть два варианта: первый через векторы работать с камерой, а воторой, он проще и конкретно для тебя подходит - надо работать по уровнениям сферы из тригонометрии. Есть точка неподвижная - центр сферы, а ты вокргу неё описываешь полёт по формуле сферы, задавая положения в полярной системе координат двумя углами.

Автор: coach 6.11.2006, 00:37
Спасибо!

Автор: Arks 16.11.2006, 10:00
Кстати, в OpenGL Programming Guide есть пример работы с камерой в полярных координатах. В инете можно найти эту книгу при желании.

Автор: Rickert 16.11.2006, 17:47
да чего там работать-то? Три переменных для каждой по формуле из двух составляющих(для z - одна) и всё.

Автор: evilguard 19.11.2006, 00:22
У меня проблема. Делаю обзор объекта мышью по окружности. Объект находится в точке с координатами x0,y0,z0 положение камеры вычисляю с помощью полярных координат: c_r - расстояние от камеры до объекта, c_a - горизонтальный угол, c_b - угол между вектором камеры и осью z. Вот код функции OnDraw:
Код

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    x1=x0+c_r*cos(c_b)*cos(c_a);
    y1=y0+c_r*sin(c_b);
    z1=z0+c_r*cos(c_b)*sin(c_a);
    gluLookAt(x1, y1, z1, x2, y2, z2, 0, 1, 0);

    glCallList(1);
    SwapBuffers(m_hdc);

Так вот, при изменении угла c_b, то есть вращения в плоскости yz(допустим зафиксировав угол c_a) при прохождении углом значения пи/2,(при этом смотришь на объект сверху вниз), объект резко разворачивается на 180 градусов в горизонтальной плоскости(или же камера разворачивается).
Подскажите как поправить код, пожалуста. Или может быть лучше с использованием функций glTranslate и glRotate?

Автор: Rickert 19.11.2006, 07:02
У тебя вроде углы неправильно расчитываются.
Код

x1 = x0 + c_r*cos(ATOR(c_a))*sin(ATOR(c_b)) * speed;
y1 = y0 + c_r*sin(ATOR(c_a))*sin(ATOR(c_b)) * speed;
z1 = z0 + c_r*cos(ATOR(c_b)) * speed;

Где ATOR():
Код

#define ATOR(x) x * PI/180.0f

А speed - скорость(возьми 0.01 для начала)

Автор: evilguard 19.11.2006, 10:07
Rickert, Понимаешь, вращается все нормально во всех плоскостях, углы у меня в радианах, никакие пересчетные коэффициенты не нужны. Проблема возникает при прохождении углом значения пи/2 сверху вниз когда смотришь на объект.

Автор: Rickert 19.11.2006, 10:43
А! Ну так естественно! получается ведь что ты начинаешь смотреть на объект вверх ногами smile Всё верно, представь себе и поймёшь.

Автор: evilguard 19.11.2006, 12:13
Вот exe-шник программы, 77 кб, там все понятно будет:
http://myfriends.jino-net.ru/OG.exe

Автор: Sandrick 8.1.2007, 16:08
Если не использовать функцию gluLookAt, то у меня получился такой вполне работоспособный код вращения:
Код

    glRotatef(dXAngle,mmatrix[0,0],mmatrix[1,0],mmatrix[2,0]);
    glRotatef(dYAngle,mmatrix[0,1],mmatrix[1,1],mmatrix[2,1]);

Где mmatrix - матрица GL_MODELVIEW. А dXAngle и dYAngle - углы вращения.

Автор: Rickert 8.1.2007, 16:41
evilguard, твой файл не запускается. Говорит, что некорректно настроено приложение.
Ты с помощью МФЦ пишешь чтоли?

Автор: EvgenZ 8.1.2007, 17:12
У меня открылось в окошке МФЦ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)