objekte drehen



  • Weißt du, dass du voll die Nase bist? *g*

    Fachmann schrieb:

    void Human::makeFmove(GLfloat speed)
    {
    GLfloat radians;

    radians = angle * (PI/180.0);

    pos.x+=cos(angle)*speed;
    pos.z+=sin(angle)*speed;
    }



  • d'OH! naja meine gedanke waren vll woanders
    aber jetz hab ich aus "angle" radians gemacht aber der läuft immernoch scheisse

    wenn ihr wollt könnt ihr ma das programm angucken:

    http://popofachmann.funpic.de

    datei: modeluse.exe
    daten: im ordner "daten"

    aber das problem liegt glaub ich in render:

    void Human::render()
    {
    	glPushMatrix();
             glRotatef(angle,0.0f,1.0f,0.0f);
    	glTranslatef(pos.x,pos.y,pos.z);
    
    	draw();
    	glPopMatrix();
    }
    

    bei "rotate vor translate" dreht sich das männchen um die achse des openGL ursprungs (logisch)
    bei "translate vor rotate" läuft das männchen net da hin wos hinsoll



  • pos.x+=cos(radians)*speed;
    pos.z+=sin(radians)*speed;
    glTranslatef(pos.x,pos.y,pos.z);
    glRotatef(angle,0.0f,1.0f,0.0f);
    

    das setzt natuerlich voraus, dass deine untransformierte figur (angle=0: richtungsvektor=1,0,0) entlang der x-achse guckt und den ursprung (0,0,0) in der mitte hat...



  • dh man darf ihn am anfang nicht sehen weil er bei z=0 steht und er muss der kamera die rechte schulter zeigen bzw der linke nippel muss vom rechten verdeckt werden?
    resultat: merkwürdig
    ich probier rum und halt euch aufm laufenden;)
    aber der läuft zickzack nach hinten wenn ich W u. S abwechselnt drück.

    wenn ihr sagt ich solls lieber lassen dann mach ichs und versuche ein ego shooter mit person=kamera. ^^

    ich hab das gefühl, einfach x und z mit sin un cos zu erechen funst net ich glaub man muss mit betrag arbeiten oder?:

    if(zahl<0)
       zahl*=-1;
    


  • x und z mit sin un cos zu erechen funst net ich glaub man muss mit betrag arbeiten

    das sicherlich nicht.
    leider hast du bisher keine nachvollziehbare fehlerbeschreibung vorgetragen.
    versuch's doch mal mit system:
    bei "angle=0" ist dein richtungsvektor 1,0,0 - dh deine figur sollte sich mit "makeFmove/makeBmove" entlang der x-achse bewegen; gleichzeitig sollte das "glrotate" dafuer sorgen, dass die figur richtig ausgerichtet ist.
    fuer "angle=90" ist der richtungsvektor "0,0,1" - die figur bewegt sich entlang der z-achse; fuer "angle=-90" genau andersrum.
    wo weicht das verhalten deines programms von diesen erwartungen ab?



  • ok du hast recht. wenn man sowieso nur 4 richtungen hat ( W A S D), brauch man eig garnet mir cos/sin anfangen das geht auch ohne. ich hab nur gedacht es wär für später dann man hilfreich wenn die figur sich immer in die richtung der mausposition drehen soll (wie in cs 2d 😉 ) aber ich glaub das dauert vll noch en bissle.
    mein problem war/ist, dass ich ein mensch laufen lassen wollt, den man von einer halbdraufsicht anguckt.



  • du hast mich voellig missverstanden.
    es kann dir niemand helfen solang du nicht wenigstens mal schilderst wie sich dein fehler aeussert.
    es ist wahrscheinlich sehr hilfreich den richtungsvektor einfach mal mit anzuzeigen.



  • ok:

    ich hab den code von euch bei mir übernommen sodass mein mensch eigentlich mit A und D sich drehen kann und mit W und S vor/rückläuft.

    in wirklichkeit läuft er aber anders:
    deswegen hab ich ja ma die exe hochgeladen
    es ist von dem drehwinkel abhängig wohin er läuft wenn W gedrückt wurde.
    in der ausgangsposition (mensch guckt zu kamera) macht er sitesteps nach links (von sich aus). dreht man ihn um 180grad läuft er sitesteps nach rechts(logsch). aber wenn man in nur um 90 grad dreht sollte er eigentlich auf die kamera sitesteps machen aber er läuft davon weg. bei 270 grad sollte er weglaufen, läuft aber drauf zu (sidesteps zur kamera)



  • Ich weiß nich, was du da für ne Anwendung hochgeladen hast, aber die Figur kann gar nich bewegen mit WASD. Die wackelt nur so hin und her



  • ja hat mein freund auch gemeint. ich hab noch kein timebased movements drin vll liegs daran.



  • Alter *g*

    Du hast doch beschrieben, wie sich die Figur bewegt. Hast du dir das ausgedacht oder wo siehst du das? 😃 Lad doch mal die Anwendung hoch, wo man auhc den Fehler sieht.



  • ich sehe zwar ein, dass man in dem alter gewisse verstaendnisschwierigkeiten mit der linearen algebra hat, aber hier sind ueberhaupt keine anzeichen von eigenstaendiger bemuehung oder selbststaendigen denkens zu erkennen...



  • ja ich weiss wie scheisse des is wenn einer sich in nem forum alles in den arsch pumpen lässt

    bei mir kann man mit dem mensch so rumlaufen ich hab ma das projekt ubgeloadet
    un auf wunsch könnte ich auch noch meine gesamte festplatte uploaden ;)^^
    (MSVC++)

    http://popofachmann.po.funpic.de/

    verzeichniss: modeluse
    datei in der es stinkt: ms3dobj.cpp

    ausschnitt:

    void Human::makeFmove(GLfloat speed)
    {
    	GLfloat radians;
    
    	radians = angle * (PI/180.0);
    
    	pos.x+=cos(radians)*speed;
    	pos.z+=sin(radians)*speed;
    }
    
    void Human::makeBmove(GLfloat speed)
    {
    	GLfloat radians;
    
    	radians = angle * (PI/180.0) +180.0;
    
    	pos.x+=cos(radians)*speed;
    	pos.z+=sin(radians)*speed;
    }
    
    void Human::makeRturn(GLfloat paangle)
    {
    	angle+=paangle;
    }
    
    void Human::makeLturn(GLfloat paangle)
    {
    	angle-=paangle;
    }
    
    void Human::render()
    {
    	glPushMatrix();
    	glTranslatef(pos.x,pos.y,pos.z);
    	glRotatef(angle,0.0f,1.0f,0.0f);
    	draw();
    	glPopMatrix();
    }
    

    so müsste der mensch doch gesund rumlaufen



  • radians = angle * (PI/180.0);
    pos.x+=cos(radians)*speed;
    pos.z+=sin(radians)*speed;
    

    deine figur schaut initial (angle=0) entlang der z-achse (0,0,1), als richtungsvektor ergibt sich aber (1,0,0) - die figur muss also inital nach rechts schauen; macht also einen defizit von 90 grad bei der rotation:

    glRotatef(angle+90,0.0f,1.0f,0.0f);
    
    radians = angle * (PI/180.0) +180.0;
    pos.x+=cos(radians)*speed;
    pos.z+=sin(radians)*speed;
    

    na da wolltest du wohl besonders clever sein, wa? 😉
    wenn der vektor in die andere richtung zeigen soll wird er negiert.
    180 grad weiter drehen ginge auch. 180 rad macht ueberhaupt keinen sinn...



  • hellihjb schrieb:

    radians = angle * (PI/180.0) +180.0;
    pos.x+=cos(radians)*speed;
    pos.z+=sin(radians)*speed;
    

    na da wolltest du wohl besonders clever sein, wa? 😉
    wenn der vektor in die andere richtung zeigen soll wird er negiert.
    180 grad weiter drehen ginge auch. 180 rad macht ueberhaupt keinen sinn...

    Gemeint ist, dass du die 180° auf den Winkel im Gradmaß addieren musst und nicht Radians.

    radians = (angle+180) * (PI/180.0)

    Achtung: Punkt vor Strich :p



  • ja da wollt ich so halbstark clever sein;)

    ich hab mich schon gewundert was diesmal rauskommt aber es ergibt langsam sinn!
    also ich bedank mich dann mal <3lich 😉
    dass es 100% klappt bekomm ich jetz auch hin, das schieb ich mir zurecht^^

    zum glück hatte ich mein "jungheitsbonus" bei euch sonst wär mir garnicht zu helfen ^^

    also dann bis auf ein neues! (bis zur nächsten "spannenden, aufregenden" frage von mir 😋) ...schlechter scherz...


Anmelden zum Antworten