mirror of
https://github.com/okalachev/flix.git
synced 2026-06-27 21:46:38 +00:00
Fix Vector::rotationVectorBetween implementation for parallel vectors
This commit is contained in:
+16
-3
@@ -105,10 +105,23 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Vector rotationVectorBetween(const Vector& a, const Vector& b) {
|
static Vector rotationVectorBetween(const Vector& a, const Vector& b) {
|
||||||
|
float an = a.norm();
|
||||||
|
float bn = b.norm();
|
||||||
|
if (an < 1e-6 || bn < 1e-6) {
|
||||||
|
return Vector(0, 0, 0);
|
||||||
|
}
|
||||||
Vector direction = cross(a, b);
|
Vector direction = cross(a, b);
|
||||||
if (direction.zero()) {
|
if (direction.norm() < 1e-6) { // vectors are parallel
|
||||||
// vectors are opposite, return any perpendicular vector
|
if (dot(a, b) > 0) { // same direction
|
||||||
return cross(a, Vector(1, 0, 0));
|
return Vector(0, 0, 0);
|
||||||
|
}
|
||||||
|
// opposite direction
|
||||||
|
Vector perp = cross(a, Vector(1, 0, 0));
|
||||||
|
if (perp.norm() < 1e-6) {
|
||||||
|
perp = cross(a, Vector(0, 1, 0));
|
||||||
|
}
|
||||||
|
perp.normalize();
|
||||||
|
return perp * PI;
|
||||||
}
|
}
|
||||||
direction.normalize();
|
direction.normalize();
|
||||||
float angle = angleBetween(a, b);
|
float angle = angleBetween(a, b);
|
||||||
|
|||||||
Reference in New Issue
Block a user