Aktuelle Zeit: 12.05.2025, 23:12

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 03.07.2009, 16:24 
Offline

Registriert: 11.08.2008, 22:14
Beiträge: 17
Ich habe jetzt nach längere Zeit wieder angefangen mit Irrlicht zu programmieren. Jetzt hab ich es mittlerweile geschafft mir eine normale Kamera zu erstellen und diese mit Pfeiltasten und Maus zu bewegen. Nachdem ich die "Welt" und die Kamera nun auch noch Kollisionsfähig gemacht habe, tritt folgendes Problem auf. Wenn ich mit der Kamera von schräg oben auf die Welt "pralle" rotiert diese automatisch auf 0°, blickt also nicht mehr auf den Boden, sondern geradeaus.
Etwa so:
Bild
Wenn ich dagegen schräg rückwärts von oben mit dem Boden kollidieren lasse, dann rotiert die Kamera nach oben, guckt also quasi in den Himmel.
Bild

Ich möchte allerdings, dass die Kamera ihre Rotation mit der sie kollidiert beibehält, also wenn ich von oben vorwärts mit 40° den Boden berühre möchte ich weiterhin mit 40° auf den Boden blicken und nicht plötzlich geradeaus...


Nach oben
 Profil  
 
BeitragVerfasst: 18.07.2009, 09:52 
Offline

Registriert: 11.08.2008, 22:14
Beiträge: 17
Gibt es denn hier niemanden der mir damit helfen kann?
Denn so wie es momentan ist gefällt mir das nicht wirklich. Das die Kamera mit dem Boden kollidiert ist ja so richtig und auch erwünscht, aber warum die so komisch kippt ist mir bisher unerklärlich. Liegt das an Irrlicht oder hab ich irgendwas falsch gemacht?
Und wenn es an Irrlicht liegt wie kann ich es beheben?
Hilfe!! :D


Nach oben
 Profil  
 
BeitragVerfasst: 18.07.2009, 12:34 
Offline
Benutzeravatar

Registriert: 23.06.2008, 07:21
Beiträge: 74
Wohnort: Dresden
mhm... Sehr schwierig dein Problem ^^

Also ich wüsste nicht, wie man den CollisionResponseAnimator so konfiguriert, das die Kamera nicht kippt, Oder wie tust du deine Kollision bewerkstelligen?

Ansonsten:
Wie sieht deine "Welt" aus? Also speziell der Boden?
Wenn du den Boden als Terrain erzeugst, also mit Heightmap, dann kann du deine Kollision selber schnell berechnen. Und du hast den Vorteil das deine Kamera nicht kippt, sonder so "guckt" wie sie aufgeprallt ist.
Also musst du eine künstliche Schwerkraft erzeugen, die immer auf die Y koordinate der Kamera wirkt.
Dann kannst du mit der X und Z koordinate der Kamera die Höhe des Terrains ermitteln. also so zb:

TerrainNode->getHeight( Camera.X, Camera.Z );

Wenn jetzt der Y wert der Kamera kleiner ist, als die Stelle am Terrain, dann wirkt keine Schwerkraft mehr.
So kannst du mit den Terrain "kollidieren" und den Aufprallwinkel der Kamera automatisch beibehalten, da du den ja nie ansprichst.

Hilft dir das was?

lg micha

_________________
...then he said, "I can't feel my legs!" and I said "Joe! Stay with me Joe!" But it was ... to late. The garbage collector came and... he was gone. Best object I ever had.


Nach oben
 Profil  
 
BeitragVerfasst: 18.07.2009, 17:46 
Offline

Registriert: 11.08.2008, 22:14
Beiträge: 17
Meine "Welt" ist momentan einfach ein Mesh als einfache Platte.
Schwerkraft hab ich auch schon, die wirkt allerdings nicht auf die Kamera, da ich erstmal will dass diese absolut frei beweglich ist, also nicht nur auf dem Boden. Nur durchfliegen sollte sie auch nicht können, also brauch ich Kollision. Die Funktioniert ja auch soweit, außer dass die Kamera halt so unnötig rotiert...
Ich kann ja mal hier den Code posten..:

Funktion(en) zum Laden der Welt
Code:
IAnimatedMesh* Graphics::loadMesh(char* filename) {
    return device->getSceneManager()->getMesh(filename);
}

