- Home /
Question by
ProtoTerminator · May 15, 2018 at 06:31 PM ·
worldtoscreenpointworldtoscreen
WorldToScreenPoint bad return at large values
At certain camera angles and distances from targets, Camera.WorldToScreenPoint returns seemingly inversed numbers as the real value approaches +- infinity. I would expect a return of Vector3.positive/negativeInfinity in these cases, should I report this as a bug?
Anyway, I'm trying to stretch UI elements between 2 world points, whether they are on screen or not, and that completely breaks when that happens. How can I get around this limitation? (If the 2 points are off screen on opposite sides, the UI element should stretch across the entire screen.)
Camera cam = Camera.main;
cam.transform.rotation = Quaternion.Euler(47.902f, 0, 0);
cam.transform.position = new Vector3(-9.820416f, 7.028483f, -7.202926f);
Debug.Log(cam.WorldToScreenPoint(new Vector3(-21.83334f, -1.69f, -16.83333f))); // Correct (-619771.9, -670568.4, 0.0)
Debug.Log(cam.WorldToScreenPoint(new Vector3(-21.83334f, -1.68f, -16.83333f))); // Correct (-1463491.0, -1582139.0, 0.0)
Debug.Log(cam.WorldToScreenPoint(new Vector3(-21.83334f, -1.67f, -16.83333f))); // Incorrect (4071627.0, 4398110.0, 0.0)
Debug.Log(cam.WorldToScreenPoint(new Vector3(-21.83334f, -1.66f, -16.83333f))); // Incorrect (852279.1, 919864.0, 0.0)
using UnityEngine;
[RequireComponent(typeof(RectTransform))]
public class UIAlignToWorld : MonoBehaviour
{
public Vector3 leftWorldPoint;
public Vector3 rightWorldPoint;
Camera cam;
RectTransform thisRect;
private void Awake()
{
cam = Camera.main;
thisRect = GetComponent<RectTransform>();
}
void LateUpdate()
{
var leftPosition = cam.WorldToScreenPoint(leftWorldPoint);
var rightPosition = cam.WorldToScreenPoint(rightWorldPoint);
transform.position = (leftPosition + rightPosition) * 0.5f;
float ang = Vector2.Angle(Vector2.right, rightPosition - leftPosition);
if (rightPosition.y < leftPosition.y)
ang = 360 - ang;
transform.localRotation = Quaternion.Euler(0, 0, ang);
thisRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Vector3.Distance(leftPosition, rightPosition));
}
}
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612162728im_/https://answers.unity.com/themes/thub/images/avi.jpg)