Autor Beitrag
Martin2005
Hält's aus hier
Beiträge: 13

Windows NT 4, Windows 2000, Windows XP, Windows 2003 Server, Windows NT 4 Server, Kanotix
D6 Prof
BeitragVerfasst: Do 27.01.05 14:30 
:?

Hallo Leute!

Ich stehe vor einem sehr kniffligen Problem.

Unzwar habe ich ein Gelenkpunktsystem (wenn man so will auch Skelettsystem) programmiert.
Ich habe das so programmiert, dass Gelenk Nr. 0 als Urgelenk auf x=0.00001 y=0.00001 z=0.00001 liegt. Alle anderen Gelenke sind in Form eines Treesystems an dieses (bzw. das jeweils übergeordnete gebunden) Gelenk gebunden.

An jedes dieser Gelenke können nun 3D-Objekte gebunden werden. Dabei verhalten sich die Objekte zum übergeordneten Gelenk so, als wenn das Gelenk selbst den Mittelpunkt des Raumes darstellt (also 0,0,0 xyz). Wende ich einen Rotationswinkel an. So wird dieser einwandfrei interpretiert.

Zum besseren Verständnis das übergeordnete Gelenk wird als Meistergelenk bezeichnet. Jedes Gelenk hat einen Eigenwinkel und einen Realwinkel. Der Realwinkel ergibt sich aus dem Realwinkel des wiederum übergeordneten Gelenks und dem Eigenwinkel. Die Eigenposition eines Gelenks verhält sich dabei so, als wenn deas Meistergelenk die koordinaten 0,0,0 hätte. Die Eigenwinkel werden auf die Eigenposition angewendet.

Man kann sich das ungefähr so vorstellen:

Koordinaten immer x,y,z

Gelenk[0] Meistergelenk -; Eigenposition 0,0,0; Realposition 0,0,0;
Gelenk[1] Meistergelenk 0; Eigenposition 1,0,0; Realposition 1,0,0;
Gelenk[2] Meistergelenk 1; Eigenposition 2,0,0; Realposition 3,0,0;

Das ist jetzt mal stark vereinfacht.

Auf diesen Gelenkkörper wende ich nun eine Globale Rotation. Dazu lasse ich erst die Gelenkpunktpositionen ermitteln und anschließend die Globalen Winkel auf den Gelenkkörper anwenden. Stelle ich nun die Gebundenen Objekte zum Beispiel eine Pyramide dar, so wende ich in der Translationsmatrix folgende Winkel an

für die Y-Rotation: Gelenk[i].Realwinkel.Y+GlobalWinkelY
für die Z-Rotation: Gelenk[i].Realwinkel.Z+GlobalWinkelZ
für die X-Rotation: Gelenk[i].Realwinkel.X+GlobalWinkelX.

Lasse ich nun das Gelenksystem insgesamt um jede Achse einzeln rotieren funktionert alles wunderbar. Auch wenn ich das System um die Y und Z Achse gleichzeitig rotieren lasse funktioniert alles gut. Alle Objekte verhalten sich wie erwartet. Und passen ihre Lage entsprechend den Winkeln korrekt an.

Aber sobald ich irgendwie die Roation um die X-Achse dazunehme gerät alles aus den Fugen.

Falls jemand dieses Problem kennt, gelöst hat oder weiss wo man Hilfe findet wäre ich echt dankbar.

Ich verlier nämlich langsam den Verstand. Sollte ich die Lösung selber finden werde ich die entsprechenden Roationsberechnungen hier als CODE hinterlegen für andere Suchende.

Danke

Martin
Martin2005 Threadstarter
Hält's aus hier
Beiträge: 13

Windows NT 4, Windows 2000, Windows XP, Windows 2003 Server, Windows NT 4 Server, Kanotix
D6 Prof
BeitragVerfasst: Fr 28.01.05 13:36 
Titel: Das Problem lag in der Reihenfolge der Rotation!
:idea: 8)

Wie ich in meiner Frage versprochen habe, würde ich die Lösung selbst ins Forum stellen, wenn ich Sie finde!
So hier ist Sie also!

Also hier erst einmal die Function:

function Rotate_Vektor(_WinkelY,_WinkelX,_WinkelZ,X,Y,Z:real):TD3DXVector3;
var xn,yn,zn:single;
begin
if _WinkelZ<>0 then begin
_WinkelZ:=(_WinkelZ*-1)/180*PI;
xn:= x* cos(_winkelz) + y* sin(_winkelz);
yn:= x*-sin(_winkelz) + y* cos(_winkelz);
x:=xn;
y:=yn;
end;
if _WinkelX<>0 then begin
_WinkelX:=(_WinkelX*-1)/180*PI;
yn:= y* cos(_winkelx) + z* sin(_winkelx);
zn:= y*-sin(_winkelx) + z* cos(_winkelx);
y:=yn;
z:=zn;
end;
if _WinkelY<>0 then begin
_WinkelY:=(_WinkelY*-1)/180*PI;
xn:= x* cos(_winkely) + z*-sin(_winkely);
zn:= x* sin(_winkely) + z* cos(_winkely);
x:=xn;
z:=zn;
end;{}
Result.x:=x; //Winkel X-Achse
Result.y:=y; //Winkel X-Achse
Result.z:=z; //Winkel Z-Achse
end;

Wichtig ist bei dieser Berechnung allein die Reihenfolge!

1. Rotation um Z
2. Rotation um X
3. Rotation um Y

Wendet man diese Winkel auf die Matrix an:

D3DXMatrixRotationYawPitchRoll(TempMatrix,RotY,RotX,RotZ);

So kann man genau die Position eines Körpers in Verhältnis zu weiteren Körpern anordnen und Rotieren.
So kann man dann Beispielsweise einen Menschen animieren. Räder an einem Fahrzeug drehen lassen etc.
Also einen kompletten Gelenkkoerper erstellen.

Das ganze soll einmal Teil einer Engine für ein Strategiespiel mit 3D Grafik sein. Die Wegberechnung
ist auch schon fertig. Also bis die Tage!

Gruß

Martin