Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 21:05

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Okt 25, 2004 22:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hallo!

Habe es endlich geschafft mittels gluUnprojekt durch die Mauskoordinaten an die 3D koordinaten zu kommen.
Ich habe nun versucht, mein Objekt nicht immer an die geklickte pos zu setzen, sondern hin "schweben" oder auch laufen zu lassen.
meine momentanen Funktionen klappen nicht so richtig.
Verstehe auch nicht warum nicht.

Code:
  1.  FUNCTION RichtungPosToNewPos(aPos: TGLVectord3; aRichtung, aSpeed:single):TGLVectord3;
  2. VAR
  3.   a,b: single;
  4.   res: TGLVectord3;
  5. BEGIN
  6. a := 0; b := 0;
  7.   a := aSpeed*sin((aRichtung/180)*pi);
  8.   a := aPos[0] + a;
  9.  
  10.   b := aSpeed*cos((aRichtung/180)*pi);
  11.   b := aPos[2] + b;
  12.  
  13.   res[0]:=a;res[1]:=0;res[2]:=b;
  14.   Result := res;
  15. END;
  16.  
  17. FUNCTION OldAndClickedPosToNewPos(aOldPos, aClickedPos: TGLVectord3; aSpeed:single): TGLVectord3;
  18. VAR
  19.   Richtung: single;
  20.   aNewPos: TGLVectord3;
  21.   a,b: single;
  22. BEGIN
  23.   Result := aOldPos;
  24.   a := aOldPos[0] - aClickedPos[0];
  25.   b := aOldPos[2] - aClickedPos[2];
  26.  
  27.   Richtung := arctan(b/a)*180/pi;
  28.   aNewPos := RichtungPosToNewPos(aOldPos , Richtung , aSpeed);
  29.   Result := aNewPos;
  30. END;


ThX!

_________________
www.audi32.de


Zuletzt geändert von Adler am Fr Aug 19, 2005 09:55, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 25, 2004 22:43 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
Du musst nicht erst den Winkel ausrechnen, sondern addiere einfach den Richtungs Vektor zur Position.

Neue Position = Alte Position + Normierter Richtungs Vektor * Distanz


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 26, 2004 12:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
- Neue Position = Alte Position + Normierter Richtungs Vektor * Distanz

Wie mache ich das? ^^
Kannste mal nen Beispiel bringen?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 26, 2004 13:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Also den (normierten) Richtungsvektor bekommst du so:

Code:
  1.  
  2. //Vektor berechnen:
  3. Dir: Array[0..2] of Extended;
  4. Dir[0]:= ObjectOldPosition.x - ObjectNewPosition.x;
  5. Dir[1]:= ObjectOldPosition.y - ObjectNewPosition.y;
  6. Dir[1]:= ObjectOldPosition.z - ObjectNewPosition.z;
  7.  
  8. //normalisieren
  9. Length: Extended;
  10. Length:= sqrt(Dir[0]*Dir[0]+Dir[1]*Dir[1]+Dir[1]*Dir[1]);
  11. Dir[0]:= Dir[0]/Length;
  12. Dir[1]:= Dir[1]/Length;
  13. Dir[2]:= Dir[2]/Length;
  14.  


Und diesen Vektor zählst du einfach jeden Frame nochmal zu deiner aktuellen ObjectPosition hinzu:

Code:
  1.  
  2. ObjectPosition.x:= ObjectPosition.x + Dir[0] * SPEED;
  3. ObjectPosition.y:= ObjectPosition.y + Dir[1] * SPEED;
  4. ObjectPosition.z:= ObjectPosition.z + Dir[2] * SPEED;
  5.  

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 26, 2004 13:40 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Zum Normieren gibts auch nochmal einen Artikel im Wiki. :o 8)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 26, 2004 14:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Ja, ok das klappt so weit so gut.
ABER ... ;)
Wenn es in die nähe der stelle wos hin soll hinkommt, dann Verschwindet mein objekt.

Fraglos...
Hatte mir eben erst gedacht, evtl der Wert zum Wurzelziehen < 0, aber das geht ja net, wegen * + * + *
Also ist das ausgeschlossen.

Evtl. durch etwas anderes?
Jemand ne Antwort noch dafür?

Danke für das bisherige!

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 26, 2004 14:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Die Berechnung für den Vektor musst du natürlich nicht jeden Frame machen, das reicht einmal ganz am Anfang, vielleicht liegt heir das Problem.
Du musst dein Objekt natürlich anhalten, sonst bewegt es sich in ewige Zeiten weiter.
Je nachdem, von was du den Mauspositionen weist, z.B. Quad parallel zum Beobachter, dann muss hald den Z-Wert deines Objekts überprüfen:

