Wizualizacja rzutu ukośnego w Borland C++ Builder.

0

Witam użytkowników.
Jestem w trakcie pisania pracy na zaliczenie i proszę o pomoc. Praca jest już prawie ukończona (kod poniżej). Niestety pojawił się problem, z którym walczę od kilku dni i wszystko stoi w miejscu.
Praca zaliczeniowa (w skrócie) polega na napisaniu kodu, który ma przedstawiać dwa tory lotu rzutu ukośnego + nawigacja klawiszami po scenie (efekt końcowy ma być taki jak w załączniku o nazwie "Rozwiązanie"). W mojej pracy wszystkie aspekty wizualne + oprogramowane klawisze są już gotowe. Problemem jest uzależniony tor lotu drugiego pocisku od toru lotu pierwszego pocisku (moja praca w załączniku o nazwie "project1"). Pociski mają się poruszać niezależnie od siebie.

Jeśli ktoś jest w stanie mi pomóc proszę o korektę i wytłumaczenie w czym tkwi problem.
Jeżeli rzeczy, które umieszczam są niewystarczające do rozwiązania problemu mogę wysłać wszystkie pliki które posiadam.

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "math.h"
#include <gl/gl.h>
#include <gl/glu.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void TForm1::licz(double V, double kat, double *x, double *y)
{
   double g,dx,Z;
   g=9.81;
   Z=(V*V*sin(2*(kat*3.14/180)))/g;
   dx=Z/500.0;
   for(int i=0;i<501;i++){
      x[i]=i*dx;
      y[i]=tan(kat*3.14/180)*x[i]-(g/(2*V*V*pow(cos(kat*3.14/180.0),2.0))*x[i]*x[i]);
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
   otworz_OpenGL();
   xkam=50; ykam=30; zkam=-70;
   xcelu=50; ycelu=2; zcelu=100;
   kat=0;
   rysuj1=false;
   rysuj2=false;
   trafil1=false;
   kw1 = gluNewQuadric();
   gluQuadricDrawStyle(kw1,GLU_FILL);
   gluQuadricNormals(kw1,GLU_SMOOTH);
   kw2 = gluNewQuadric();
   gluQuadricDrawStyle(kw2,GLU_FILL);
   gluQuadricNormals(kw2,GLU_SMOOTH);

   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glLightfv(GL_LIGHT0,GL_AMBIENT, amb);
   glLightfv(GL_LIGHT0,GL_POSITION, pos);
   glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
   glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 10);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormResize(TObject *Sender)
{
   inicjuj_projekcje();
   inicjuj_scene();
   scena();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
   scena();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   zamknij_OpenGL();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   scena();
}
//---------------------------------------------------------------------------
bool TForm1 :: otworz_OpenGL( void)
{
   PIXELFORMATDESCRIPTOR pfd;
   int format_piksela;

   hdc = GetDC( Form1->Panel1 -> Handle);

   ZeroMemory( &pfd, sizeof( pfd));
   pfd.nSize = sizeof( pfd);
   pfd.nVersion = 1;
   pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
   pfd.iPixelType = PFD_TYPE_RGBA;
   pfd.cColorBits = 24;
   pfd.cDepthBits = 16;
   pfd.iLayerType = PFD_MAIN_PLANE;

   format_piksela = ChoosePixelFormat(hdc, &pfd);
   SetPixelFormat(hdc, format_piksela, &pfd);

   hrc = wglCreateContext(hdc);

   if (hrc == NULL)
        ShowMessage( "Nie uchwycilem kontekstu grafiki: hrc == NULL");

   if (wglMakeCurrent(hdc, hrc) == false)
        ShowMessage("Nie uaktywniłem grafiki");

   return true;
}
//---------------------------------------------------------------------------
void TForm1 :: inicjuj_projekcje( void)
{
   glViewport(0,0,Panel1->Width,Panel1->Height);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glFrustum(-0.5,0.5,-0.5,0.5,1,400);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}
//---------------------------------------------------------------------------
void TForm1 :: inicjuj_scene( void)
{
   glShadeModel(GL_SMOOTH);
   glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
   glClearDepth(1.0f);
   glEnable(GL_DEPTH_TEST);
   glDepthFunc(GL_LEQUAL);
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
//---------------------------------------------------------------------------
void TForm1 :: strzalka1()
{
   glPushMatrix();
   glTranslatef(0,0,50);
   glRotatef(90,0,1,0);
   glRotatef(-StrToInt(CSpinEdit1->Value),1,0,0);
   gluCylinder(kw2,0.2,0.2,2,8,8);
   glTranslatef(0,0,2);
   gluCylinder(kw2,0.6,0.0,1.5,8,8);
   glPopMatrix();
}
 //---------------------------------------------------------------------------

   void TForm1 :: strzalka2()
{
   glPushMatrix();
   glTranslatef(100,0,50);
   glRotatef(-90,0,1,0);
   glRotatef(-StrToInt(CSpinEdit3->Value),1,0,0);
   gluCylinder(kw2,0.2,0.2,2,8,8);
   glTranslatef(0,0,2);
   gluCylinder(kw2,0.6,0.0,1.5,8,8);
   glPopMatrix();
}
//---------------------------------------------------------------------------
void TForm1 :: scena( void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glLoadIdentity();
   gluLookAt(xkam,ykam,zkam,xcelu,ycelu,zcelu,0,1,0);
   glMaterialfv(GL_FRONT, GL_EMISSION, emisja2);

   strzalka1();
    strzalka2();

   glMaterialfv(GL_FRONT, GL_EMISSION, emisja);
   glBegin(GL_LINES);
   for(int i=0;i<=20;i++){
      glVertex3f(i*5,0,0);
      glVertex3f(i*5,0,100);
      glVertex3f(0,0,i*5);
      glVertex3f(100,0,i*5);


   }
   glEnd();

   glTranslatef(0,0,50);



    if(rysuj1==true)
      torLotu(x1,y1);

    glTranslatef(100,0,0);

      if(rysuj2==true)
      torLotu2(x2,y2);





   glFlush();
   SwapBuffers(hdc);

}



//---------------------------------------------------------------------------



void TForm1 :: torLotu(double *x, double *y)
{

      if(rysuj1==true){
        if(ii1<500)
           ii1=ii1+1;
      }
      glMaterialfv(GL_FRONT, GL_EMISSION, emisja2);
      glBegin(GL_LINES);
      for(int i=0;i<=ii1-1;i++){
         glVertex3f(x[i],y[i],0);
         glVertex3f(x[i+1],y[i+1],0);
      }
      glEnd();
      glTranslatef(x[ii1],y[ii1],0);
      gluSphere(kw1,1,30,30);
      glMaterialfv(GL_FRONT, GL_EMISSION, emisja3);
}
   //---------------------------------------------------------------------------

void TForm1 :: torLotu2(double *x, double *y)

{

      if(rysuj2==true) {
        if(ii2<500)
           ii2=ii2+1;
      }
      glMaterialfv(GL_FRONT, GL_EMISSION, emisja2);
      glBegin(GL_LINES);
      for(int i=0;i<=ii2-1;i++){
         glVertex3f(x[i],y[i],0);
         glVertex3f(x[i+1],y[i+1],0);
      }
      glEnd();
      glTranslatef(x[ii2],y[ii2],0);
      gluSphere(kw1,1,30,30);
      glMaterialfv(GL_FRONT, GL_EMISSION, emisja3);
}

//---------------------------------------------------------------------------
void TForm1 :: zamknij_OpenGL( void)
{
   wglMakeCurrent( NULL, NULL);
   wglDeleteContext( hrc);
   ReleaseDC( Form1 -> Handle, hdc);
}

//---------------------------------------------------------------------------



void __fastcall TForm1::ApplicationEvents1ShortCut(TWMKey &Msg,
      bool &Handled)
{
   if(Msg.CharCode == 'W'){
      xkam=xkam+2*sin(kat*3.14/180);
      zkam=zkam+2*cos(kat*3.14/180);
      xcelu=xkam+200*sin(kat*3.14/180);
      zcelu=zkam+200*cos(kat*3.14/180);
   }
   if(Msg.CharCode == 'Z'){
      xkam=xkam-2*sin(kat*3.14/180);
      zkam=zkam-2*cos(kat*3.14/180);
      xcelu=xkam+200*sin(kat*3.14/180);
      zcelu=zkam+200*cos(kat*3.14/180);
   }
   if(Msg.CharCode == 'A'){
      kat=kat+4;
      xcelu=xkam+200*sin(kat*3.14/180);
      zcelu=zkam+200*cos(kat*3.14/180);
   }
   if(Msg.CharCode == 'D'){
      kat=kat-4;
      xcelu=xkam+200*sin(kat*3.14/180);
      zcelu=zkam+200*cos(kat*3.14/180);
   }
   if(Msg.CharCode == 'Q'){
      ykam=ykam+1;
      ycelu=ycelu+1;
   }
   if(Msg.CharCode == 'E'){
      ykam=ykam-1;
      ycelu=ycelu-1;
   }
   if(Msg.CharCode == 'R'){
      ycelu=ycelu+1;
   }
   if(Msg.CharCode == 'T'){
      ycelu=ycelu-1;
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   gluDeleteQuadric(kw1);
   gluDeleteQuadric(kw2);        
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button2Click(TObject *Sender)
{
ii1=0;
   rysuj1=true;
   licz(StrToInt(CSpinEdit2->Value), StrToInt(CSpinEdit1->Value), x1, y1);
   Timer1->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
 ii2=0;
   rysuj2=true;
   licz(StrToInt(CSpinEdit4->Value), -StrToInt(CSpinEdit3->Value), x2, y2);
   Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
2

dodaj PushMatrix/PopMatrix w torlotu1 i torlotu2.

1

Nie jestem w stanie okazać swojej wdzięczności. Niech Ci się wiedzie przyjacielu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1