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

Aktuelle Zeit: Di Jul 15, 2025 11:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: analoge uhr
BeitragVerfasst: Sa Apr 05, 2008 19:50 
Offline
DGL Member

Registriert: Sa Apr 05, 2008 13:46
Beiträge: 1
hi

bin total neu im 3d bzw. "2d"-bereich...


ich wollt mal von euch hören ob ihr vorschläge habt wie ich am besten eine analoge uhr realisieren könnte?
damit ich nicht ellenlang in der falschen gegend suche könnt ihr mir vielleicht ja tipps geben?

denke wir fangen mal mit nur einem zeiger an :)

hab da schon ein bisschen was geschafft mit den tutorials und ein bisschen rum-probieren...

1.te frage:
mein programm ist total simpel...
-formcreate
-->init
-onidle
-->zeiger mit glVertex3f erstellen und drehen
-->rendern

muss mann objekte wirklich bei jedem onidle->rendern neu erstellen?
könnte man evtl. beim createform den zeiger erstellen und dann beim onidle
nurnoch drehen???

2.te frage:
mein zeiger (angehängt als anlage) sieht total pixelig aus... kann man den irgendwie glätten? so anti-alias oder sowas?
oder muss man dazu einfach eine andere form machen (mehr ecken)? mein zeiger ist eben eigentlich ein nur objekt mit vier ecken.

3.te frage:
könnte man eine uhr so machen, dass man eine scheibe zeichnet und da drauf in der mitte den zeiger und diesen zeiger dann
verbindet mit der scheibe? also wie wenn mann eine holzscheibe nemen würde, da nen zeiger drüberlegt und dann nen nagel
reinhaut, dass der zeiger nun fix immer an dieser stelle ist und man ihn einfach nurnoch drehen kann (uhrzeiger/gegenuhrzeigersinn).

4.te frage:
kann man eine scheibe + zeiger in nem 3d-programm moddelieren und dann im eigenen programm sagen es soll nur der zeiger bewegt werden?
oder anders gesagt: wenn ich modelle aus nem format importiere, kann mann da zwischen den objekten unterscheiden und auf
nur ausgewählte zugreiffen/manipulieren/drehen?


ihr müsst mir keine kompletten anleitungen geben oder machen/codeschippsel oder was auch immer,
schliesslich will ich's ja selber auch lernen und nicht nur kopieren ;o)

also will ich nicht wissen wie bones funktionieren, wenn mann das dann nicht so einsetzen kann wie ich will
oder parktikel brauch ich wohl auch noch keine... solche sachen kann ich dann später dazulernen :)

