Koordinaten

  • Koordinaten

    Hi!

    Wie finde ich eigentlich raus wie gross 1.0 einheiten im OpenGL koordinatensystem ist? Also kann man irgendeinen wert berechnen, um den ich dann ein objekt auf der Y-achse verschiebe und dieses genau am bildschirmrand platziere? Kurz gesagt: Wie berechne ich wie gross der Bildschirm in OpenGL-Koordinaten ist.

    Vielen Dank,
    Grüsse
    Fabian
  • Ok, hab mir jetzt einen Ortho-Matrix gemacht mit dem ich dann Buttons etc. auf den Schirm zeichne.

    Weiss eigentlich jemand wie ich die Frame Rate rausbekomme?
    Oder es reicht schon wenn jemand ne Funktion kennt die mir die microsekunden zurückgibt, die seit dem systemstart verstrichen sind.

    Vielen dank,

    Grüsse aus Zürich
    Fabian
  • Ok, mach ich...

    Nunja, halt mal: Das liefert dann ja nur die grobe FrameRate. ICh bräuchte die FPS wenn möglich als float/double und bei jedem Frame aktualisiert, da ich auf der FrameRate basierend die bewegungs-geschwindigkeit berechnen muss (z.b. für fahrzeuge etc.)

    Ich würdes ja so machen, angenommen es gibt ne funktion microseconds() die mir die mikrosekunden seit dem systemstart zurückgibt:

    Quellcode

    1. framespers = 1000000 / (microseconds() - oldmscount);
    2. oldmscount = microseconds();


    Hierbei wäre oldmscount eine variable (float).

    Wenn ich nun die geschwindigkeits-ratio haben will, um z.b. ein fahrzeug um die z-achse zu bewegen, mach ich ne funktion:

    Quellcode

    1. float spdrat(float mps)
    2. {
    3. return mps / framespers;
    4. }


    Um das fahrzeug dann mit 3.6 m/s fortzubewegen in einer 3d-welt, in der eine einheit des koordinatensystems einem meter entspricht:

    Quellcode

    1. fahrzeug.z += spdrat(3.6);


    So hab ichs jedenfalls früher in REALbasic gemacht und es scheint mir eine recht effiziente methode.

    Wenn jemand was besseres weiss, immer her damit :) !!!

    Ohja, kennt jetzt jemand ne funktion die mir die microseconds seit dem systemstart zurückgibt?


    Vielen dank,
    grüsse
    Fabian
  • vielleicht hilft dir das weiter:

    Quellcode

    1. int glutGet(enum state);
    2. state - name of state to recive

    mit dieser funktion kannst du alles moegliche abfragen (schau dir dazu die glut referenz an) und mit

    Quellcode

    1. glutGet(GLUT_ELAPSED_TIME)
    bekommst du die millisekunden die seit demdem aufruf von glutInit oder seit dem letzten aufruf von glutGet(GLUT_ELAPSED_TIME) vergangen sind. um die framerate festzulegen kannst du auch das ein timer event festlegen.

    Quellcode

    1. void glutTimerFunc(unsigned int msec, void (*func) (int value), value);

    genaueres dazu wieder in der glut referenz.


    hoffe es hilft weiter, joedelord
  • da normale maeuse ein nur zweidimensionales system unterstuetzen, sehe ich nur eine indirekte loesung. du bewegst die objekte mit der maus auf der x/y ebene, und wenn du dazu noch eine bestimmte taste drueckst bewegst du das objekt auf der z achse.

    direkte 3d bewegungen funktionieren imho nicht und wenn es welche gibt sind sie sehr schwer und ungenau zu kontrollieren.

    wo sich die maus jetzt befindet kannst du auch nur zweidimensional herausfinden. die maus bewegt sich auf dem bildschirm der die 3d welt als zweidimensionale projektion ohne raum darstell. da du effektiv nur objekte anwaehlen kannst die du auch siehst reichen hier 2 dimesionen voellig aus. im opengl redbok gibt es einen abschnitt der sich mit der auswahl beschaeftig. ich glaueb die szene wird dabei im backbuffer gezeichnet, jedes objekt mit einer anderen farbe, und dann wenn man klickt wird dieses pixel betrachtet und anhand der farbe wird dann das richtige objekt zugeordnet.

    ich hoffe ich habe deine frage ungefaehr getroffen
    lg, joedelord
  • Hmmm, möglich sollte das sein mit irgendeiner funktion.

    In REALbasic konnte man findPoint(x,y) aufrufen, als x,y die mauslocation mitgeben und bekam einen 3dpunkt (x,y,z) zurückgeliefert, berechnet anhand des blickwinkels etc.

    Das sollte in OpenGL doch möglich sein, wenn man sich z.b. Games anschaut, da kann man auch mit der Maus ein 3D Objekt rumziehen.

    Gibts da keine solche funktion/methode?

    Grüsse
    Fabian
  • soch eine realbaisc function zur auswahl eignet sich imho nur zjr auswahl und nicht zum verschieben. wenn du zb ein objekt verschiebst weis der computer nicht wenn du mit der maus nach vorne faehrst ob du das ubjekt in der szene weiter nach hinter oder weiter nach oben verchieben moechtest. wenn du schon mal mit 3ds max und splines in der 3d view gearbeitet hast weißt was ich meine.

    aber wie schon von snowman erwaehnt, wirf einen blick ins redbook

    lg, joedelord
  • Jop, das Kapitel hab ich mir durchgelesen.
    Nun, scheint so dass es das nicht gibt. In REALbasic funktionierte diese Funktion hervorragend. Irgendwie rechnete die die Y-Koordinate der Maus in die Z-Koordinate der 3D Welt um, die Y-Kordinate des zurückgegebenen 3D Punktes blieb immer 0. Weiss jemand ob das geht? Also die Y der Maus in die Z der 3D Welt umzurechnen. Vielleicht per gl-Funktion oder muss man da einfach selber rechnen?

    Grüsse
    Fabian
  • wenn ich dich richtig verstehe willst du wenn man die maus nach oben/unten bewegt das 3d objekt auf der z achse verschieben. das geht einfach indem du dein objekt fuer z = y verschiebst. dann koentest du das objekt auf der x / z ebene verschieben.

    lg, joedelord
  • Hmmm, sone funktion wäre jetzt sehr wichtig.

    Oder, weiss jemand von euch in etwa, wie ich sowas selber programmieren kann? Ich mach ein kleines Game und da muss man die dinge mit der maus platzieren können. Kennt jemand einen Algorhythmus um die maus x,y koordinaten unter berücksichtigung des kamera drehungs winkels etc. umrechnen zu können? Also mausx->WeltX und mausy->WeltZ. Ist das irgendwie möglich, mit einer gl-Funktion oder muss ich mir da einfach nen algorhythmus programmieren? Wenn ja, wie müsste der ungeführ ausschauen?

    Vielen dank,
    Grüsse
    Fabian
  • Tangens… bin nicht der Hirsch in Mathe.

    Nehme mal an um den Tangens zu berechnen braucht man tan(); :)

    @Michael:
    Ich möchte dass ich die x,y koordinaten (Der maus, z.b.) in 3d koordinaten x,y,z umwandeln kann. Dabei sollte y = 0 bleiben, was ja nur vorteile hat. Wie soll ich das machen? Dass ich irgendeinen 2D punkt auf dem Bildschirm geben kann und ich das in die 3d koordinaten unter berücksichtigung des blickwinkels etc. umwandeln kann?

    Fabian