Code:
  1.  
  2. //Quad bei 0|0|-6
  3. if ObjectPosition<= -6 then
  4.  StopAnimation;

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 26, 2004 21:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Danke!

Alles wunderbar.
Habe (das er net weiter fährt als benötigt, folgendes geschrieben):
Code:
  1. FUNCTION CheckIfPoinInCircle( aCircleCenter, aPoint : TGLVectord3; aRadius : Single ) : Boolean ;
  2. VAR
  3.   a , b : single ;
  4. BEGIN
  5.   a := aPoint[0] - aCircleCenter[0];
  6.   b := aPoint[2] - aCircleCenter[2];
  7.   if sqrt(a*a + b*b) > aRadius then
  8.     Result := False;
  9.   if sqrt(a*a + b*b) <= aRadius then
  10.     Result := True;
  11. END;


Für jeden ders braucht ...
Will ja net geizig sein :D

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 31, 2004 19:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Und nu isses wieder Futsch.
Also:

Ich habe nun wieder ein Problem hiermit.
Ich Check auch einfach nicht warum ich das habe, ich verstehe nicht was falsch ist, ich finde nichts heraus.
Nun hier der Source, bitte helft mir, ich verzweifele.
So kann das net weiter gehen :-( Ciao.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 01, 2004 19:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
hab mir grad mal das Programm angesehen, weiß aber nicht genau, was du erreichen willst? wilslt du, dass das dunkelblaue quad immer zu dem türkisen hinfährt?

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 01, 2004 20:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Ja genau.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 03, 2004 21:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Mir kann wohl keiner Helfen?!
Dachte das wäre wieder so ein Typisches *Denk lange drüber nach, sogar Tage und finde es nicht raus obwohls so einfach ist* Problem :-(

Oder doch ein Helfer unter euch? ;)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 03, 2004 23:31 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
~->GEF<-~ Adler hat geschrieben:
Ich Check auch einfach nicht warum ich das habe, ich verstehe nicht was falsch ist, ich finde nichts heraus.

Vieleicht solltest du dir die Muehe machen und das Problem etwas genauer als oben beschreiben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 03, 2004 23:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Irgendwo hast du dich mit deinem Code in eine ziemlich unnötige Umständlichkeit verrannt. Prinzipiell ist es doch ganz einfach (ich habe ein separates Programm geschrieben, dir würde ich auch raten das Projekt neu zu beginnen):
Box2 verfolgt Box, Berechnung der Geschwindigkeit erfolgt in der Draw Routine. Die Position von Box wird beim MouseDown Ereignis berechnet - fertig.
Beispielprogramm ist angehängt:

Code:
  1. procedure TFormClickAndMove.DrawClickAndMove;
  2. var elapsed: integer;
  3.     speed: TVec;
  4.     dist: float;
  5. begin
  6.   elapsed := GetTickCount - LastTime;
  7.   LastTime := LastTime + elapsed;
  8.  
  9.   Speed := VectorSub(Box.GetPosv, Box2.GetPosv);
  10.   dist := VectorNormalize(Speed);
  11.   if dist>0.1 then
  12.     Box2.Movev(VectorScale(Speed, elapsed / 200));
  13.  
  14.   bgDrawScene;
  15.   bgSwapBuffers;
  16. end;
  17.  
  18. procedure TFormClickAndMove.PanelMouseDown(Sender: TObject;
  19.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  20. var wx,wy: integer;
  21.     wz: single;
  22.     mv: TMatrix4d;
  23.     proj: TMatrix4d;
  24.     vp: TVector4i;
  25.     ox,oy,oz: double;
  26. begin
  27.   wx := x;
  28.   wy := Panel.ClientHeight - Y;
  29.   glReadPixels(wx, wy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @wz);
  30.  
  31.   glGetDoublev(GL_MODELVIEW_MATRIX, Addr(mv));
  32.   glGetDoublev(GL_PROJECTION_MATRIX, Addr(proj));
  33.   glGetIntegerv(GL_VIEWPORT, Addr(vp));
  34.   gluUnProject(wx, wy, wz, mv, proj, vp, @ox, @oy, @oz);
  35.  
  36.   Box.SetPos(ox, 0, oz);
  37. end;
  38.  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]