ich wäre einfach froh um hinweise wie was am besten gemacht werden könnte? damit ich dann zielgerichtet
an die sache rangehen kann... denn bis jetzt wars leider nur frustration :(


grüsse


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: analoge uhr
BeitragVerfasst: Sa Apr 05, 2008 20:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hi Noobster und willkommen hier,

Noobster hat geschrieben:
1.te frage:
mein programm ist total simpel...
-formcreate
-->init
-onidle
-->zeiger mit glVertex3f erstellen und drehen
-->rendern

muss mann objekte wirklich bei jedem onidle->rendern neu erstellen?
könnte man evtl. beim createform den zeiger erstellen und dann beim onidle
nurnoch drehen???


Genaugenommen erstellst du die Objekte ja nicht. Also, erstmal etwas grundlegendes. Wenn du zwischen glBegin und glEnd irgendeine variante von glVertex aufrufst, werden die Koordinaten an die Grafikkarte übertragen. Je nach dem, welche form von glBegin du verwendest, werden die einzelnen Punkte, auch genannt Vertices oder in der Einzahl Vertex, interpretiert. Wenn du z.B. GL_QUADS angibst, wartet er auf vier Punkte und zeichnet dir daraus ein Viereck (wobei er es genaugenommen erst in zwei dreiecke unterteilt und die dann zeichnet, weil Grafikkarten auf Dreiecke spezialisiert sind).

Noobster hat geschrieben:
2.te frage:
mein zeiger (angehängt als anlage) sieht total pixelig aus... kann man den irgendwie glätten? so anti-alias oder sowas?
oder muss man dazu einfach eine andere form machen (mehr ecken)? mein zeiger ist eben eigentlich ein nur objekt mit vier ecken.


Ja kann man. Dafür musst du bei der Initialisierung ein bestimmtes Pixelformat anfragen, such mal nach Multisampling hier im Forum, ich habe da irgendwo eine Funktion gepostet, die das ganze erleichtert.

Noobster hat geschrieben:
3.te frage:
könnte man eine uhr so machen, dass man eine scheibe zeichnet und da drauf in der mitte den zeiger und diesen zeiger dann
verbindet mit der scheibe? also wie wenn mann eine holzscheibe nemen würde, da nen zeiger drüberlegt und dann nen nagel
reinhaut, dass der zeiger nun fix immer an dieser stelle ist und man ihn einfach nurnoch drehen kann (uhrzeiger/gegenuhrzeigersinn).


Auch das geht. Hierfür empfehle ich dir, dir mal den Wikiartikel zu glBegin anzuschauen und dich mit GL_TRIANGLE_FAN vertraut zu machen, um damit die Scheibe zu zeichnen. Diese zeichnest du in einem Rutsch zwischen einem glBegin und glEnd. Danach veränderst du die Rotation und zeichnest in einem neuen glBegin und glEnd den Zeiger. Wichtig ist, dass du nicht beides in einem Block zeichnest, weil du die Matrix in einem glBegin/glEnd-Block nicht verändern kannst, also keine rotation durchführen kannst.

Noobster hat geschrieben:
4.te frage:
kann man eine scheibe + zeiger in nem 3d-programm moddelieren und dann im eigenen programm sagen es soll nur der zeiger bewegt werden?
oder anders gesagt: wenn ich modelle aus nem format importiere, kann mann da zwischen den objekten unterscheiden und auf
nur ausgewählte zugreiffen/manipulieren/drehen?


Machbar. Aber diese Frage überlasse ich anderen leuten, da ich mich damit noch nicht befasst habe.

Noobster hat geschrieben:
ich wäre einfach froh um hinweise wie was am besten gemacht werden könnte? damit ich dann zielgerichtet
an die sache rangehen kann... denn bis jetzt wars leider nur frustration


Das gibt sich. Wenn du dann erstmal einen sich drehenden Zeiger auf deiner Uhr hast, wirst du ganz anders darüber denken :)

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 05, 2008 20:21 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 07, 2006 16:27
Beiträge: 52
Wohnort: Marbach(bei Chemnitz)
1. Erstellen musst du es nicht jedes mal neu, nur die Vertices übergeben und sagen, das es ein dreieck (viereck) werden soll.
also quasi:
Code:
  1. glbegin(gl_triangles)
  2.  glvertex3f(...);
  3. ...
  4. glend;


Es gibt zwar auch Displaylisten, da Erstellst du das quasi nur einmal und dann kannst du das immer wieder anzeigen. Ist dann allerdings nicht mehr veränderlich.
Mir fällt gerade ein, das ich neulich auch noch irgendwas gelesen hatte, wie man veränderliche Vertexarrays i Grafikram lassen kann, aber ich fids grad nicht mehr.

2. mir war als hätte OpenGL ne Antialias-Funktion... musst du mal ins Wiki schauen.

3. Du renders erst die "Unterlage" bzw die Uhr und dann machst du deine Drehung und Renderst den Zeiger. Dann hast du die Uhr ungedreht und den Zeiger in gedrehter Form. Schau die mal die Einsteiger Tutorials an ...

4. Kannst du. Am einfachsten wäre es, einfach in 2 seperate Models zu exportlieren. Eins für den Zeiger und eins für die Uhr. So hab ichs schon gemacht.


edit: da war wer schneller ...

_________________
Es gibt eine Theorie, die besagt, wenn jemals irgendwer genau rausfindet, wozu das Universum da ist und warum es da ist, dann verschwindet es auf der Stelle und wird durch etwas noch Bizarreres ersetzt.
Es gibt eine andere Theorie, die besagt, dass das schon passiert ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 05, 2008 22:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Noobster,
Ich kann meinen Vorrednern nur beipflichten. Allerdings mit einer Anmerkung:

Zitat:
Es gibt zwar auch Displaylisten, da Erstellst du das quasi nur einmal und dann kannst du das immer wieder anzeigen. Ist dann allerdings nicht mehr veränderlich.

Das stimmt nicht ganz. Du kannst es verändern, und zwar mit glTranslate/glRotate/glScale. :wink: Man kann mit Displaylisten auf diese Weise auch Animationen realisieren. Ich würde Dir aber empfehlen, das Ganze jetzt noch ohne Displaylisten zu machen. Bei bloss einer Scheibe und einem Zeiger sind keine Probleme bei der Framerate (= Geschwindigkeit beim Zeichnen) zu erwarten.

