#1 24.05.2006 11:21:47

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Mathe-Frage: Rotation bestimmen

Hallo,

also mein Mesh steht bei X,Y,Z, Y ist die Höhe.

Mein Mesh schaut nach TargetX, TargetY, TargetZ, da will es hinlaufen.

Also Y ist quasi egal hier.

1) Es soll auf kürzestem Wege dorthin laufen, wie berechne ich die nächste Position? Und zwar auf kürzestem Wege dorthin mit gleichgrossen Schritten wenn möglich.

2) Das Mesh soll in die Richtung schauen, in die es geht. Wie berechne ich die RotationY um den Mesh richtig zu drehen? Und zwar im Bereich -pi bis pi?

Hatte sowas probiert:
nrotatey:=45+RadToDeg(-arctan2(ntargetX-x,ntargetz-z));
wobei die 45 aufrgrund des Meshes drin sind, da ist etwas gedreht.
Aber das liefert mir die Werte auf 360° nicht auf PI, korrekt?

Kann mir da ein Mathe-Spezialist aushelfen?

Vielen Dank!

Firle

Offline

 

#2 24.05.2006 11:57:30

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Erstmal ein paar Variablen

Code: delphi

vposition := dx3dvector3(x, y, z);
vtarget := dx3dvector3(targetx, targety, targetz);
fspeed = 10.0;   // Geschwindigkeit in Units/Sekunde
fspeedtimed = fspeed * ftimeelapsed;



zu 1)

Code: delphi

// Vektor begrenzen, damit das Ding nicht übers Ziel hinaus fährt.
ftargetlen :=  dx3dlength(vtarget);
if (ftargetlen > fspeedtimed) then
    dx3dvec3scale(vtargetscaled, vtarget, fspeedtimed / ftargetlen);
else
    vtargetscaled := vtarget;
// Bewegen
dx3dvec3add(vnewposition, vposition, vtargetscaled);



zu 2)
Braucht du umbedingt den Winkel?
Ich würde das jetzt über D3DXMatrixRotationVec (http://www.delphidev.de/phpBB2/viewtopic.php?t=69) machen.
Wenn dein Ergebniss korrekt ist und nur im falschen Bereich liegt: Teile durch 180 und multiplziere mit Pi. (Alternativ gibts bestimmt auch DegToRad() )
BTW: Was zur Hölle macht bitte 'arctan2'??? Warum bekommt das zwei Parameter?


My software never has bugs. It just develops random features.

Offline

 

#3 24.05.2006 12:07:14

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

lol.

Bin gerade nicht zu Hause, habe kein Delphi, aber arctan2 ist in der Math unit und rechnet Winkelmass in Bogenmass oder so? Muss ich nachgugn.

Mich würde an der Stelle wirklich erstmal nur die Mathematische Lösung interessieren bei 1) für x,y,z und 2) für die Drehung bezogen auf pi.

Du hast auf jeden Fall Recht, dafür benötige ich einen speedfactor der von der verstrichenen Zeit abhängt.

Danke schonmal für die Tips.

Firle

Offline

 

#4 24.05.2006 12:44:24

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

ich merke gerade:
Ich hab irgendwie angenommen das Target bei dir ein Richtungsvektor ist, du scheinst aber den Zielpunkt zu meinen. Also:
vTarget := TargetXYZ - vPosition;

Was stellst du dir unter "Mathematische Lösung" vor?

Der Arcus-Tangens bekommt normalerweise nur einen Parameter, nämlich den Quotient Gegenkathete durch Ankathete.


My software never has bugs. It just develops random features.

Offline

 

#5 24.05.2006 12:51:24

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Hi!

Mit mathematische Lösung meine ich sowas wie ich da halt hatte, eine funktion bei der X und Z und TargetX und TargetZ drin stehen und die als Ergebnis einen Wert zwischen -pi und pi hat.

Sowas wie ich da ganz oben gepostet habe.

Firle

Offline

 

#6 24.05.2006 12:54:44

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Aha, und wo ist bei deinem Mesh "vorne" ? Also der Vektor wo bei dir 0 Grad ist?


My software never has bugs. It just develops random features.

