objekte drehen
-
hallo ich bins. mein name kennt ihr warscheinlich schon. ja, richtig! der, der fast bei jedem 2. thema unter "autor" steht. ja! und der, der bei "autor" von posts steht, die mit "du scheinst ja garnicht zu lesen was ich dir schreibe" beantwortet werden.
aber keine angst! ich bin harmlos und wenn diese frage geklärt ist, lass ich euch ma in ruhe un versuche andren in "Ansi C" oder "C++" treads zu helfen.also ich will ein mensch im fenster rumlaufen lassen der mit WASD gesteuert wird (mit draussicht (wie sims zb)).
ja das ist so einfach, dass es schonwieder immernoch einfach ist aber für mich net...
altes spiel: einen positionsvector und einen richtungsvektor.
jetz brauch ich eine funktion, die mein objekt in die richtung trägt, wo der richtungspunkt is. (das objekt muss immer auf den punkt gucken um dann auch drauflaufen zu können)
das würd ja mit sinus/cosinus funktionieren. aber es soll so gehn, dass es geht EGAL wo die beiden vektoren sich befinden (also auch im minusbereich und im plusbereich) UND das menschen soll beispielsweise nicht um 350 grad noch rechts sondern um 10grad nach links rotieren (wie ein gesunder mensch eben).
aber das grieg ich net hin weil man ja kein gluLookAt benutzen kann und auch keine funktion wie glRotatef, die stadt grad vektoren annimmt...
-
Dann musst du halt so einen Funktion schreiben. Da fragst du dann ab, ob was im negativen Bereich ist, bzw. in welche Richtung es kuerzer zu Drehen ist. f'`8k
Gruß, TGGC (\-/ has leading)
-
das bekomm ich net hin
normalerweise einfach:
ein positionspunk, ein richtungspunkt
man macht dadraus ein rechteckiges 3eck und berechnet den sinus von dem drehwinkel. aber wenn man nach links unten läuft, dreht sich ja das 3 eck in die andre richtung also muss man ja mit betrag rechnen. und wie soll man herausfinden welsche richtung kürzer?
-
und wie soll man herausfinden welsche richtung kürzer?
durch einen vergleich.
kannst dir ja mal ueberlegen wieviel grad eine komplette umdrehung hatdu solltest vielleicht dein problem auch nochmal so schildern, dass irgendwie nachvollziehbar wird, was du ueberhaupt erreichen willst...
-
Fachmann schrieb:
also ich will ein mensch im fenster rumlaufen lassen der mit WASD gesteuert wird (mit draussicht (wie sims zb)).
Du könntest es auch ohne Vektoren machen:
Deine Figur hat einen Positionsvektor (ok :)) (x|y|z).
Die y Komponente vergessen wir erstmal, die ist ja für die Höhe.
Jetzt hast noch einen Rotationswinkel alpha. Der wird mit A und D vergrößert oder verkleinert.
Aus der Schule müsstest du den Einheitskreis kennen. Schau dir das Bild rechts an: http://de.wikipedia.org/wiki/Einheitskreis
Dort siehst du:
Wenn jetzt Vorwärts gedrückt wird, berechnest du die neue Position der Figur so:
Wobei speed die gewünsche Bewegungsgeschwindigkeit deiner Figur ist.
:edit:
Natürlich musst du beim Rendern auch die Spielfigur um alpha drehen, sonst siehts seltsam aus
-
joar naja aus der schule kenn ichs nochnet (9. klasse)
ich kenns aus wikipedia.dein grundgedanke hab ich auch nur ich verstehe nicht wie das geht wenn man nach hinten in nen minusbereich läuft wenn man in nem plusbereicht ist. dann dreht man ja sein einheitskreis andersrum un rechnet teilweise mit minuswerten.
dh ich muss mit betrag arbeiten und deine formel funktioniert EGAL wo die position ist un EGAL wo man hinläuft? (so fragen sind schwachsinnig weil man sie ja auch selber durch ausprobieren herausfindet aber ich steh manschma da voll aufm schlauch)und dann muss ich ma gucken wie ich das mit dem thema "wie ein gesunder mensch drehen" mach aber das dürfte nicht allzu schwer sein wie das andre
-
Fachmann schrieb:
so fragen sind schwachsinnig weil man sie ja auch selber durch ausprobieren herausfindet
mach's einfach
:edit:
Vorwärts gehen hab' ich ja oben beschrieben. Für rückwärts kannste auf alpha einfach 180° addieren/subtrahieren
-
xindon schrieb:
Vorwärts gehen hab' ich ja oben beschrieben. Für rückwärts kannste auf alpha einfach 180° addieren/subtrahieren
Oder statt + einfach - schreiben
-
ok now it's codetime!
also ich hab ma umgesetzt:
void Human::makeFmove(GLfloat speed) { pos.x+=cos(angle)*speed; pos.z+=sin(angle)*speed; } void Human::makeBmove(GLfloat speed) { pos.x-=cos(angle)*speed; pos.z-=sin(angle)*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(); }
un winAPI:
if(keys['D']) obj1.makeLturn(1.0f); if(keys['A']) obj1.makeRturn(1.0f); if(keys['W']) obj1.makeFmove(1.0f); if(keys['S']) obj1.makeBmove(1.0f);
das männlein bewegt sich aber merkwürdig
-
glRotate nimmt den Winkel im Gradmaß und sin/cos im Bogenmaß nehme ich mal an.... oder umgekehrt? weiß nich mehr
ich glaube sin/cos hat Bogenmaß..
-
ups ehm ja wenn das hellijib erfährt dass ich das schon wieder nicht berücksichtigt hab^^
neu:
void Human::makeFmove(GLfloat speed) { GLfloat radians; radians = angle * (PI/180.0); pos.x+=cos(angle)*speed; pos.z+=sin(angle)*speed; } void Human::makeBmove(GLfloat speed) { GLfloat radians; radians = angle * (PI/180.0); pos.x-=cos(radians)*speed; pos.z-=sin(radians)*speed; }
gehung= schlecht
das mämmlein läuft merkwürdig
-
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 scheissewenn ihr wollt könnt ihr ma das programm angucken:
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