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
Zitat
The asin function returns the arcsine of x in the range –π/2 to π/2 radians
Zitat von »"Phil_GDM"«
stimmt, man bekommt einen Vektor der zu den beiden anderen Vektoren im rechten Winkel steht.
Zusätzlich kann man aber noch erwähnen, dass dieser Vektor mit den beiden anderen Vektoren immer ein rechtshändiges Koordinatensystem aufbaut. Deshalb kann ich mit dem Kreuzprodukt auch die Drehrichtung für meinen Vektor herausfinden
z.B.:
Vektor A soll immer an Vektor B angeglichen werden
A=[0, 1, 0] B=[1,0,0]; crossp(A, B) = [0, 0, -1] die Z-Komponente ist negativ => Drehung nach rechts
A=[1,0,0] B=[0, 1, 0]; crossp(A, B) = [0, 0, 1] die Z-Komponente ist positiv => Drehung nach links
mfg Philipp
Alter Hase
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
VECTOR3F Object::getRotationDiffToYAxis(const VECTOR3F& v) { VECTOR3F myrot(0.0f, 1.0f, 0.0f); MATRIX m; VECTOR3F vRot = m_pSceneNode->getRotation(); m.setRotationDegrees(vRot); m.transformVect(myrot); myrot.normalize(); VECTOR3F rotdiff; VECTOR2F rot1(myrot.Y, myrot.Z); VECTOR2F rot2(v.Y, v.Z); if( (COMPF_NA(rot1.X, 0.0f) && COMPF_NA(rot1.Y, 0.0f)) || (COMPF_NA(rot2.X, 0.0f) && COMPF_NA(rot2.Y, 0.0f)) ) rotdiff.X = 0.0f; else rotdiff.X = static_cast<float>(rot1.getAngleWith(rot2)); rot1 = VECTOR2F(myrot.X, myrot.Z); rot2 = VECTOR2F(v.X, v.Z); if( (COMPF_NA(rot1.X, 0.0f) && COMPF_NA(rot1.Y, 0.0f)) || (COMPF_NA(rot2.X, 0.0f) && COMPF_NA(rot2.Y, 0.0f)) ) rotdiff.Y = 0.0f; else rotdiff.Y = static_cast<float>(rot1.getAngleWith(rot2)); rot1 = VECTOR2F(myrot.X, myrot.Y); rot2 = VECTOR2F(v.X, v.Y); if( (COMPF_NA(rot1.X, 0.0f) && COMPF_NA(rot1.Y, 0.0f)) || (COMPF_NA(rot2.X, 0.0f) && COMPF_NA(rot2.Y, 0.0f)) ) rotdiff.Z = 0.0f; else rotdiff.Z = static_cast<float>(rot1.getAngleWith(rot2)); VECTOR3F vCross = v.crossProduct(myrot); if(vCross.X > 0) rotdiff.X = -rotdiff.X; if(vCross.Y > 0) rotdiff.Y = -rotdiff.Y; if(vCross.Z > 0) rotdiff.Z = -rotdiff.Z; return rotdiff; } template<typename T> f64 vector2f<T>::getAngleWith(const vector2d<T>& b) const { f64 tmp = X*b.X + Y*b.Y; if (tmp == 0.0) return 90.0; return (acos(tmp / (sqrt(X*X + Y*Y) * sqrt(b.X*b.X + b.Y*b.Y)))); } |
Alter Hase
C-/C++-Quelltext |
|
1 |
return (acos(tmp / (sqrt(X*X + Y*Y) * sqrt(b.X*b.X + b.Y*b.Y)))) * GRAD_PI; |
Anonymous
unregistriert
Anonymous
unregistriert
Werbeanzeige