OpenGL-Matrix auf Punkt ausrichten
Übersicht

![]() |
NiborBetreff: OpenGL-Matrix auf Punkt ausrichten |
![]() Antworten mit Zitat ![]() |
---|---|---|
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/ |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group