void Graphics::loadWorld(char* worldfile) {
    worldMesh = loadMesh(worldfile);
    worldNode = device->getSceneManager()->addOctTreeSceneNode(worldMesh->getMesh(0));
    worldNode->setMaterialFlag(EMF_LIGHTING,false);
    worldNode->setTriangleSelector(device->getSceneManager()->createOctTreeTriangleSelector(worldMesh->getMesh(0),worldNode,128));
}

Funktion zum Erstellen der Kamera
Code:
ICameraSceneNode* Graphics::createCamera(vector3df position, vector3df target, bool bind) {
    ICameraSceneNode* camera = device->getSceneManager()->addCameraSceneNode(0,position);
    camera->bindTargetAndRotation(bind);
    camera->setTarget(target);
    camera->addAnimator(device->getSceneManager()->createCollisionResponseAnimator(worldNode->getTriangleSelector(), camera, vector3df(1,1,1), vector3df(0,0,0), vector3df(1,1,1), 0));
    return camera;
}

loadWorld und createCamera werden dann sofort hintereinander einfach aufgerufen bei Starten des Spiels. Und so wie es ist führt es halt zu dieser komischen Rotation. Ich hoffe mal man kann mir da irgendwie helfen, sonst müsste ich mir irgendwas kompliziertes einfallen lassen -.-.
Falls noch benötigt kann ich auch noch den Code für die Kamerabewegung posten, aber das lass ich erstmal, weil dann wirds glaub ich unübersichtlich^^


Nach oben
 Profil  
 
BeitragVerfasst: 19.07.2009, 01:16 
Offline
Benutzeravatar

Registriert: 23.06.2008, 07:21
Beiträge: 74
Wohnort: Dresden
mhm... *grüpel*
Ich hab grad deine Kollisionsfunktion getestet.
Wenn ich bei der Kamera die mitgelieferte Steuerung benutze, also die FPS Camera, dann rotiert die Kamera auch nicht auf 0, bzw woanders hin.
Die Bleibt in den Winkel wie die aufgeprallt ist.
Ich hab das zwar jetzt mit einen terraintriangleselector getestet, dürfte aber keinen unterschied machn :lol:

Es liegt vlt an deiner kamerasteuerung die du selbst geschrieben hast.

Benutz doch mal zu testzwecken die FPS Camera.

Ansonsten könntest du den Code von deiner Steuerung posten, vvlt ist da ein Fehler drin.

lg

_________________
...then he said, "I can't feel my legs!" and I said "Joe! Stay with me Joe!" But it was ... to late. The garbage collector came and... he was gone. Best object I ever had.


Nach oben
 Profil  
 
BeitragVerfasst: 19.07.2009, 12:37 
Offline

Registriert: 11.08.2008, 22:14
Beiträge: 17
Ok. Danke erstmal für die Hinweise^^
Mit der FPS Camera funktioniert es auch bei mir richtig. Ich hatte die vorerst nicht genomme weil die bei mir nicht auf die Maus reagierte, was aber daran lag das mein eigener EventReceiver immer die Mausbewegungen schon abfing und die somit nicht mehr zur Kamera durchkamen.
Wenn ich also jetzt die FPS Camera nehme funktioniert das zwar soweit, trotzdem würd ich das jetzt gerne noch so schaffen^^.
Mein Code mit dem ich die Kamera bewege und rotierte sieht so aus:
Code:
void IgHID::doAction() {
    // #getting active camera and current fps#
    ICameraSceneNode* camNode = graphics->getActiveCamera();
    u16 cfps = graphics->getExactFPS();
    // #rotate camera based on mouse movement#
    vector3df rotationVector = camNode->getRotation();
    rotationVector.Y = rotationVector.Y+txSpeed/cfps*(cursor.X-(graphics->getResolution().Width/2));
    rotationVector.X = rotationVector.X+tySpeed/cfps*(cursor.Y-(graphics->getResolution().Height/2));
    // #don't let the vertical angle overshoot 90 degrees up or down#
    rotationVector.X = (rotationVector.X>89.09&&rotationVector.X<180)?89.09:rotationVector.X;
    rotationVector.X = (rotationVector.X<270.91&&rotationVector.X>180)?270.91:rotationVector.X;

    // #move camera based on keystrokes#
    vector3df moveVector = camNode->getPosition();
    if (keys[KEY_UP]) {
        moveVector.X += mxSpeed/cfps*sin(rotationVector.Y*PI64/180)*cos(rotationVector.X*PI64/180);
        moveVector.Z += mxSpeed/cfps*cos(rotationVector.Y*PI64/180)*cos(rotationVector.X*PI64/180);
        moveVector.Y -= mxSpeed/cfps*sin(rotationVector.X*PI64/180);
    }
    if (keys[KEY_DOWN]) {
        moveVector.X -= mxSpeed/cfps*sin(rotationVector.Y*PI64/180)*cos(rotationVector.X*PI64/180);
        moveVector.Z -= mxSpeed/cfps*cos(rotationVector.Y*PI64/180)*cos(rotationVector.X*PI64/180);
        moveVector.Y += mxSpeed/cfps*sin(rotationVector.X*PI64/180);
    }
    if (keys[KEY_RIGHT]) {
        moveVector.X += mzSpeed/cfps*cos(rotationVector.Y*PI64/180);
        moveVector.Z -= mzSpeed/cfps*sin(rotationVector.Y*PI64/180);
   }
   if (keys[KEY_LEFT]) {
       moveVector.X -= mzSpeed/cfps*cos(rotationVector.Y*PI64/180);
       moveVector.Z += mzSpeed/cfps*sin(rotationVector.Y*PI64/180);
   }

    // #refresh the camera's rotation and position#
    camNode->setPosition(moveVector);
    camNode->updateAbsolutePosition();
    camNode->setRotation(rotationVector);

    // #place cursor back into center of window/screen#
    graphics->setCursor(position2d<s32>(graphics->getResolution().Width/2,graphics->getResolution().Height/2));
}

