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

Aktuelle Zeit: Fr Jul 18, 2025 08:43

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 25, 2010 17:18 
Offline
DGL Member

Registriert: Mi Nov 25, 2009 15:54
Beiträge: 9
Hey DGLs,

ich will mit Bones eine Objekt animieren.
Da hab ich mich auf ins Web gemacht und hab das http://texelviews.delphigl.com/index.php?nav=3&theme=peach#restless gefunden.
So jetzt zu mein Problem, wenn ich jetzt die Animation starte bewegt sich der bagger keinen Zentimeter.
Ich hab mir das beispiel angesehen (hab daraus auch die funktionen und das Objekt(den Bagger) her :mrgreen: ).
Hier der Quellcode:
Code:
  1. unit skybox1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs,dglOpenGL, AppEvnts, GLBmp, StdCtrls, ExtCtrls, glRender,Model,Model3ds,
  8.   ModelObj,ModelX,ModelMsa,glxsys, CategoryButtons, Geometry, restless;
  9.  
  10.  
  11. type
  12.   TForm1 = class(TForm)
  13.     ApplicationEvents1: TApplicationEvents;
  14.     Timer1: TTimer;
  15.     Button1: TButton;
  16.     procedure FormCreate(Sender: TObject);
  17.     procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  18.     procedure FormResize(Sender: TObject);
  19.     procedure FormDestroy(Sender: TObject);
  20.     procedure Button1Click(Sender: TObject);
  21.   private
  22.     { Private-Deklarationen }
  23.   public
  24.     DC   : HDC;
  25.     RC   : HGLRC;
  26.     procedure render;
  27.   end;
  28.  
  29.   var
  30.   Form1: TForm1;
  31.   Timefactor:real;
  32.   StartTime, LoopTime: Integer;
  33.   glx:Tglx;
  34.   rlsObj : TRLSObject;
  35.   updateTime : Single;
  36. const
  37.   ADVANCE_RATE = 25;
  38.  
  39. implementation
  40.  
  41. {$R *.dfm}
  42.  
  43. procedure TForm1.Button1Click(Sender: TObject);
  44. begin
  45.   restlessStartAnimation(rlsObj, 1, 1000);
  46. end;
  47.  
  48. procedure TForm1.FormCreate(Sender: TObject);
  49. var
  50. Dummy : HPalette;
  51. i:integer;
  52. TMUs:integer;
  53. begin
  54.   randomize;
  55.   glx:=Tglx.Create(form1);
  56.   glx.Parent:=self;
  57.   glx.Align:=alclient;
  58.   glx.GLXini(DC,RC);
  59.   glx.extfilepath:=extractfilepath(paramstr(0));
  60.   //glx.GLXcreateSkybox('seiten', 'seiten', 'unten', 'oben', 'seiten', 'seiten',1000, 1000, 1000,list[0]);
  61.   glClearColor(0,0,0,0);
  62.  
  63.   // restless initialisieren
  64.   restlessInit();
  65.  
  66.   // objekt erstellt
  67.   rlsObj := restlessCreate();
  68.  
  69.   //objekt laden
  70.   restlessLoadFromFile(rlsObj, PChar(glx.extfilepath + 'objects/Kran.rlsobj'));
  71.  
  72.   //objektanimation laden
  73.   restlessAddAnimationFromFile(rlsObj, PChar(glx.extfilepath + 'objects/Kran.rlsani'));
  74.  
  75.  
  76. end;
  77.  
  78. procedure TForm1.FormDestroy(Sender: TObject);
  79. begin
  80.   DeActivateRenderingContext;
  81.   wglDeleteContext(RC);
  82.   ReleaseDC(Handle, DC);
  83.  
  84.   //animation wieder freigeben
  85.   restlessDestroy(rlsObj);
  86.  
  87.   glx.Free;
  88. end;
  89.  
  90. procedure TForm1.render;
  91. var i:integer;
  92. begin
  93.   glMatrixMode(GL_MODELVIEW);
  94.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  95.  
  96.   glLoadIdentity;
  97.  
  98.   glRotated(90,0,1,0);
  99.   gltranslatef(10,-1,1);
  100.   glRotated(90,0,1,0);
  101.   glPushMatrix();
  102.  
  103.   glColor3f(1.0,0,0);
  104.  
  105.   restlessRender(rlsObj); // objekt rendern
  106.  
  107.  
  108.   glClear(GL_DEPTH_BUFFER_BIT);
  109.   glColor3f(0,1.0,0);
  110.   For i := 0 to restlessGetBoneCount(rlsObj) do
  111.     restlessRenderBone(rlsObj, i, true); //bones rendern
  112.   glPopMatrix();
  113.  
  114.   SwapBuffers(DC);
  115.  
  116. end;
  117.  
  118. procedure TForm1.FormResize(Sender: TObject);
  119. begin
  120.   glx.GLXhandleResize;
  121. end;
  122.  
  123. procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  124. begin
  125.   LoopTime := gettickcount-starttime;
  126.   TimeFactor := LoopTime*0.00000000001+1;
  127.   StartTime := gettickcount;
  128.  
  129.       // Update Restless:
  130.     updateTime := updateTime + TimeFactor;
  131.     If (updateTime > ADVANCE_RATE) then
  132.     Begin
  133.       restlessAdvanceAnimation(rlsObj, updateTime);
  134.       updateTime := updateTime - ADVANCE_RATE;
  135.     End;
  136.  
  137.   Render;
  138.  
  139.   glx.SetFocus;
  140. end;
  141. end.


