Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не понимаю, как вращать кубы в разных направлениях 
V
    Опции темы
neosapient
Дата 7.3.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



Продолжаю мучать книгу Горнакова

Вот предшествующий вопрос по шестой главе

Назрел вопрос также по шестой главе (вторая её часть)

Значит есть куб и его вращаю за счет вращения матрицы мира
Куб расположен окурат вокруг системы координат (точечная симметрия)

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

Подскажите как исправить ниже приведенный пример.

Каким функциями пользоваться



Это сообщение отредактировал(а) neosapient - 7.3.2007, 23:37

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  Urok9_2.rar 46,12 Kb
PM MAIL   Вверх
evilguard
Дата 8.3.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



neosapient
Тоже такая проблема была, когда пользовался функциями glRotate, сейчас пользуюсь функцией gluLookAt - посмотри как она работает. При отлавливании сообщений мыши меняются углы, а затем пересчитываю в координаты, используя sin/cos.
Код

void GLRenderer::paintGL()
{
//    emit reDraw();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    if (cam_b<0)
        cam_b=2*pi+cam_b;
    if (cam_b>2*pi)
        cam_b=cam_b-2*pi;

    x1=x2+cam_r*cos(cam_b)*cos(cam_a);
    y1=y2-cam_r*cos(cam_b)*sin(cam_a);
    z1=z2+cam_r*sin(cam_b);

    if ((cam_b>pi/2)&&(cam_b<3*pi/2))
        u=-1;
    else
        u=1;

    gluLookAt(x1,y1,z1,x2,y2,z2,0,0,u);
    glCallList(glList);
}

void GLRenderer::mousePressEvent(QMouseEvent *event)
{
    lastPos = event->pos();
}

void GLRenderer::mouseMoveEvent(QMouseEvent *event)
{
    m_dx = float (event->x() - lastPos.x());
    m_dy = float (event->y() - lastPos.y());

    if (event->buttons() & Qt::LeftButton) //вращение объекта
    {
        cam_b += m_dy/80.f;
        cam_a += u*m_dx/80.f;
    }
    else if (event->buttons() & Qt::RightButton) //Приближение/отдаление объекта
    {
        if (cam_r>0)
            cam_r -= 0.5*cam_r*(m_dy)/40.f;
    }
    lastPos = event->pos();
    updateGL();
}



Здесь paintGL - функция прорисовки, mousemoveEvent - понятно для чего. Программа использует библиотеку QT, но идея должна быть понятна. Cam_a - горизонтальный угол между линией, соединяющей камеру и объект, cam_b - вертикальный угол, cam_r - расстояние от объекта до камеры, x2, y2, z2 - координаты объекта. Разбирайся короче!

Добавлено @ 10:48 
Попутал, нужен же directX smile

Это сообщение отредактировал(а) evilguard - 8.3.2007, 10:51
PM MAIL   Вверх
neosapient
Дата 8.3.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



а ответа пока нет...  smile 

может я некорректно задал вопрос???

PS
Цитата

Попутал, нужен же directX 

Да, directX 
PM MAIL   Вверх
neosapient
Дата 11.3.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



тишина
 smile 
PM MAIL   Вверх
fantast
Дата 11.3.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: нет
Всего: 2



 в горнакове вродеб была функция matrix так вот делай расширенную версию этой функции, передавая туда к примеру угол поворота и перемещение объекта, тогда когда буш рендерить тоесть между вызовами функций

    pDirect3DDevice->BeginScene();
                     и
    pDirect3DDevice->EndScene();

вызывай свою функцию matrix с нужными параметрами и рисуй объект нужной функцией, например 
pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,36,0,12);(чтото в этом роде..)
и так для каждого объекта.
Цитата

pDirect3DDevice->BeginScene();
LightMaterial();
pDirect3DDevice->SetStreamSource(0,pBufferVershin,0,sizeof(CUSTOMVERTEX));
pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
pDirect3DDevice->SetIndices(pBufferIndex);
Matrix(...........);
pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,36,0,12);
Matrix(...........);
pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,36,0,12);
pDirect3DDevice->EndScene();


эта часть кода рисует в пространстве два одинаковых объекта например куба, зашли только нужные параметры в функцию matrix и вот у тебя уже будут скажем 2 куба летать по кругу и крутиться вокруг своей оси.
я когдато делал атом(ядро и 3 эллектрона,которые летали вокруг него), получилось прикольно. удачи

Это сообщение отредактировал(а) fantast - 11.3.2007, 22:07
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
neosapient
Дата 12.3.2007, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



За подсказку спасибо smile

Цитата

я когдато делал атом(ядро и 3 эллектрона,которые летали вокруг него)

Теперь буду над атомом колдавать  smile 

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Urok9_3.rar 45,79 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0921 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.