Offline

 

#7 24.05.2006 12:54:54

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Du kannst dann aus Coolcats Richtungvektor, den Winkel berechnen.
wenn du Gegenkathete (Z-Wert des Vectors) durch Ankathete (X-Wert des Vektors) teils und davon den Arctan nimmst. bekommst du den Winkel im Bogenmaß.
Damit kannst da dann mit

x = x + sin(winkel)*speedtimed;
y = y + cos(winkel)*speedtimed;

deine nächste Position berechnen. falls Y keine Rolle Spielt.
Für die Rotation musst du dann eben den Winkel in MatrixRotationY einsetzten.

Trotzdem wirde ich es so wie Coolcat machen.
Einst Kürze und schneller und einfacher.

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#8 24.05.2006 13:01:04

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

@Chris: Das funzt nur wenn der Vektor (1,0,0) vorne darstellt. Und "y" soll wohl "z" sein wink

Zitat:

Trotzdem wirde ich es so wie Coolcat machen.
Einst Kürze und schneller und einfacher.

Viel schneller big_smile


My software never has bugs. It just develops random features.

Offline

 

#9 24.05.2006 13:01:53

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Danke euch beiden, ich muss mal schauen, ob ich das heute abend mit euren Hilfen auf die Beine kriege.   :thx2:

Firle

Offline

 

#10 24.05.2006 13:20:15

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Mathe-Frage: Rotation bestimmen

Arctan2 ist wie Arctan, nur dummerweise liefert Arctan nur Ergebnisse von -Pi bis +Pi, glaub ich. Arctan2 dagegen vom vollen Kreis.
Okay, dann müßte der Bereich von Arctan noch kleiner sein.

Peer

Offline

 

#11 24.05.2006 13:35:07

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Werte außerhalb von -Pi bis +Pi machen keinen Sinn, da der Tangens da eine vertikale Asymptote (Polstelle) hat....würde also nur Müll rauskommen.


My software never has bugs. It just develops random features.

Offline

 

#12 30.05.2006 05:48:17

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Hallo,

nochmal aufwärmen: Arctan2:

Zitat:


Die Funktion berechnet den Arcustangens-Winkel sowie den Quadranten einer bestimmten Zahl.

Unit

Math

Kategorie

Trigonometrie

Delphi-Syntax:

function ArcTan2(const Y, X: Extended): Extended;

C++ Syntax:

extern PACKAGE Extended __fastcall ArcTan2(const Extended Y, const Extended X);

Beschreibung

ArcTan2 berechnet den Wert ArcTan(Y/X) und gibt einen Winkel im richtigen Quadranten zurück. Der Wert von X und dY muss zwischen –2^64 und 2^64 liegen. Außerdem darf X nicht 0 sein. Der Rückgabewert wird im Bogenmaß angegeben und liegt im Bereich zwischen -Pi und Pi.

Mein Code:

Code: delphi

procedure tcanimmesh.process(speedfactor: single);
begin
  inherited;
  if not boolstand then begin
    if round(x)>round(ntargetx) then x:=x-0.02
    else if round(x)<round(ntargetx) then x:=x+0.02;
    if round(z)>round(ntargetz) then z:=z-0.02
    else if round(z)<round(ntargetz) then z:=z+0.02;
    y:=landscape.altitude[x,z]+0.65;
  end;
  if (random(500)=0) or (round(x)=round(ntargetx)) and (round(z)=round(ntargetz)) then begin
    boolstand:=not boolstand;
    if not boolstand then begin
      ntargetx:=random(64)+16;
      ntargetz:=random(64)+16;
    end;
  end;
  nrotatey:=(-arctan2(ntargetx-x,ntargetz-z));
end;



Der Speedfactor fehlt auch noch, das ganze ist halt ganz am Anfang.

Rendern:

Code: delphi

