OpenGL-Matrix auf Punkt ausrichten

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Nibor

Betreff: OpenGL-Matrix auf Punkt ausrichten

BeitragFr, März 20, 2009 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe ein Mathematisches Problem. Ich habe eine Eindimensionale OpenGL-Matrix, die ich dazu bringen
will, sich auf einen Gegebenen globalen Punkt auszurichten. Dabei gibt es einen maximal-Winkel, sodass
sie sich nicht sofort komplett ausrichten kann, sondern eine fließende Bewegung erzeugt werden kann.

Wenn man die Y-Achse weglässt und nur in der X-Z-Ebene arbeitet funktioniert alles, im 3D-Raum sind die
Drehungen jedoch ziemlich wirr und unerklärlich.

Code: [AUSKLAPPEN]

Type TMatrix

   Field mat:Double[16]

[...]

   Method PointAt(aimx:Double, aimy:Double, aimz:Double, maxangle:Double=360.0)
      
      Local act:TVector=TVector.Create(0, 0, -1)
      'Rechnet Globale Koordinaten des Punktes in Lokale Koordinaten um
      Local protx:Double=aimx:Double-mat:Double[12], proty:Double=aimy:Double-mat:Double[13], protz:Double=-aimz:Double+mat:Double[14]
      Local aim:TVector=New TVector
      aim.x:Double=(protx:Double*mat:Double[0]-proty:Double*mat:Double[4]+protz:Double*mat:Double[8])
      aim.y:Double=(protx:Double*mat:Double[1]-proty:Double*mat:Double[5]+protz:Double*mat:Double[9])
      aim.z:Double=-(protx:Double*mat:Double[2]-proty:Double*mat:Double[6]+protz:Double*mat:Double[10])

      If aim.GetLength()<0.000001 Then Return
      aim.Normalize()
      If (aim.x-act.x)*(aim.x-act.x)+(aim.y-act.y)*(aim.y-act.y)+(aim.z-act.z)*(aim.z-act.z)<0.0000001 Then Return
      
      Local axis:TVector=aim.XMultiply(act:TVector) 'Errechnet Drehachse
      axis.Normalize()
      If axis.GetLength()<0.1 Then Return
      
      Local angle:Double=ACos(aim.DotProduct(act:TVector)) 'Errechnet Drehwinkel
      If angle:Double<-180 Then angle:Double:+360
      If angle:Double>180 Then angle:Double:-360
      If angle:Double>maxangle:Double Then angle:Double=maxangle:Double
      If angle:Double<-maxangle:Double Then angle:Double=-maxangle:Double
      
      'Wenn Ziel und Zustandsvektoren genau gegenüber sind
      If act.x=aim.x And act.y=aim.y And act.z=aim.z Then
         angle:Double=Min(170, maxangle:Double)
         axis:TVector=TVector.Create(mat:Double[4], mat:Double[5], mat:Double[6])
      EndIf
      
      
      glPushMatrix()
         glLoadMatrixd(mat:Double)
         glRotated(-angle:Double, axis.x:Double, axis.y:Double, axis.z:Double)
         glGetDoublev(GL_MODELVIEW_MATRIX, mat:Double)
      glPopMatrix()
      
   End Method

End Type



Hat jemand eine Idee, woran es liegen könnte? Ich bin für jede Hilfe dankbar.

EDIT: Problem Gelöst
Falls es jemand brauchen kann:
1. vorher Pitch-Winkel errechnen, Ziel-Pitch errechnen
2. so drehen dass Pitch=0 ist
3. wie oben drehen
4. deltaPitch=ZielPitch-AltPitch, maximalesDeltaPitch errechnen
5. drehen, so dass Pitch-Winkel=AltPitch+ZielPitch ist
http://www.blitzforum.de/showcase/203/

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group