Erfahrugn mit 3d Programmierung?

  • Hohi,


    also ich hab eine grundlegende Frage.


    Hat heir einer schonmal ein 3d Programm gemacht?


    Bzw weis einer wie man sowas überhaupt erstellt?


    Oder weis einer ein paar seiten wo man sowas erlernen kannt, weil bisher hab ich immer nur directx und opengl sachen gesehen, wollte halt mal gern nur auf doof mal nen 3d würfel auf dem osd zaubern, damit ich das rein mathematisch auch mal verstehe.


    Kann mir da jemand unter die Arme greifen ? :)

  • Zitat

    Original von BEEjay
    Hohi,


    also ich hab eine grundlegende Frage.


    Hat heir einer schonmal ein 3d Programm gemacht?


    Ja


    Zitat


    Bzw weis einer wie man sowas überhaupt erstellt?


    Ja


    Zitat

    Oder weis einer ein paar seiten wo man sowas erlernen kannt, weil bisher hab ich immer nur directx und opengl sachen gesehen, wollte halt mal gern nur auf doof mal nen 3d würfel auf dem osd zaubern, damit ich das rein mathematisch auch mal verstehe.


    Kann mir da jemand unter die Arme greifen ? :)


    Also, ich weiss nicht genau, was du machen willst, aber ich interpretiere mal so:
    <br>
    Du möchtest wahrscheinlich die 2D-Koordinaten der Eckpunkte des Würfels abhängig von Rotationswinkeln etc. berechnen und dann auf dem OSD des VDR (wie auch immer) darstellen? Evt. automatisch rotierend oder einer Kurve folgend? Oder Parameter einstellen (Winkel) und dann anschauen?


    Dazu musst du dir die Eckpunktkoordinaten des Würfels definieren (3D) und die Rotationsmatrix für deine Winkel aufstellen. Koordinaten mit Matrix multiplizieren und dann einfach die (x,y)-Koordinaten nehmen und verbinden.
    Wie du das im OSD umsetzt weiss ich nicht (hab' mich noch nie damit beschäftigt).

    Vielleicht willst du aber auch was anderes???


    Frank


    Wohnzimmer: Geode NX1750 512MB M811, TT1.5, TT-DVB-S Budget, 2,4TB, Mahlzeit 4.0b,vdr 1.4.6extp25
    Spielwiese: Scenic-S, Cel 900, TT-Budget-S, dxr3 oder xine, 40 GB
    Analog: Athlon 2000XP, ECS K7S5A, 512MB, PVR350+PVR150MCE, 500GB, easyVDR 0.5rc1
    Neu: Asus P5K-V, E6750, 2GB, TT-Budget-S, 80GB, NV 7300GS, easyVDR 0.5rc2 mit xineliboutput

  • fabo


    also ich möchte eigenldihc genau das ... in der Mitte ist ein würfel.


    Drücke ich nach rechts soll sich der würfel rechtsherum drehen, nach links dann halt andersherum, nach oben .. usw.


    Also ich bin immer davon ausgegangen das man vektoren nur von 2d in 3d abbilden kann aber umgekehrt geht das ja nur wenn eine koordinate immer 0 ist. Oder sehe ich das falsch ?


    Oder hat das garnichts mit abbildungen von vektoren zu tun?


  • Also, du projiziert deinen Würfel auf eine Ebene (3D->2D). Diese ist der Einfachheit halber die xy-Ebene (bzw. dein Bildschirm). Bei dieser "einfachen" Projektion gehen einfach die z-Koordinaten auf null (also Abbildung (x,y,z) -> (x,y). Rechnen tust du im 3D-Raum, auch alle Koordinaten werden so gehalten. Nur für die Darstellung wählst du den 2D-Raum.
    Du kannst natürlich auch eine andere Ebene wählen (definiert per Ebenengleichung etc.) und den Schnitt deines Würfels (bzw. deiner Würfelkanten) mit dieser Ebene ausrechnen. ist aber alles komplizierter und im Prinzip ist alles nur eine Koordinatentrafo.


    Du willst wohl die Rotationsmatrix (bzw. die beiden Winkel per Druck auf die Cursortasten um z.B. 5 Grad ändern, daraus die neue Rotationsmatrix berechnen und mit den Eckkoordinaten des Würfels (der Einfachheit halber (-1,-1,-1),(-1,-1,1) etc. multiplizieren und darstellen (evt. noch skalieren).


    Sollte kein allzu grosses Problem darstellen. Alternativ kannst du die Winkel auch durch einen Timer automatisch ändern.


    Frank


    Wohnzimmer: Geode NX1750 512MB M811, TT1.5, TT-DVB-S Budget, 2,4TB, Mahlzeit 4.0b,vdr 1.4.6extp25
    Spielwiese: Scenic-S, Cel 900, TT-Budget-S, dxr3 oder xine, 40 GB
    Analog: Athlon 2000XP, ECS K7S5A, 512MB, PVR350+PVR150MCE, 500GB, easyVDR 0.5rc1
    Neu: Asus P5K-V, E6750, 2GB, TT-Budget-S, 80GB, NV 7300GS, easyVDR 0.5rc2 mit xineliboutput

  • Achso, ja ok so hab ich mir das schon fast gedacht, dachte erst das die z koordinate den POV (Point of View) angibt.


    Also muss ich nur dann alles normal berechnen im 3d raum und dnan später die z koordinate nur wegnehmen, also so wie ich das nun verstanden habe.


    Weil das hört sich simpel an aber was ich mit dir würfel rückseite ich mein ich lege da ja zb später bilder drauf.


    muss ich dann die z koordinate beachten, und daran entscheiden was dann hinten ist und was vorne ? Vorrausgesetzt diese koordinate zeigt das grade an.


  • Jetzt muss ich mal im Gedächtnis kramen (ist alles schon etwas länger her)...


    Ich denke, du musst dafür einfach den Normalenvektor der Würfelebenen bestimmen. wenn die z-Koordinate negativ ist (je nach Standpunkt), dann wird die Seite angezeigt, ansonsten nicht.


    Wohnzimmer: Geode NX1750 512MB M811, TT1.5, TT-DVB-S Budget, 2,4TB, Mahlzeit 4.0b,vdr 1.4.6extp25
    Spielwiese: Scenic-S, Cel 900, TT-Budget-S, dxr3 oder xine, 40 GB
    Analog: Athlon 2000XP, ECS K7S5A, 512MB, PVR350+PVR150MCE, 500GB, easyVDR 0.5rc1
    Neu: Asus P5K-V, E6750, 2GB, TT-Budget-S, 80GB, NV 7300GS, easyVDR 0.5rc2 mit xineliboutput

  • Hi,


    ich habe das ganze mal mittels Gutdünken während meines Abiturs gemacht. Hatte Mathematikleistungskurs mit jede Menge Vektorrechnung. Ich habe mir das einfach so vorgestellt:


    Mein Blickfeld durch das Monitorrechteck habe ich mir einfach als Pyramide mit rechteckiger Grundfläche vorgestellt, bei der sich das Auge an der Spitze der Pyramide befindet. Die Grundfläche der Pyramide ist entweder nicht vorhanden, dann hat man unendliche Sichtweite, oder sie begrenzt die Sichtweite. Alle 3D-Punkte, die dann auf dem Monitor dargestellt werden müssen, müssen sich innerhalb der Pyramide befinden. Zuätzlich müssen alle 3D-Punkte ausserhalb der Pyramide berechnet werden, die zu einem Pylogon gehören, von dem ein Punkt innerhalb der Pyramide ist.


    Die Transformation von einem beliebigen 3D-Punkt funktioniert dann so:
    Man stellt sich eine Fläche durch den 3D-Punkt vor, die parallel zur Grundfläche der Pyramide bzw. parallel zur Monitorfläche bzw. senkrecht zur Blickwinkelmittelachse. Diese Fläche schneidet die vier Kantenstrahlen der Pyramide, die vom Auge zur Grundfläche führen. Diese Kantenstrahlen sind liegen genau in den vier Ecken des Bildschirms. Nun kann ich die Strecken von den vier Kantenstrahlenschnittpunkten zu dem 3D-Punkt berechnen bzw. genauer die Längen von dem 3D-Punkt zu den vier Kantenstrahlen. Diese Längen haben das gleiche Verhältnis, wie die vier Eckpunkte des Bildschirms zum darzustellenden 2D-Punkt. Und schon weiß man, wo auf dem Bildschirm der 3D-Punkt erscheinen muß. Diese Transformation führt man wie oben beschrieben für alle notwendigen 3D-Punkt durch.


    Führ die Darstellung auf dem Bildschirm muss man jetzt noch zusätzlich den Abstand von den 3D-Punkten zur Pyramidenspitze bestimmen. Alle 3D-Punkt müssen dann vom weit entferntesten Punkt zum nähsten Punkt sortiert werden.


    Dann kann man anfangen das Bild auf den Schirm zu zeichnen. Man beginnt mit dem am weitesten entfernten 3D-Punkt und zeichnet das zum ihm zugehörige Polygon. (Bei mir war es nur das Drahtgitter. Weiter bin ich damals nicht gekommen). Und so weiter bis man mit dem nähsten Punkt fertig ist. Das sollte dann ein 3-dimensional wirkendes Bild ergeben.


    Dieses Verfahren hat einen Fehler bei der Positionierung des 3D-Punktes auf dem Bildschirm. Ich habe das oben der Einfachheit halber mit einer ebenen Fläche gemacht. In Wirklichkeit ist das aber keine ebene Fläche, sondern eine Kugeloberfläche. Während meines Analysiskurses an der Uni habe ich mal den maximalen Fehler, der dadurch zustande kommt, ausgerechnet. Er lag, wenn ich mich nicht irre bei etwas über 4%, wenn man einen Blickwinkel in der Spitze der Pyramide von 45° annimmt. Ich habe leider keine Information darüber gefunden, welcher Blinkwinkel optimal ist bzw. dem menschlichem Empfinden am besten entspricht, um einen möglichst realistischen 3D-Effekt auf dem Bildschirm zu bekommen. Ich würde den jedoch als Parameter in die Berechnungen mit reinnehmen.


    Alles klar? Wenn noch fragen sind, fragen!


    Kleini

    VDR-User #985


    SW: Debian Sid, e-Tobi's VDR 1.6.0, vdr-sxfe mit VDPAU :strike1
    Plugins: devstatus, director, dvd, extb, femon, graphlcd, lastfm, mp3, mplayer, osdpip, osdteletext, premiereepg, skinenigmang, streamdev-server, sysinfo, text2skin, tvonscreen, vcd, vdrrip, webvideo, xineliboutput
    HW: Silverstone LC17, P5Q SE, C2D E7300, 1GB RAM, 500GB Platte, Hauppauge DVB-S rev1.6, TT 3200

  • Zitat

    Original von BEEjay
    Stimmt ja .. der kann ja negativ werden, oh man ich muss noch viel aufholen :).


    Aber ich werd mal heute abend was veruschen zu basteln.


    Aber das schlimme wird wohl die berechnung der Rotation sein.


    Alles halb so wild. Man muss nur systematisch vorgehen.
    Rotationsmatrx (findest du leicht im Internet definiert) aufstellen, Matrixmultiplikation durchführen und fertig.


    Wohnzimmer: Geode NX1750 512MB M811, TT1.5, TT-DVB-S Budget, 2,4TB, Mahlzeit 4.0b,vdr 1.4.6extp25
    Spielwiese: Scenic-S, Cel 900, TT-Budget-S, dxr3 oder xine, 40 GB
    Analog: Athlon 2000XP, ECS K7S5A, 512MB, PVR350+PVR150MCE, 500GB, easyVDR 0.5rc1
    Neu: Asus P5K-V, E6750, 2GB, TT-Budget-S, 80GB, NV 7300GS, easyVDR 0.5rc2 mit xineliboutput

  • kleini:


    Wenn du eine realistische 3D-Sicht auf deine Objekte haben willst, wird es natürlich etwas komplizierter. Da scheint dein Verfahren auf den ersten Blick aber stimmig zu sein.


    Wenn BEEjay alles fertig hat, kann er es uns ja mal zeigen ;)


    Wohnzimmer: Geode NX1750 512MB M811, TT1.5, TT-DVB-S Budget, 2,4TB, Mahlzeit 4.0b,vdr 1.4.6extp25
    Spielwiese: Scenic-S, Cel 900, TT-Budget-S, dxr3 oder xine, 40 GB
    Analog: Athlon 2000XP, ECS K7S5A, 512MB, PVR350+PVR150MCE, 500GB, easyVDR 0.5rc1
    Neu: Asus P5K-V, E6750, 2GB, TT-Budget-S, 80GB, NV 7300GS, easyVDR 0.5rc2 mit xineliboutput

  • Also die ganzen Transformationen der Eckpunkte deines Objektes (hier Würfel) wird am einfachsten mit Hilfe von 4x4 Matrixen gemacht. Man kann alle Transformationen (Skalierung, Verschiebung, Rotation, perspektivisches Sichtvolumen=Pyramidenstumpf) in einer Matrix zusammenfassen. Ist sehr mathematisch, aber im Endeffekt eine sehr logische Mathematik die dahintersteckt. Schau mal unter homogenen Koordinaten im Inet nach. Heraus bekommst du eine Punktliste in 2D-Koordinaten. Wenn du Polygone aus diesen Eckpunkten zeichnen möchtest musst du eine Rasterengine implementieren die dir einzelne Dreiecke (jedes konvexe Polygon kann man sehr einfach in Dreiecke zerlegen) rastern kann. Ums abzukürzen: Es werden am Ende die Polygone aus einzelnen 'Spans' (=waagrechte Linien) in einen Framebuffer (=das OSD) gezeichnet. Aufgrund der Geschwindigkeit des OSDs ein hoffnungsloses Unterfangen. Texturmapping (also Grafiken auf die Polygonfläche legen kannste völlig vergessen. Du könnstest theoretisch die OpenGL-Bibliothek benutzen und in den Speicher rendern lassen und versuchen diesen Speicherinhalt ins OSD zu übertragen. Es hängt im Endeffekt nur an der Speed und der Grösse des OSDs ansonsten könnte man nette 3d-Sachen auf den VDR zaubern. Hätte die FF-DVB-Karte ein richtigen Framebuffer wäre der VDR heute nicht so bieder in der Bedienoberfläche. Man könnte Dinge sehr viel übersichtlicher und optisch ansprechender zeigen.
    Gruß
    Jarny


    PS: Ich hab mal vor Ewigkeiten ne 3d-Bibliothek in C++ und ne Rasterengine in ASM (aber nur mit Flat- und Gouroudshading, weil ich beim Texturemapping die perspektivische Verzerrung nicht hinbekommen habe) gecoded. Da waren 3d-Grafik-Karten noch nicht bezahlbar.

    MLD 3.0.3 Server. Aufnahmen schaue ich mit einem separaten XBMC (OpenElec Distribution) im Wohnzimmer am 47 Zoll HD Fernseher

  • AAAAlso nach vielen stunden und rumprobieren mit formeln usw hab ich endlihc mal was gefunden was mir auch schonmal etwas weiter hilft.... Nur komplett verstehe ich das nicht.


    ich hab folgenden source


    zu testzwecken hab ich es auf nem canvas mal gemalt
    [CODE]
    x=100;
    y=100;
    wxPaintDC dc(canvas);
    dc.Clear();
    alpha = 0;
    int counter=0;
    dc.DrawPoint(x,y);
    while (alpha<20){
    dc.DrawPoint(400,400);
    float r= sqrt(x*x+y*y);
    float xx2= r * cos(atan(x/y)+alpha);
    float yy2= r * sin(atan(x/y)+alpha);



    dc.DrawPoint(r * cos(atan(400/400)+alpha),r * sin(atan(400/400)+alpha));


    [CODE]


    also dieser code veruhrsacht das ich einen punkt im kreis um den 0 punkt drehen kann und zwar mit dem uhrzeigersinn..


    Nur weis einer wie ich das ändere das ich das nicht nur um den nul punkt drehen kann ?


    Weil irgendwie kommt mir das auch noch nciht so in den sinn wie das obere funkiotniiert ich weis nur das die xy koordinaten in polare coordinaten umgewandelt werden dann die °Zahlen abgezogen werden und dann wieder zurück geerechnet werden.


    Nur ich verstehe nicht wie ich dann einen null punkt festlegen kann darin.



    Nun gut das ist noch recht mit 2d aber mit 3d wird das wohl kein weiter sprung sein oder? ;)

  • Ich geb dir ein Tipp: Arbeite dich in die Thematik 'Vektorrechnung' und 'Transformationsmatrizen' ein. Das macht dir vieles sehr sehr viel einfacher. Da brauchst du dich mit dem obigen (sehr eingeschränkten) Lösungsweg nicht mehr beschäftigen und hast gleich die richtige Lösung für 3d. Du musst nur ein paar Routinen zur Vektor- und Matrixmultiplikation schreiben oder dir aus irgendeiner Mathematiklibrary holen.
    Im Prinzip kannst du das ganze Vektor- und Matrixzeug aus der OpenGL-Library holen. Einführungsbücher zu OpenGL erklären die Vektor- und Matrixrechnungsgrundlagen für 3d-Grafik übrigens hervorragend.
    OpenGL zu beherrschen ist ganz nützlich, es lohnt sich.
    Natürlich ist es ganz gut (aber nicht notwendig) wenn man etwas mathematische Begabung mitbringt oder Vektorrechnung zumindest in der Schule/Hochschule schonmal gehört hat.


    Gruß
    Jarny

    MLD 3.0.3 Server. Aufnahmen schaue ich mit einem separaten XBMC (OpenElec Distribution) im Wohnzimmer am 47 Zoll HD Fernseher

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!