Hab ich da noch was vergessen oder falsch gemacht ?

Ich danke für alle antworten

MfG
deinChef


Zuletzt geändert von deinChef am Fr Jan 29, 2010 22:47, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 26, 2010 13:28 
Offline
DGL Member

Registriert: Mi Nov 25, 2009 15:54
Beiträge: 9
Was nutzt ihr zur Bones Animation ?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 27, 2010 12:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi, also ich glaube er bewegt sich doch, nur ganz langsam, oder gar nicht, denn:

(Prozedur ApplicationEvents1Idle)
Code:
  1. LoopTime := gettickcount-starttime;
  2. TimeFactor := LoopTime*0.00000000001+1;
  3. StartTime := gettickcount;

Hier multiplizierst du den Timefactor mit nem ganz kleinen Wert, deswegen wird deine updateTime erst in ein paar Jahren über der ADVANCE_RATE von 25 ms liegen.
Nimm einfach mal:

Code:
  1. TimeFactor := LoopTime;

Hoffe das hilft dir weiter, ansonsten: nachfragen. :wink:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 27, 2010 15:14 
Offline
DGL Member

Registriert: Mi Nov 25, 2009 15:54
Beiträge: 9
Hey MatReno,

hat daran gelegen , aber jetzt ist es zu schnell?

Code:
  1.   LoopTime := gettickcount-starttime;
  2.   TimeFactor := LoopTime; // auch mit * 0.01 und * 0.001 wird es nicht besser ()
  3.   StartTime := gettickcount;

dann hab ich das auch noch mit den SDLs gemacht aber da ist auch keine Reaktion zu sehen.
Code:
  1.   StartTime := SDL_GetTicks();
  2.  Render;
  3.  endtime:=SDL_GetTicks();
  4.  TimeFactor := (endtime - StartTime);


Ich hab noch ein Timer eingebaut der aller Sekunden die restlessStartAnimation startet ,also kein Button mehr.

MfG
deinChef


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 27, 2010 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Mhh, komisch. Das sollte eigentlich vollkommen genügen:
Code:
  1. TimeFactor := gettickcount-starttime;
  2. StartTime := gettickcount;


Mir ist noch aufgefallen, dass du bei deiner ApplicationEvents1Idle procedure am Ende noch
Code:
  1. Done := false;

einfügen musst. Vllt liegt es ja daran...

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 28, 2010 16:11 
Offline
DGL Member

Registriert: Mi Nov 25, 2009 15:54
Beiträge: 9
mmmhhhhh, merkwürdig :?
funktioniert immer noch nicht (das Done hab auch schon rein geschrieben habs voher bloß vergessen :lol: , aber wäre eine Fehlermöglichkeit gewesen).
hier die exe zum austesten (Animation wird automatisch gestartet) und die PAS
unter http://xweblite.xw.ohost.de/index.php?auswahl=programm&wahl=animation

vielleicht hilfts, wenn ihr das selbst mal euch anseht :D


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 28, 2010 23:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Welches Intervall hat dein Timer?
Und warum startest du die Animation überhaupt in einem Timer?

Also nochmal zum Verständnis deines Problems:
Die Animation läuft, aber sie ist einfach zu schnell?

Wenn du alle Sekunden die Restless Animation startest, sollte sie nie laufen, denn:
Code:
  1. restlessStartAnimation(rlsObj, 1, 1000);
besagt, dass die Animation 1 in 1000 ms gestartet werden soll, und in dieser Zeit sich die Bones des Objektes auf das erste Keyframe der Animation interpolieren.

PS: Die exe konnte ich noch nicht testen... bin hier unter ubuntu am werkeln.


EDIT: Da fällt mir noch was auf: AM Anfang ist StartTime nicht definiert (oder =0), was dann im ersten frame zu einer sehr großen (gettickcount) UpdateTime führt, die sich nur sehr langsam wieder abbaut.
Füge mal beim FormCreate:
Code:
  1. StartTime := gettickcount;
ein. Wenn es jetzt funktioniert solltest du dein ApplicationOnIdle Code umbauen, so dass es nicht nötig ist die StartTime vorher zu deklarieren. (So wie es im Restless Beispielcode ist.)

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 17:03 
Offline
DGL Member

Registriert: Mi Nov 25, 2009 15:54
Beiträge: 9
Hey MatReno,

vielen vielen dank es lag an der
zeile
Code:
  1. StartTime := gettickcount;


das Initialisierung hat geholfen.
Ich weiß das man die dinger erst immer initialisieren muss aber ich vergesse das immer :D

MfG
deinChef


Zuletzt geändert von deinChef am Fr Jan 29, 2010 22:45, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 17:29 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
D.h. Dein Problem ist gelößt und die Animation läuft?
Kannst du den Thread dann entsprechend mit [gelöst] kennzeichnen?

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 29, 2010 22:45 
Offline
DGL Member

Registriert: Mi Nov 25, 2009 15:54
Beiträge: 9
Alles funktioniert super :mrgreen:

danke für eure antworten

MfG
deinChef


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Google [Bot] und 17 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.008s | 16 Queries | GZIP : On ]