Nachzulesen über Antialiasing ("smoothes" Zeichnen) in unserem Wiki: http://wiki.delphigl.com/index.php/Antialiasing, dort gibt es auch weiterführende Links.

Viele Grüße,
Traude


NACHTRAG:Ich habe eine Art Lehrstück aus meinem Code ausgegraben, das Dir ermöglicht ganz leicht eine Scheibe herzustellen, ohne einen Modeller bemühen zu müssen, denn die Sache mit dem Modeller ist ein mühsames Kapitel von Import/Exportformaten, und ich dachte mir, dass Du mit dem folgenden Code schneller zu Deiner Uhrenscheibe kommst. Texturkoordinaten werden mitgeliefert, das heisst, Du könntest die Uhrenscheibe auch gleich mit einer Textur verzieren.

DrawPolygon zeichnet JEDES regelmäßige Polygon, das man in einen Kreis einschreiben kann. Wenn der Parameter AngleStep immer kleiner wird, nähert es sich einem Kreis an. Mit der Bounding Box kann man das Ding verschieben und jeder Größe anpassen, so ähnlich wie StretchDraw.

Code:
  1. /********************************************************************
  2. // Zeichnen eines texturierten Polygons im Orthomodus
  3. // Achtung! glOrtho setzt den Koordinatenursprung in diesem Beispiel
  4. // links oben und die Dimension auf die Fensterbreite und -höhe
  5.  
  6. // PARAMETER:
  7. // ALeft,ATop,AWidth,AHeight geben die Bounding Box des Polygons an
  8. // AngleStart gibt den Winkel an, bei dem der erste Punkt zu zeichnen ist
  9. // Bei einem Koordinatenursprung links unten läuft er GEGEN DEN UHRZEIGERSINN
  10. // Bei einem Koordinatenursprung links oben läuft er IM UHRZEIGERSINN
  11. // Die Texturkoordinaten werden ebenfalls geflippt
  12. // AngleStep = 5 => Kreis, AngleStep = 60 => Hexagon etc.
  13. // Die Kombination 1.AWidth=AHeight und 2.AngleStep=5 ergibt einen Kreis
  14.  
  15. // Weglassen der Textur: die beiden "glBindTexture"-Befehle
  16. // und das "glTexCoord2f" weglassen
  17.  
  18. Procedure DrawPolygon(ALeft,ATop,AWidth,AHeight: Integer;
  19.              AngleStart,AngleStep: Integer; ATexture: Cardinal);
  20. Const PiDiv180 = PI/180;
  21. Var
  22.    Viewport: Array [0..3] Of Integer;
  23.    DegToRad,TexX,TexY,X,Y: Single;
  24.    Angle: Integer;
  25. Begin
  26.    glMatrixMode(GL_PROJECTION);
  27.    glLoadIdentity;
  28.    glGetIntegerv(GL_VIEWPORT, @Viewport);
  29.  
  30.    // Koordinatenursprung=links oben
  31.    glOrtho(0,ViewPort[2],ViewPort[3],0,+1,-1);
  32.  
  33.    // Koordinatenursprung=links unten
  34.    //glOrtho(0,ViewPort[2],0,ViewPort[3],+1,-1);
  35.  
  36.    glMatrixMode(GL_MODELVIEW);
  37.    glLoadIdentity;
  38.  
  39.    glBindTexture(GL_TEXTURE_2D, ATexture); // Bind Texture
  40.  
  41.    glTranslatef(ALeft+AWidth Div 2,ATop+AHeight Div 2,0);
  42.    glScalef(AWidth,AHeight,1);
  43.  
  44.    glBegin(GL_POLYGON); //---------------------
  45.       Angle:= AngleStart;
  46.       While Angle < AngleStart+360 Do Begin
  47.          DegToRad:= Angle*PIDiv180;
  48.          X:= Cos(DegToRad)*0.5;
  49.          Y:= Sin(DegToRad)*0.5;
  50.          TexX:= X+0.5;
  51.          TexY:= Y+0.5;
  52.  
  53.          glTexCoord2f(TexX,TexY);
  54.          glVertex2f(X,Y);
  55.  
  56.          Inc(Angle,AngleStep);
  57.       End;
  58.    glEnd; // ----------------------------------
  59.  
  60.    glBindTexture(GL_TEXTURE_2D, 0);  // Unbind Texture
  61.  
  62.    // Das SwapBuffers musst Du auf Deine Bedürfnisse umschreiben
  63.    //SwapBuffers(GetDC(AWindow));
  64. End;


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]