Новичок
Профиль
Группа: Участник
Сообщений: 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
|