How to get the screen position of the four corners of an image target using Vuforia ARCamera in Unity?

359 Views Asked by At

How to find the screen position of the four corners of an image target in Vuforia for perspective transform?

"GetLocalCorners" returns an array of four corners that represent the corners of the rectangular shape. but I need image corners.

I want to get screen position(pixel) in yellow points

1

There are 1 best solutions below

9
derHugo On BEST ANSWER

Since you speak of GetLocalCorners assuming you have a RectTransform => You would first go through GetWorldCorners then pass those through WorldToScreenPoint

so e.g.

RectTransform rectTransform = YOUR_TARGET_RECT_TRANSFORM;
var corners = new Vector3[4];
rectTransform.GetWorldCorners(corners);
var camera = Camera.main;
for(var i = 0; i < corners.Length; i++)
{
    corners[i] = camera.WorldToScreenPoint(corners[i]);
}

Now the corners are in pixel screen space.


If the target is actually not a RectTransform you would need to calculate the corners in worldspace yourself first. Might look somewhat like e.g.

var position = YOUR_TARGET_Transform.position;
// assuming that scale is applied to the target so that it matches with the target dimensions 
var size = YOUR_TARGET_Transform.lossyScale;
// assuming your target is by default flat on the XZ plane
// => transform.up points towards the sky by default
// if the target is actually rotated you need to adjust those
var x = YOUR_TARGET_Transform.right * size.x * 0.5f;
var z = YOUR_TARGET_Transform.forward * size.z * 0.5f;
var corners = new Vector3[4];
corners[0] = position - x - z;
corners[1] = position - x + z;
corners[2] = position + x + z;
corners[3] = position + x - z;

Little demo of that

public class TEST : MonoBehaviour
{
    public RectTransform[] images;

    // Update is called once per frame
    void Update()
    {
        var position = transform.position;

        // assuming that scale is applied to the target so that it matches with the target dimensions 
        var size = transform.lossyScale;

        // assuming your target is by default flat on the XZ plane
        // => transform.up points towards the sky by default
        // if the target is actually rotated you need to adjust those
        var x = transform.right * size.x * 0.5f;
        var z = transform.forward * size.z * 0.5f;
        var corners = new Vector3[4];
        corners[0] = position - x - z;
        corners[1] = position - x + z;
        corners[2] = position + x + z;
        corners[3] = position + x - z;

        for (var i = 0; i < 4; i++)
        {
            corners[i] = Camera.main.WorldToScreenPoint(corners[i]);

            images[i].position = (Vector2)corners[i];
        }
    }
}

enter image description here