I have my mouse position and my rectangle position in canvas space(screen space but with adjusted scaling). Now I want my mouse position converted to local space of the rectangle. Problem is, the rectangle can be rotated. Without rotation its quite simple and works nicely.
Solved with help from stackoverflow. The solution is as follows:
var mapRect = MapContentTransform.rect;
// Canvas Space Map Center
var mapPositionCenter = CanvasRectTransform.InverseTransformPoint(MapContentTransform.position);
mapPositionCenter.x += CanvasRectTransform.rect.width / 2.0f;
mapPositionCenter.y += CanvasRectTransform.rect.height / 2.0f;
// Mouse Position in Canvas Space
Vector2 mousePositionCanvasSpace = CalculateScreenspacePositionCanvasSpace(new Vector2(Input.mousePosition.x, Input.mousePosition.y));
// Rotation angle of the Map in Radians
float theta = -(MapContentTransform.eulerAngles.z - 360.0f) * Mathf.Deg2Rad;
var rotatedX = ((mousePositionCanvasSpace.x - mapPositionCenter.x) * Mathf.Cos(theta) -
(mousePositionCanvasSpace.y - mapPositionCenter.y) * Mathf.Sin(theta)) + mapRect.width / 2.0f;
var rotatedY = ((mousePositionCanvasSpace.y - mapPositionCenter.y) * Mathf.Cos(theta) +
(mousePositionCanvasSpace.x - mapPositionCenter.x) * Mathf.Sin(theta)) + mapRect.height / 2.0f;
I had to adjust for Unity’s Counter-Clockwise UI rotation(The formula requires Clockwise!) as well as the offset from the center of the rotated image since I want the coordinates to be from 0 to image.size.
Hi @TriNityGER
Scaling nor rotation does not matter here I think. This is more like matter of space conversion, and you are interested in point’s location in Canvas RectTransform space, transformed into your other RectTransform’s space:
public RectTransform refItemRt;
public RectTransform placedItemRt;
public RectTransform targetSpaceRt;
void Update ()
{
var pos = targetSpaceRt.InverseTransformPoint(refItemRt.position);
placedItemRt.localPosition = pos;
}