procedure tcanimmesh.draw;
var mesh: tdjxmesh;
var nanim: integer;
begin
  inherited;
  if boolstand then nanim:=0 else nanim:=1;
  mesh:=form1.djxanimmeshlist1.meshes[nanim];
  form1.danjetx1.matrices3d.clearworldmatrix;
  form1.danjetx1.matrices3d.scaleworld(nsx,nsy,nsz);
  form1.danjetx1.matrices3d.moveworld(x,y,z);
  form1.danjetx1.matrices3d.applyworldmatrix;
  if mesh.isinfrustum then mesh.render(x,y,z,0,nrotatey,0,nsx,nsy,nsz,round(nanimpos));
  nanimpos:=nanimpos+1;
end;



Also nrotatexy muss in die Richtung nach Targetx und TargetZ gugn.

Kennt jemand überhaupt ein Sample mit Code oder so, wie man beim 3D Bereich Menschen bewegen/agieren lassen kann?


Gruß
Firle

Offline

 

#13 30.05.2006 07:39:53

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Also das sieht so richtig aus, was funzt den nicht?

Brauchst du wirklich den Winkel nur damit du mit dieser mesh.render-Methode arbeiten kannst?


My software never has bugs. It just develops random features.

Offline

 

#14 30.05.2006 08:01:07

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Hi Coolcat,

es ist halt so, dass ich zum einen noch einen Time-factor reinbauen muss, aber das ist ja kein Thema kenn ich von CX.

Zum anderen laufen die Kerle jetzt nicht wirklich korrekt in die Richtung sondern ein bissel Zickzack, siehe in der Process-Methode die Änderungen für X und Z. Evtl. müsste man hier mit einem Winkel arbeiten denke ich? Die sollen halt gleichgroße Schritte in die korrekte Richtung machen bis die da sind, dann warten und zu einem neuen Punkt latschen. Ist bisher nur zufallsabhängig.

Zum anderen sollen die in die Richtung schauen, in die die gehen, das wird über das nrotatey gestuert und liegt zwischen -pi und pi.

Bei CX liefen die ja nur in 4 Himmelsrichtungen und die Diagonalen im 2D Raum, da hatte ich diese Probleme nicht.

Danke,
firle

Offline

 

#15 30.05.2006 08:05:43

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Dafür brauchst du keinen Winkel. Bau dir die Transformationsmatrix direkt mit der D3DXMatrixRotationVec-Funktion (http://www.delphidev.de/phpBB2/viewtopic.php?t=69) selbst zusammen.


My software never has bugs. It just develops random features.

Offline

 

#16 30.05.2006 08:17:08

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Hiermit?

Code: delphi

function d3dxmatrixrotationvec(out matrix: td3dxmatrix; vecnormal, vecfront,  position: td3dxvector3): td3dxmatrix;



Und dann in etwa so:

D3DXMatrixRotationVec(mattmp,D3DXVector3(0,1,0),d3dxvector3(targetx,y,targetz),d3dxvector3(x,y,z));

So, dann habe ich eine Matrix. Wie bekomme ich aus der dann nrotatey und bekomme ich aus der auch die neue Position nach dem nächsten Schritt, sagen wir mit nSpeed und nTimeelapsed?

Firle

Offline

 

#17 30.05.2006 08:38:53

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

1. Warum verwendest du eigentlich nicht die Vectoren von DirectX, sondern immer drei einzelne Variablen? Macht das ganze doch nur total unübersichtlich und möglicherweise auch langsamer.

2. Das d3dxvector3(targetx,y,targetz) muss d3dxvector3(targetx,0,targetz) heißen!

3. Wofür brauchst du nrotatey überhaupt? Wenn du die erzeugte Matrix setzt ist das Mesh bereits rotiert! Doch nicht etwa nur um mit dieser Mesh.Render()-Methode zu arbeiten, oder?

4. Die neue Position musst du wie vorher selbst berechnen.


My software never has bugs. It just develops random features.

Offline

 

#18 30.05.2006 08:43:52

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Natürlich will ich mit der Mesh.Render Methode arbeiten, das ist doch gerade die Idee. Ich baue gerade ein Sample für DanJetX.

Das Mesh.Render berücksichtigt halt direkt Licht, Materialien usw.

Das war ja auch der Grund, warum ich einfach vorher nur mathematisch die Variablen nrotatey und halt Position nächster Schritt ermitteln wollte.

Firle

Offline

 

#19 30.05.2006 12:00:41

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Zitat:

Das Mesh.Render berücksichtigt halt direkt Licht, Materialien usw.

Hääää? :rock:  Das macht DirectX bzw. die FFP für dich...sofern du Licht und Material vorher korrekt setzt.


My software never has bugs. It just develops random features.

Offline

 

#20 30.05.2006 12:06:32

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Jaja. Gnnnn.

Offline

 

#21 30.05.2006 12:09:34

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Also ich formulier die Frage neu:

Ich habe X,Y und TargetX und TargetY im 2D Raum. Ohne 3D.

Ich habe nix mit MEshes zu tun, sonst gibt ja wieder die alte diskussion. 8)

