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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Езда и повороты танка 
:(
    Опции темы
Aндрей
Дата 15.12.2011, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравстуйте. Пытаюсь реализовать езду танка. Заметил, что если проехать от первоначальной точки вперед, и попробовать повернуть налево или направо, то танк не поворачивается, а перемещается по "какому-то" кругу, хотя в первоначальной точке поворачивается правильно. Весь день сеня просидел, уже сил нет, подскажите.

Код

....
GLfloat xt=0, xl=0, xr=0, xRot2=0, kl=0, kr=0, kmr=0, gun=0;
GLfloat ZROT = 0.0f;
int fl=0, fl2=0;

void RenderScene()
{
 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    //gluLookAt(-15+xt,5,0,  0+xt,0,0,  0,1,0);
    gluLookAt(-15,5,0,  5,0,0,  0,1,0);
    //gluLookAt(0,5,25,  0+xt,0,0,  0,1,0);

    
    glRotatef(xl+xr, 0.0f, 1.0f, 0.0f); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    glTranslatef(xt,0,0);  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    risuem_telo_tanku();
    risuem_krilya_tanku();

    glPushMatrix();
    glRotatef(xRot2, 0.0f, 1.0f, 0.0f);
    risuem_head_tnaku();
    
    glPushMatrix();
    glTranslatef(1,0,0);
    glRotatef(2,0,0,1);
    risuem_dulo_tanku(); 
    glPopMatrix();
    if(gun==1) // выстрел
    {        
        glTranslatef(g_trZ,0,0);
        g_trZ += g_trZSpeed;
        risuem_patron();
        if(g_trZ>150) { g_trZ=0; gun=0;}
    }
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0,0,0.11);
    risuem_gusenici_tanku(fl2);
    glPopMatrix();
    //ГУСЕНИЦЫ ЗАДНЯЯ СТОРОНА
    glPushMatrix();
    glTranslatef(0.0f, 0.0f, -8.31f);
    risuem_gusenici_tanku(fl);
    glPopMatrix();

    //ПЕРЕДНЯЯ СТОРОНА. КОЛЕСА ///////////
    glPushMatrix();
    glTranslatef(0.0f, 0.0f, 0.1f);
    front_wheel(-kr);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0.0f, 0.0f, 0.1f);
    back_wheel(-kr);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0.0f, 0.0f, 0.1f);
    middle_wheels(-kr);
    glPopMatrix();

    //ЗАДНЯЯ СТОРОНА
    glPushMatrix();
    glTranslatef(11.6f, 0.0f, -0.1f);
    glRotatef(180, 0, 1, 0);
    front_wheel(kl);  
    glPopMatrix();

    glPushMatrix();
    glTranslatef(-9.4f, 0.0f, -0.1f);
    glRotatef(180, 0, 1, 0);
    back_wheel(kl);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0.0f, 0.0f, -8.265f);
    middle_wheels(-kl);
    glPopMatrix();

    ///Задняя сторона
    glPushMatrix();
    risuem_back_tanku();
    glPopMatrix();    
    glPopMatrix();
    
    glPushMatrix();
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textures[0].texID);

    glBegin(GL_QUADS);        // Начинаем рисовать квадрат
        
            glColor3ub(228, 217, 187);
            normal(-100.5f, -2.0f, -100, 100.5f, -2.0f, -100, 100.5f, -2.0f, 100);     
            glNormal3f(norm[0], norm[1], norm[2]);
            glTexCoord2f(0,1);    glVertex3f(-100.5f, -2.0f, -100);        // Низ лево
            glTexCoord2f(1,1);    glVertex3f(100.5f, -2.0f, -100);            // Низ право
            glTexCoord2f(1,0);    glVertex3f(100.5f, -2.0f, 100);            // Верх право
            glTexCoord2f(0,0);    glVertex3f(-100.5f, -2.0f, 100);            // верх лево
        glEnd();    
    glPopMatrix();
    glDisable(GL_TEXTURE_2D);

    SwapBuffers(g_hDC);
}
......
 
