Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(241)

Unified Diff: cc/animation/transform_operation.cc

Issue 297163010: Fixed the order of applying transform operations for animation bounds. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | cc/animation/transform_operations.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/animation/transform_operation.cc
diff --git a/cc/animation/transform_operation.cc b/cc/animation/transform_operation.cc
index e4d0dadf0eb5189bd9ebe4e302f26526af24df74..f4403fa37e509580a68a8b0451cf0942e280d5e6 100644
--- a/cc/animation/transform_operation.cc
+++ b/cc/animation/transform_operation.cc
@@ -314,31 +314,29 @@ static void BoundingBoxForArc(const gfx::Point3F& point,
return;
v1.Scale(1.f / v1_length);
-
gfx::Vector3dF v2 = gfx::CrossProduct(normal, v1);
-
- // Now figure out where (1, 0, 0) and (0, 0, 1) project on the rotation
- // plane.
- gfx::Point3F px(1.f, 0.f, 0.f);
- gfx::Vector3dF to_px = px - center;
- gfx::Point3F px_projected =
- px - gfx::ScaleVector3d(normal, gfx::DotProduct(to_px, normal));
- gfx::Vector3dF vx = px_projected - origin;
-
- gfx::Point3F pz(0.f, 0.f, 1.f);
- gfx::Vector3dF to_pz = pz - center;
- gfx::Point3F pz_projected =
- pz - ScaleVector3d(normal, gfx::DotProduct(to_pz, normal));
- gfx::Vector3dF vz = pz_projected - origin;
-
- double phi_x = atan2(gfx::DotProduct(v2, vx), gfx::DotProduct(v1, vx));
- double phi_z = atan2(gfx::DotProduct(v2, vz), gfx::DotProduct(v1, vz));
-
- candidates[0] = atan2(normal.y(), normal.x() * normal.z()) + phi_x;
+ // v1 is the basis vector in the direction of the point.
+ // i.e. with a rotation of 0, v1 is our +x vector.
+ // v2 is a perpenticular basis vector of our plane (+y).
+
+ // Take the parametric equation of a circle.
+ // x = r*cos(t); y = r*sin(t);
+ // We can treat that as a circle on the plane v1xv2.
+ // From that we get the parametric equations for a circle on the
+ // plane in 3d space of:
+ // x(t) = r*cos(t)*v1.x + r*sin(t)*v2.x + cx
+ // y(t) = r*cos(t)*v1.y + r*sin(t)*v2.y + cy
+ // z(t) = r*cos(t)*v1.z + r*sin(t)*v2.z + cz
+ // Taking the derivative of (x, y, z) and solving for 0 gives us our
+ // maximum/minimum x, y, z values.
+ // x'(t) = r*cos(t)*v2.x - r*sin(t)*v1.x = 0
+ // tan(t) = v2.x/v1.x
+ // t = atan2(v2.x, v1.x) + n*M_PI;
+ candidates[0] = atan2(v2.x(), v1.x());
candidates[1] = candidates[0] + M_PI;
- candidates[2] = atan2(-normal.z(), normal.x() * normal.y()) + phi_x;
+ candidates[2] = atan2(v2.y(), v1.y());
candidates[3] = candidates[2] + M_PI;
- candidates[4] = atan2(normal.y(), -normal.x() * normal.z()) + phi_z;
+ candidates[4] = atan2(v2.z(), v1.z());
candidates[5] = candidates[4] + M_PI;
}
« no previous file with comments | « no previous file | cc/animation/transform_operations.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698