Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <irrlicht.h> #include <iostream> using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; using namespace std; int main(int argc, char** argv) { CMatrix4<float> myMat; vector3d<float> myVct(1.0,1.0,0.0); // Ausgangsvektor myMat.makeIdentity(); // Wir gehen von der Identitätsmatrix aus... myMat.setRotationDegrees(vector3d<float>(90.0,0.0,0.0)); // ...und erzeugen eine Rotationsmatrix, die den Vektor um 90 Grad an der x-Achse dreht myMat.rotateVect(myVct); // jetzt wird der Vektor gedreht cout << myVct.X << " " << myVct.Y << " " << myVct.Z << "\n"; // ... und angezeigt return 0; } |
C-/C++-Quelltext |
|
1 |
myMat.setRotationDegrees(vector3d<f32>(90.0f,0.0f,0.0f)); |
C-/C++-Quelltext |
|
1 |
myMat.setRotationDegrees(vector3df(90,0,0)); |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SaRu« (19.06.2010, 20:41)
Da hast du wohl recht.also -4.3 * 10^-8 ist -0.000000043 was ja schonma sogut wie null entspricht.
Hab ich beides ausprobiert, hat aber nix geändert. Im Bogenmaß entspricht 90 grad doch PI oder? Dann würde ich mal die Methode setRotationRadians ausprobieren, aber ansonsten wird man das in einem Spiel wahrscheinlich nicht erkennen, wenn die Position nur FAST 0 ist oder? Und bei der Kollisionserkennung später wird das wahrscheinlich auch keinen sichtbaren Unterschied machen oder? Wichtig ist dann ja eigentlich nur, dass ich wieder den SELBEN Vektor habe wenn ich ihn 4 mal um 90 Grad gedreht habe, damit ein sich drehendes Objekt nicht ganz langsam immer weiter nach oben rutschtDeine Zeile 18 würde ich mal wie folgt ändern:
C-/C++-Quelltext
1 myMat.setRotationDegrees(vector3d(90.0f,0.0f,0.0f));
oder
C-/C++-Quelltext
1 myMat.setRotationDegrees(vector3df(90,0,0));
Bin leider kein Irrlicht Experte, daher ist das nur so eine Idee, weiß nicht ob das funktioniert - probiers einfach mal aus.
Siehe Beitrag von Genion: 90° -> PI/2Im Bogenmaß entspricht 90 grad doch PI oder?
Richtig, das wirst du nicht merken. Denk mal an die Koordinaten eines Objekts, gibst du die auch auf 8 Dezimalstellen an? Wohl kaum oder? Also wird das auch bei der Kollisionserkennung keinen Unterschied machen, denk ich mal. Ich erinner mich an dieser Stelle auch an eine Situation die David Scherfgen in seinem Buch beschreibt. Um sicherzugehn, dass es nicht zu einer Division durch null kommt, addiert man zum Divisor (im Bruch der Nenner) einen sehr, sehr kleinen Betrag. Dies ist schneller als eine if-Bedingung die überprüft, ob der Divisor null ist. Man kann also mit verschwindend geringen Ungenauigkeiten sehr gut leben, da sie meist an irgendeiner stelle eh wieder verschwinden. Wenn z.B. gerundet wird oder in integer gecastet wird.Zitat
aber ansonsten wird man das in einem Spiel wahrscheinlich nicht erkennen, wenn die Position nur FAST 0 ist oder? Und bei der Kollisionserkennung später wird das wahrscheinlich auch keinen sichtbaren Unterschied machen oder?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <irrlicht.h> #include <iostream> using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; using namespace std; int main(int argc, char** argv) { CMatrix4<double> myMat; vector3d<float> myVct(1.0,1.0,0.0); for(int y=0; y<100;y++) { for(int x = 0; x<360*1000000 ; x++) { myMat.makeIdentity(); myMat.setRotationDegrees(vector3d<double>(1,0,0)); myMat.rotateVect(myVct); } } cout << myVct.X << " " << myVct.Y << " " << myVct.Z << "\n"; return 0; } |
und mein Prozessor hatte ca 37 minuten sinnlose Arbeit
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
myMat.makeIdentity(); myMat.setRotationDegrees(vector3d<double>(1,0,0)); for(int x = 0; x<360*1000000; x++) { for(int y = 0; y <100; y++) myMat.rotateVect(myVct); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <irrlicht.h> #include <iostream> using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; using namespace std; int main(int argc, char** argv) { CMatrix4<double> mScale,mRotate,mTranslate,mTransform; vector3d<float> myVct(1.0,1.0,0.0); mScale.makeIdentity(); mRotate.makeIdentity(); mTranslate.makeIdentity(); mTransform.makeIdentity(); mScale.setScale(2); mRotate.setRotationDegrees(vector3d<double>(90,0,0)); mTranslate.setTranslation(vector3d<double>(4,2,1)); mTransform = mScale; mTransform*= mRotate; mTransform*= mTranslate; mTransform.transformVect(myVct); cout << myVct.X << " " << myVct.Y << " " << myVct.Z << "\n"; return 0; } |
Werbeanzeige