Dies wird immer in der Hauptschleife aufgerufen und der EventReceiver speichert immer die Eingaben in cursor und in keys.
Ich habe grade einmal ausprobiert die Zeile camNode->setRotation(rotationVector); wegzulassen. Da rotierte dann die Kamera nicht mehr bei Mausbewegung, wie ja zu erwarten war, allerdings auch nicht bei Kollision mit dem Boden. Es muss also irgendwas mit der Rotationsberechnung nicht ganz stimmen, allerdings fällt mir so nicht ganz auf was -.-


Nach oben
 Profil  
 
BeitragVerfasst: 19.07.2009, 21:00 
Offline
Benutzeravatar

Registriert: 23.06.2008, 07:21
Beiträge: 74
Wohnort: Dresden
Ich hab deinen Code probiert.
Allerdings hab ich mich gewundert, da es viele funktionen die du benutzt bei mir nicht existieren.
zB: getResolution() Die heißt bei mir: getScreenSize()

Naja egal ^^

auf jeden fall hab ich das gleiche problem mit der wegdrehenden kamera bei der kollision.
Ich hab aber keine ahnung warum ^^
Ich vermute es liegt an der Kollision und das zusammenspiel der eigenen Kamera.
Ich hoffe die FPS Kamera hilft dir weiter.

_________________
...then he said, "I can't feel my legs!" and I said "Joe! Stay with me Joe!" But it was ... to late. The garbage collector came and... he was gone. Best object I ever had.


Nach oben
 Profil  
 
BeitragVerfasst: 19.07.2009, 22:08 
Offline

Registriert: 11.08.2008, 22:14
Beiträge: 17
Erstmal Danke für die Mühe die du dir da immer machst wenn du mit meinem Code rumhantieren musst ;).

Das die Funktionen bei dir nicht existieren dürfte daran liegen dass ich die alle selbst geschrieben hab. Hab das ganze nämlich bissl in Klassen unterteilt und das Irrlichtzeug ist bei mir alles in der Graphics Klasse und da heißen die Funktionen halt so^^.
Mit der FPS geht es zwar jetzt, aber ich würd es halt jetzt trotzdem noch schaffen dass sich auch "meine" Kamera richtig verhält.

Hatte mir mal durch den Kopf gehen lassen, dass es vielleicht daran liegen könnte dass auch das Kameraziel mt dem Boden kollidiert, deswegen nicht weiter nach unten kann, folglich also auf einer Höhe bleibt und relativ zur Kamera, die sich ja weiterhin nach unten bewegt, nach oben geht. Die Bindung von Rotation und Ziel würde dann dazu führen, dass die Kamera halt irgendwann parallel zum Boden blickt.
Allerdings ist das Kameraziel ja afaik kein Node und nicht von der Kollision betroffen und außerdem würde das nicht erklären warum die Kamera plötzlich nach oben blickt wenn ich rückwärts mit dem Boden kollidiere. Glaube also nicht dass es daran liegt, werde es aber trotzdem morgen nochmal irgendwie prüfen^^.

Falls noch irgendwer eine Idee hat woran es liegen könnte, bitte helft mir^^


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de