LRESULT CALLBACK WinProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LONG    lRet = 0;
    PAINTSTRUCT    ps;
 
    switch (uMsg)
    {
    case WM_SIZE:        // Если изменён размер окна
 
        SizeOpenGLScreen(LOWORD(lParam),HIWORD(lParam));// LoWord=Width, HiWord=Height
        GetClientRect(hWnd, &g_rRect);                    // получаем window rectangle
        break;
 
    case WM_PAINT:            // Если нужно перерисовать сцену
        BeginPaint(hWnd, &ps);    // Иниц. paint struct
        EndPaint(hWnd, &ps);    // EndPaint, подчищаем
        break;
 
    case WM_KEYDOWN:
        switch(wParam)
        {
            case VK_ESCAPE:        // Если нажат ESCAPE
                PostQuitMessage(0);    // Выходим
                break;
            case 65: // влево
                xl+=0.4; ZROT+=3.5f; kr=ZROT;
                if(fl2==0) fl2=1; else fl2=0;
                break;
            case 68: // вправо
                xr-=0.4; ZROT+=3.5f; kl=ZROT;
                if(fl==0) fl=1; else fl=0;
                break;
            case 87: // вперед
                xt+=0.2; ZROT+=5.5f; kl=ZROT; kr=ZROT;
                if(fl==0) fl=1; else fl=0; if(fl2==0) fl2=1; else fl2=0;
                break;
            case 83: // назад
                xt-=0.2; ZROT-=5.5f; kl=ZROT; kr=ZROT;
                if(fl==0) fl=1; else fl=0; if(fl2==0) fl2=1; else fl2=0;
                break;
            case 188: // башня влево
                xRot2 += 1.5f;
                if(abs(xRot2)>=360) xRot2=0;
                break;
            case 190: // башня вправо
                xRot2 -= 1.5f;
                if(abs(xRot2)>=360) xRot2=0;
                break;
            case 17: // выстрел
                if(gun==0)
                    PlaySound ("gun8.wav", NULL, SND_FILENAME | SND_ASYNC);
                gun=1;                
                break;
            case VK_LEFT: // камера влево
                kmr+=0.5;
                break;
            case VK_RIGHT: // камера вправо
                kmr-=0.5;
                break;
        }
        break;
 
    case WM_CLOSE:        // Если окно было закрыто
        PostQuitMessage(0);    // Выходим
        break;
 
    default:        // Return по умолчанию
        lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
        break;
    }
 
    return lRet;
}



Присоединённый файл ( Кол-во скачиваний: 27 )
Присоединённый файл  1.jpg 201,60 Kb
PM MAIL   Вверх
KillerrrK
Дата 22.1.2012, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А модель танка в Максе делаеш?
PM MAIL   Вверх
tzirechnoy
Дата 23.1.2012, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



А что Вы хотите? GL_MODELVIEW -- это с точки зрения танка. 

Вот представьте, что Вы -- танк. 
И вчера вам-танку приказали из начальной позицыи повернуть на 15 градусов и пройти вперёд 40 метров.
А сегодня -- оттуда жэ повернуть на 30 градусов и пройти вперёд 40 метров.

Как, будут последние позицыи совпадать с точностью до разворота на месте?

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


Новичок



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

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



Цитата

И вчера вам-танку приказали из начальной позицыи повернуть на 15 градусов и пройти вперёд 40 метров.
А сегодня -- оттуда жэ повернуть на 30 градусов и пройти вперёд 40 метров.


Надо сначала ручками посчитать где окажется танк повернутый на 15 градусов+текущая ориентация  через 40 метров прибавить это значение к текущей позиции танка и только тогда применять glTranslate и затем glRotate. 
PM MAIL   Вверх
tzirechnoy
Дата 30.1.2012, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



Цитата
Надо сначала ручками посчитать где окажется танк повернутый


Нафига? Вообще-то имелось в виду как самоочевидное, что надо сначала приказать переместиться в нужную точку, а только затем повернуть.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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