Grafik unter Borland C++ Builder 6



  • Tag,

    ich möchte gerne die Ergebnisse mathematischer Berechnungen unter obiger Entwicklungsumgebung graphisch darstellen können. D.h., ich will in einem 3D-Raum Punkte, Linien und Flächen visualisieren, und die ganze Szene am besten noch Zoomen und Drehen können. Welche Optionen ausser OpenGL habe ich dafür? Wo kann ich dazu Links finden, an denen ich mich einarbeiten kann?

    Ich danke Euch!
    V.K.



  • Hallo!

    Neben OpenGL gäbe es natürlich noch Direct3D.
    Abgesehen davon bietet der BCB keine 3D Grafik an, sondern nur mehr oder weniger umfangreiche 2D-Optionen. Wenn du also weder OpenGL noch Direct3D verwenden willst, musst du wohl oder übel selbst Vektoren und Matrizen einführen und alles dann über die CPU berechnen lassen und das Ergebnis dann mit den 2D Funktionen darstellen.

    Habe ich selbst schon mal gemacht, um mit Transformationen ect. etwas zu spielen. Aber der Aufwand ist es nicht wert. Wobei ich noch lediglich Punkte transformiert habe. Dreiecke dann mit Farbe oder gar einer Textur zu füllen habe ich sein lassen.
    Wenn du aber damit einsteigen willst, dann kann ich dir die DirectX Hilfe empfehlen, da wird unter anderem die Projektions-Matrix erklärt und vieles mehr. Auf dieser Basis solltest du dann im Internet weitere Hilfe finden falls nötig.

    Ganz abseits davon wäre wohl auch MATLAB eine Option. Oder wenn es nur um Diagramme geht EXCEL, ...

    Gruß
    Markus



  • Hi Markus,

    ich werde es wohl mit Direct3D versuchen. Danke dir.

    V.K.



  • Hi HMarkus,

    HMarkus schrieb:

    Habe ich selbst schon mal gemacht, um mit Transformationen ect. etwas zu spielen.

    Ich würde gerne wissen, wie du die Drehung deines Objektes im 3D-Raum hinbekommen hast. Also insbesondere interessiert mich, wie du anhand der 2 Mauspunkte (Maus klicken und Maus loslassen) die 3 Rotationswinkel für die Drehung bestimmt hast.

    VIELEN DANK!
    V.K.

    EDIT: Hast du das irgendetwas mit Quaternionen gemacht?



  • Hallo,

    für die Drehung habe ich keine Projektion / Umrechnung 2D -> 3D gemacht. Prinzipiell würde es so gehen: Einen Strahl berechnen, Startpunkt ist die Kamera. Dann vor der Kamera auf den vollen Sichtbereich den Bildschirm mit Maus denken, wobei die Maus der 2. Punkt ist, und schon ist der 3D Strahl festgelegt. Ein Beispielprogramm ist im SDK von DX enthalten: DX90SDK\Samples\C++\Direct3D\Pick

    Ich habs viel pragmatischer gelöst, da ja alles nur zum experimentieren gedacht war: Wenn rechte Maustaste gedrückt, dann Verschiebung in x und y zur alten Mausposition berechnen, dieses dx und dy dann ggf. mit Skalierung als dWinkel verwenden. Damit kann man natürlich nur um zwei Achsen drehen, aber ein evtl. nötiges Umschalten wäre ja auch kein Problem.

    Gruß
    Markus



  • Hi HMarkus,

    also wie man an den 3D Strahl kommt, ist mir schon klar. Das angezeigte Bild ist ja nichts anderes als eine fiktive Kamera. Bloß was ich dann mit dem 3D Strahl anfangen soll, ist mir nicht richtig klar. Vielleicht kannst du noch einen Tip geben?

    DANKE.
    V.K.



  • Also den Strahl brauchst du natürlich nur dann, wenn du speziell ein Objekt drehen willst, und nicht die ganze Scene.
    Ansonsten kannst du die Mausverschiebung doch einfach auf einen Winkel draufaddieren.

    Ggf. schildere nocheinmal, wo genau das Problem liegt, vielleicht habe ich ja was falsch verstanden.

    Markus



  • Okay, dann erkläre ich nochmal kurz.

    Ich habe ein Koordinatensystem mit den 3 orthogonalen Achsen und zusätzlich eine 3D Punktwolke. Bisher habe ich es geschafft, anhand der Mausoperation in die Punktwolke rein bzw. raus zu zommen. Die Wolke zu verschieben, also eine einfache Translation, bekomme ich auch hin.

    Ich will mir nun aber die Punktwolke einfach mal von der anderen Seite anschauen. Dazu brauche ich einen Algorithmus, der mittels Mausinteraktion eine Drehung der gesamten Szene ermöglicht. Um die Drehung der Szene zu verwirklichen, gibt es eine Rotationsmatrix, die aus 3 Drehwinkeln besteht. Wie bekomme ich diese 3 Winkel über die geklickten Mauskoordinaten bzw. die Mausbewegung?

    Ich danke für Hinweise!
    V.K.



  • Also gut, die Matrix selbst ist also nicht das Problem, sonder die Benutzereingabe mit der Maus. Folgender OnMouseMove Code sollte das Problem lösen:

    int ax=0,ay=0;  //alte Koordinaten
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
        int dx = X-ax;  //rel. Mousebewegung bestimmen
        int dy = Y-ay;
        if( Shift.Contains(ssLeft))   //nur wenn l. Taste gedrückt
        {
            Caption = IntToStr(dx) + " " + IntToStr(dy);
            //dx und dy können nun zu zwei Winkel hinzuaddiert werden
            //da die meist in Rad aber dann etwa so: winkel += (float)dx*0.01
        }
        ax=X;ay=Y;  //die neuen alten sind die aktuellen
    }
    

    Jetzt aber, oder? 👍



  • Ich würde auch einen wert pro 2d achse festlegen der bei drag and drop bewegungen der Maus de- oder inkrementiert wird. Anhand dieses Wertes dann deine Welt drehen bevor du zu zeichnen anfängst.


Anmelden zum Antworten