Würfel aus Linien drehen - (nicht nur) in Direct2D1



  • Hi,

    ich würde gerne einen Würfel, bestehend aus Linien (wie im Anhang gezeigt) in X- und Y-Richtung drehen können und die Würfelgröße müsste ich dynamisch verändern können.

    Für die Darstellung verwende ich das alte Direct2D der ersten Generation, wo es eben noch keine 3D-Matrix Translations wie in Win7 mit Platform-Update und Win8 gibt (es gibt im ersten D2D leider nur die Matrix3x2F Translationen). Ein Wechsel auf das neue D2D ist mir, auf Grund der Abwärtskompatibilität zu Vista SP2 leider nicht möglich, es muss hier also "von Hand" programmiert werden.

    Somit stehen mir also nur Linien-Funktionen alà "Zeichne Linie von X1/Y1 nach X2/Y2" zur Verfügung.

    Das letzte Mal als ich sowas programmiert hatte war auf dem Commodore Amiga und sämtliche Erinnerungen wie ich das damals in jungen Jahren gemacht hatte fielen im Laufe der Jahre Literweise Wodka zum Opfer 😃

    Das gute an der Sache ist aber, dass es ja nun mal kein D2D-spezifisches Problem ist, mir würde ein Beispielcode basierend auf GDI oder sonst einer GFX-API sicherlich schon weiterhelfen.

    Hat hierfür jemand Tipps oder Sourcecode-Beispiele?

    Viele Grüße und vielen Dank im voraus,
    Goa

    http://www11.pic-upload.de/10.12.14/2jbnnjgsltv.png


  • Mod

    Dein Beispiel sieht mir perspektivisch korrekt projiziert aus. Wie hast du denn die Eckpunkte für dieses Beispiel errechnet, ohne dabei Vektoralgebra zu nutzen? Und ist die Ausrichtung des Objekts (und/oder des Beobachters) nicht ganz natürlich in der Rechnung enthalten?

    Oder anders gesagt: Um zu wissen, wie du dein Verfahren abändern musst, müssen wir dein Verfahren kennen. Bei den meisten üblichen Verfahren sollte eigentlich schon das ,wonach du fragst, enthalten sein, daher bin ich doppelt neugierig, wie du dein Beispiel erzeugt hast.

    (Ich hoffe mal, dass jetzt nicht als Antwort kommt "auf Millimeterpapier gezeichnet, Koordinaten abgelesen und ins Programm eingetippt". Falls diese Antwort kommt, kann man dir natürlich ein besseres Verfahren beibringen 🙂 )


  • Mod

    rotation um eine achse ist

    x' = x*cos(f) - y*sin(f);
    y' = y*cos(f) + x*sin(f);
    

    das kannst du mit jeder achse machen, nacheinander.

    scalierung ist

    x'=x*Scale;
    y'=y*Scale;
    z'=z*Scale;
    

    verschiebung

    x'=x+OffsetX;
    y'=y+OffsetY;
    z'=z+OffsetZ;
    

    wenn du es perspektivisch moechtest, kannst du deinen cube am ende um die umgekehrte position der kamera verschieben, wenn sie also bei (0,0,10) waere und auf 0 schaut, verschiebst du mit (0,0,-10), anschliessend teilst du jeden punkt vom cube durch z.
    da der wertebereich dann -1 bis +1 ist, musst du noch mit der halben aufloesung hochskalieren und auch verschieben (in 2d) damit du mehr als nur einen pixel siehst.


Anmelden zum Antworten