I am working on the move tool in a 3D modeling software. I need to know how much to move when the user drags an axis of the gizmo (for example along the x axis). I have the 2D vector describing how much the mouse moved on the screen MouseDelta, and the vector corresponding to the selected axis AxisVector. I would like to know the best way to compute the amount of extrusion I should apply. Currently I try to project the AxisVector in screen space, project MouseDelta on it and get the ratio between the size of the AxisVectorOnScreen and the computed projection. Then I have to clamp the result and multiply it by a factor. Here is a pseudo code:Vector3 AxisVectorOnScreen = GetViewProjMatrix().TransformVector(AxisVector);Vector2 AxisVectorOnScreen2D(AxisVectorOnScreen .X * 0.5f * Screen.Width(), AxisVectorOnScreen .Y * 0.5f * Screen.Height());Vector2 MouseDelta = EndMousePosition - BeginMousePosition;float Size = AxisVectorOnScreen2D.Length();float ProjectionLength = MouseDelta | AxisVectorOnScreen2D.GetSafeNormal();float Ratio = Size / ProjectionLength;float Amount = 10.f * FMath::Clamp(Ratio, -2.5f, 2.5f);I think I could also project my mouse vector on a plane perpendicular to the camera and do the same maths on this plane. What is the best solution?Note: I have the same problem to get the amount of extrusion I should apply with my extrude tool (along the normal of a face).
How to get the transform amount from a screen vector and a direction vector?
algorithm;3d;transformations;projections
This is a good solution. I just had a problem transforming AxisVector in screen coordinates, it turns out I must project two points from this vector on the screen, as explained in this answer.