Nur die 4 Werte.

Wie kann ich

1) Den Winkel errechnen von X,Y ausgehend nach TargetX,TargetY im Bereich -pi bis pi?

2) Wie bekomme ich gleichgroße Schritte hin die von X,Y auf kürzestem Wege nach TargetX,TargetY gehen?

Firle

Offline

 

#22 30.05.2006 13:05:57

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Frage 1) hast du selbst beantwortet, zumindest sieht dein Code richtig aus.
Frage 2) wurde bereits ganz am Anfang beantwortet (da war es noch Frage 1 )


My software never has bugs. It just develops random features.

Offline

 

#23 30.05.2006 13:46:35

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

So was in der Art (noch nicht getestet):

Code: delphi

//Berechnung der Entfernung zweier Punkte: 
function distance(x,y,x2,y2: integer): real; 
begin 
result := sqrt( power(y2-y, 2) + power(x2-x, 2) ); 
end; 

//Winkel einer Strecke zwischen zwei Punkten: 
function getangle(x, y, x2, y2: integer): real; 
begin 
result := degtorad(90) + arctan2(y2-y, x2-x); 
end;

procedure tcanimmesh.process(speedfactor: single);
begin
  inherited;
  if not boolstand then begin
    //Falls Entfernung geringer als Geschwindigkeit direkt ans Ziel setzen 
    if distance(x,z,targetx,targetz) < nspeed then 
    begin 
      x := targetx; 
      z := targetz; 
    end else begin
     //Eigentliches Bewegen 
     x:=round(x + sin(nrotatey)*nspeed ); 
     z:=round(z - cos(nrotatey)*nspeed );    
    end;
    y:=landscape.altitude[x,z]+0.65;
  end;
  if (random(500)=0) or (round(x)=round(ntargetx)) and (round(z)=round(ntargetz)) then begin
    boolstand:=not boolstand;
    if not boolstand then begin
      ntargetx:=random(64)+16;
      ntargetz:=random(64)+16;
      nrotatey:=getangle(x,z,targetx,targetz); 
    end;
  end;  
end;

Offline

 

#24 30.05.2006 17:50:42

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Mathe-Frage: Rotation bestimmen

1.: weiß nicht genau, aber power(a,2) würde ich ersetzen durch sqr(a) oder a*a

2.: getAngle und Distance sieht korrekt aus.

3.: Zu Deiner Frage mit dem einen Schritt in diese Richtung bewegen:
wenn Du den Winkel hast, dann:
xneu := xalt + cos(winkel)*speed;
yneu := yalt + sin(winkel)*speed;

Könnte also richtig sein, was da oben bei Dir steht. Das Round ist allerdings garantiert falsch. Falls Du zum Anzeigen gerade Werte brauchst, dann runde die Werte in eine temporäre Variable, immer unmittelbar vor dem Zeichnen. Die echten Werte niemals runden, ergibt bei sin und cos nämlich keinen Sinn, es sei denn, Speed ist sehr groß.

Hast Du den Winkel nicht, dann:
x:=xziel-xalt;
y:=yziel-yalt;
n:=sqrt(sqr(x)+sqr(y));
xneu:=xalt+x/n*speed;
yneu:=yalt+y(n*speed;

Peer

Offline

 

#25 30.05.2006 18:29:19

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe-Frage: Rotation bestimmen

Hi Peer,

das Round habe ich schon rausgeschmissen, danke.

Klappt jetzt schon ganz gut. big_smile

Firle

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson