Yep, it needs to be CFrame; I’m using it to precisely show rolling motion in a transition between two points inside of a viewport frame. I also need to be able to scale up the amount of objects efficiently so hackily putting objects in the workspace with bodyvels and replicating their rotation wouldn’t work either.

To calculate the vector that your object needs to rotate around, first calculate the velocity vector of the object. Next, calculate the normal vector to the ground that the object is actually rolling on. Lastly, calculate the orthogonal vector via cross product. This is the ‘axis of rotation’ for the object. To calculate the rotational velocity of the object accurately, simply convert the linear velocity to rotation velocity via v/r=w

Like jody said, then you can use CFrame.fromAxisAngle( Vector3 v, number r ). v is the orthogonal vector to the surface normal and movement while r is the rotation in radians.