Koordinaten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • wo willst du den deine objekte hinplazieren? wenn du sie gerastert plazierst, koenntest du es glaube ich mit glutMoveFunc schaffen. dafuer muesstet du den untergrund in einzelne segmente einteilen, und sobald du das zu verschiebende objekt anwaehlst mit glutMoveFunc die position der maus abfragen. bewegt sich nun die maus ueber ein segment wird das objekt auf diese position verschoben. wird die maus ueber ein anderes segment bewegt wird das objekt dort hin verschoben.

    du koenntest auch versuchen ob es nicht moeglich ist. fuer die dauer des verschiebens den mauszeiger einfach auszublenden. waehre auch eine loesung

    lg, joedelord

    ps: was fuer ein spiel entwickelst du eigentlich?
  • Ja, das hab ich mir auch schon gedacht, dann gibts jedoch folgendes problem:

    Wenn ich das objekt aus einem ANDEREN Winkel betrachte, also irgendwo von der seite, bewegt sich das objekt ganz anders als der spieler die maus bewegt. Also wenn er die maus nach links verschiebt saust das objekt rechts nach hinten oder so was.
    Bsp.:
    Wenn ich das Objekt normal betrachte, geht die Z-achse in die tiefe, x nach links/rechts und y nach oben. Drehe ich die kamera jetzt um 90°, damit man das objekt von der seite betrachten kann, geht die X-Achse ind die TIEFE und die Z-Achse nach links/rechts.
    Das muss irgendwie vermeidbar sein.

    Ich schau mir jetzt mal die glMoveFunc an.

    Grüsse
    Fabian
  • wenn du die grundflaeche segmentierst hasst du das problem nicht, denn jenachdem ueber welchen segment sich die maus befindet, wird das objekt auf das segment verschoben. bei dieser methode ist die blickrichtung voellig egal. du koenntest deine objekte auch auf gekruemten und verwundenen grundflaechen sicher verschieben, denn du positionierst das objekt immer genau auf dem segment das sich momentan auf dem bildschirm unter dem mauszeiger befindet.

    lg, joedelord

    ps: mit was hast du den die ganzen programme entwickelt die man auf deiner homepage sieht?
  • Jo, danke. Ich denk ich machs so. Aber nicht mit der GLUT funktion.
    Ich nehm ganz einfach die GL_SELECT routine, mit der geht das ja ziemlich sicher.

    Bastle mir eben son kleines Spiel, indem man einen FLughafen aufbauen muss ;)

    Hab mir jetzt schon einen Algorhythmus gemacht der eine Art Vektor zurückgibt mit dessen Hilfe man ein Objekte oder z.b. die Kamera auf einen Punkt in der 3D welt ausrichten kann. Wer interesse hat, hier ist er ;) :

    Am besten man packt das ganze in ne Funktion und gibt als variablen 'pnt' den standort des einten objekts und 'dst' den punkt der angepeilt werden soll mit.
    pnt und dst sind POINT3D's:

    Quellcode

    1. typedef struct {
    2. float x;
    3. float y;
    4. float z;
    5. }


    VECTOR3D ist das selbe nur heissen die variablen xrot yrot und zrot anstatt x,y und z.

    Quellcode

    1. VECTOR3D res;
    2. float xzdis = LXDistance(pnt,dst); //LXDistance berechnet per Pythagoras die Distanz von pnt zu dst
    3. float ydis = LXMax(pnt.y,dst.y) - LXMin(pnt.y,dst.y); //LXMax gibt das grössere, LXMin das kleinere der beiden Werte zurück
    4. float dis = sqrt(pow(xzdis,2) + pow(ydis,2));
    5. float ang = (acos(dis/(xzdis + ydis)) / M_PI * 180) - (viewingArea / 2); //viewingArea ist das vertikale Blickfeld, normalerweise 30°
    6. res.xrot = ang;
    7. res.yrot = 180 - (atan2((double)(dst.x - pnt.x), (double)(dst.z - pnt.z)) / M_PI * 180);
    8. res.zrot = 0.0;
    9. return res;


    Das objekt um den zurückgegebenen Vektor zu drehen ist ganz einfach:
    glRotatef(vektor.xrot,1.0,0.0,0.0);
    glRotatef(vektor.yrot,0.0,1.0,0.0);

    Die ganze Funktion ist darauf ausgerichtet die KAMERA auf ein Objekt zu richten. Je nachdem wenn Objekte ausgerichtet werden sollen sind änderungen vorzunehmen :)


    Vielen Dank für eure grossartige Hilfe!

    Liebe Grüsse aus Zürich,
    Fabian
  • Die ganze Funktion ist darauf ausgerichtet die KAMERA auf ein Objekt zu richten. Je nachdem wenn Objekte ausgerichtet werden sollen sind änderungen vorzunehmen :)


    Huiui, so'n langer Thread, und ich hab' nichts mitbekommen... Deine Funktion sieht nett aus - aber hätte man zum Ausrichten der Kamera nicht einfach gluLookAt() nehmen können? glu kann man ja harmlos dazu nehmen, oder?

    Um Die OpenGL-Weltkoordinaten in Bildschirmkoordinaten umzurechnen kann man das entweder trigonometrisch machen, halt per tangens o.ä., das wird aber normalerweise schnell unübersichtlich. Andererseits kann man einfach den Vektor homogen erweitern, mit der ModelView- und Projektiionsmatrix multiplizieren, wieder zurück in affine Koordinaten und anschließend mit dem ViewPort skalieren. Vom Bildschirm zu OpenGL kommt man genau andersrum (viewpoint -> erweitern -> mit inversen Matrizen multiplizieren -> projezieren).

    Glücklicherweise muss man das nicht von Hand machen: gluProject und gluUnProject erledigen genau das, was Du möchtest.

    Für Deine Picking-Aufgabe ist in der Tat der Selection-Mode (zusammen mit gluPickMatrix) nützlich. Um für die Mauskoordinaten die Koordinaten auf der XZ-Grundebene herauszubekommen (ich glaube, das ist das, was Du bei RealBeasic beschrieben hattest), ist noch ein Ebenen-Geraden-Test nötig:

    Wenn (xm,ym) die Mausposition ist, könne man Folgendes machen:

    Mit gluUnProject() den Punkt (xm,ym,0) in die OpenGL-Welt bringen (x0,y0,z0)

    Das gleiche für (xm,ym,1) -> (x1,y1,z1)

    Der Sichtstrahl für den Pixel ist dann (x0,y0,z0)+s*(x1-x0,y1-y0,z1-z0), der mit der XZ-Ebene geschnitten werden soll. Für sie gilt einfach y=0, also: y0+s*(y1-y0)=0

    Das Ganze auflösen nach s: s=-y0/(y1-y0)

    Nun gibt's vier Fälle: für y1=y0 gibt's keinen Schnittpunkt (muss logischerweise davor abgefangen werden, weil sonst div/0). Für s<0 ist der Schnittpunkt hinter der Kamera, man guckt also in den Himmel. Für s=0 liegt die Kamera genau in der XZ-Ebene, was das Picking ziemlich unsinnig macht. Und für s>0 ist der Schnittpunkt ok. Einfach in die Geradengleichung einsetzen und heraus kommt der gesuchte Punkt. Eventuell könnte das Vorzeichen von s auch genau andersrum sein, das hängt davon ab, wie Du Deine Projektionsmatrix setzt, aber ich glaube, so herum ist's normalerweise richtig - ich schreibe das gerade aus dem hohlen Bauch und mache sowas typischerweise immer genau falschrum :)

    Vielleicht hilft Dir das ja noch ein bisschen, und falls nicht, war es vielleicht trotzdem interessant... :)
    Multigrad - 360°-Produktfotografie für den Mac
  • Original von Fabian
    Könntest du mal eine Beispielsfunktion posten, ein Beispiel wie gluUnProject läuft ?


    Hier ist ein kleines Demoprojekt, in dem man einen Teapot auf einer Grundfläche bewegen kann - der interessante Teil ist ganz unten in MyUnprojView.m, die mouseDown-Methode. Die jeweils letzten Matizen und der viewport werden jeweils beim Malen gespeichert. Viel Spaß damit!
    Multigrad - 360°-Produktfotografie für den Mac
  • Ah, ich hätte erst weiterlesen sollen. :( Sorry!

    Google mal nach Aug-Punkt Transformation. Dort findest du die Formel für 3D->2D da setzt du einfach y3 = 0 und löst das nach x3 und z3 auf.

    Heute abend kann ich es dir auch machen. (Also das Auflösen ;-))
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?