News:

No significant change

Main Menu

Matematiktråden!

Started by Lupson, November 10, 2002, 16:08:11

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Jotte

Se upp Flashpoint här komemr en konkurrent!! ;) :)

Lupson

Lägesrapport ang. problemet som till slut löste sig någorlunda

Plockade ut 4 hörnpunkter, definierar en normal mha 3 av dem. Den funktion jag använder för att beräkna normalen till en yta tar bara 3 Vektorer men jag skulle tro att det inte spelar någon större roll i sammanhanget.

Sedan definierar jag en uppåtnormal (0,1,0). Sedan skickar jag in planets normal tillsammans med uppåtnormalen i en funktion som räknar fram vinkelskillnaden i x-led mellan normalerna, sedan gör jag samma sak för z-ledet.

Därefter kom problematiken att funktionen som returnerar vinkelskillnaden alltid returnerar absolutvärdet vilket inte fungerar i praktiken eftersom man måste ge openGL negativa vinklar ifall man vill ha en negativ rotation. Jag ordnade dock till en liten fusklösning som kanske är den enda metoden. Den tar iaf och kollar ifall en av de främre x-koordinaterna ligger ovan eller nedan motsvarande bakre x-koordinat. Ifall vi i är "i nedförsbacke" så byter vi helt enkelt tecken på det inskickade värdet.

Kod: (Ger en enkel bild av hur koordinatsystemstranformateringarna i OpenGL fungerar f.ö., Intresseklubben antecknar kanske... :) )

Vector3 v1, v2, v3, v4, object, normal, normal2, stdnormal, rot; //Vektorer
object.x = obj[n]->getXpos();
object.y = obj[n]->getYpos();
object.z = obj[n]->getZpos();

/* Hämtar de fyra punkterna */         
v1.x = object.x+(float)sin((obj[n]->getDirection()+60)*piover180)*3.0f;
v1.z = object.z+(float)cos((obj[n]->getDirection()+60)*piover180)*3.0f;
v1.y = GTH3(v1.x, v1.z, g_HeightMap);
      
v2.x = object.x+(float)sin((obj[n]->getDirection()-60)*piover180)*3.0f;
v2.z = object.z+(float)cos((obj[n]->getDirection()-60)*piover180)*3.0f;
v2.y = GTH3(v2.x, v2.z, g_HeightMap);
      
v3.x = object.x-(float)sin((obj[n]->getDirection()+60)*piover180)*4.0f;
v3.z = object.z-(float)cos((obj[n]->getDirection()+60)*piover180)*4.0f;
v3.y = GTH3(v3.x, v3.z, g_HeightMap);
      
v4.x = object.x-(float)sin((obj[n]->getDirection()-60)*piover180)*4.0f;
v4.z = object.z-(float)cos((obj[n]->getDirection()-60)*piover180)*4.0f;
v4.y = GTH3(v4.x, v4.z, g_HeightMap);

normal = CalcFaceNormal(v1,v2,v3); // Beräknar normalen till triangeln(v1,v2,v3)
      
stdnormal.x = 0.0f; // Definierar standardnormal.
stdnormal.y = -1.0f; // Vet inte varför den måste vara negativ, blir fel annars
stdnormal.z = 0.0f;
      
float a = v1.CalcAngle2D(normal, stdnormal); // Beräkna z-vinkeln
float b = v1.CalcAngle2D_2(normal, stdnormal); // Beräkna x-vinkeln

// Sätter in värderna i objektets attribut, piover180 är koefficient, radianer->grader
if(normal.z<0) obj[n]->setPitch(a/piover180); // Positiv vinkel
if(normal.z>0) obj[n]->setPitch(-(a/piover180)); // Negativ vinkel...

if(normal.x>0) obj[n]->setYaw(b/piover180);
if(normal.x<0) obj[n]->setYaw(-(b/piover180));

glPushMatrix(); // Lagrar nuvarande koordinatsystem i stacken
//Förflyttar origo till objektets medelpunkt            
gllTranslatef(obj[n]->getXpos(), obj[n]->getYpos(), obj[n]->getZpos());
         
glRotatef(obj[n]->getPitch(), 1.0f, 0.0f, 0.0f); // Roterar i x-led
glRotatef(obj[n]->getYaw(), 0.0f, 0.0f, 1.0f); // Roterar i z-led
glRotatef(obj[n]->getDirection(), 0.0f, 1.0f, 0.0f); // Roterar i y-led

glCallList(obj[n]->getModel()); //
glPopMatrix(); // Hämtar senaste koordinatsystem från stacken                  
}

Så - en liten snabblektion i openGL! Formeln som används i CalcAngle2D är:
cos A = -( ((a*a) - (b*b) - (c*c))
          ______________________
                     (2*b*c)

Nu vet jag inte riktigt vad jag ska göra som nästa steg, men antagligen gör jag om objektsystemet så man har ett huvudobjekt som man hänger på komponenter på, ex.

Helikopter -> Rotor
|
-> Automatkanon
|
-> Missiler

eller

Stridvagn -> Torn -> Kanon

Har någon skojiga förslag på objektstrukturer eller ideér om vad nästa steg kan vara så är jag tacksam för all möjlig input. Just nu tror jag helst att jag slipper matematiken ett tag!

Mvh Lupson
Mvh Lupson - kortklippt.

"Kustartilleriet fördröjer fienden i kustbandet till militär hjälp kan anlända".
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Core i5 E3570K - Fractal Design Define Mini - Sapphire R290 Tri-X