我猜你的图像父级中没有任何比例或旋转,并且位置Y为0。
首先,您可以使用 rectTransform.GetWorldCorners()
获取图像左上角的位置:
//Upper left corner
Vector3[] v = new Vector3[4];
image.rectTransform.GetWorldCorners(v);
var recPos = v[1];
然后,您需要通过图像大小和矩形大小之间的比率将规范化偏移转换为世界空间偏移,并添加左上角位置的位置:
var recWidth = image.rectTransform.sizeDelta.x;
var imgWidth = image.sprite.texture.width;
var realOffsetX = offsetX * (recWidth / imgWidth);
var realPosX = recPos.x + realOffsetX;
对于 Y 坐标,使用相同的公式,但是您必须减去您的比率 realOffsetY
,因为偏移量是从左上角计算的。
以下是完整的方法:
private Vector3 GetPositionOffset(Image image, float offsetX, float offsetY)
{
Vector3[] v = new Vector3[4];
image.rectTransform.GetWorldCorners(v);
var recPos = v[1];
var recWidth = image.rectTransform.sizeDelta.x;
var imgWidth = image.sprite.texture.width;
var realOffsetX = offsetX * (recWidth / imgWidth);
var realPosX = recPos.x + realOffsetX;
var recHeight = image.rectTransform.sizeDelta.y;
var imgHeight = image.sprite.texture.height;
var realOffsetY = offsetY * (recWidth / imgWidth);
var realPosY = recPos.y - realOffsetY;
return new Vector3(realPosX, realPosY, image.transform.position.z);
}
如果您想将此世界空间转换为屏幕空间,只需使用相机方法:
camera.WorldToScreenPoint(positionOffset);
TransformPoint()
? - Draco18s no longer trusts SEViewportToWorld
没有考虑到世界空间中的画布:仅仅因为相机的中心在(x,y,z)
处,并不意味着画布的中心也在(x,y,z)
处(毕竟,它是在世界空间中具有自己独立于相机的坐标系)。然而,这个旧答案可能会有所帮助。 - Draco18s no longer trusts SE(0.4, 0.3)
是什么意思?这些单位是什么?在哪个空间中?世界空间?如何考虑屏幕纵横比?视野?相机旋转?您的图像似乎表明您希望在面部(或其他特征)周围画一个正方形,但该特征存在于像素空间中:您必须将那些单位转换为世界空间单位,而不是反过来。 - Draco18s no longer trusts SE(0.4, 0.3)
值,加上左上角,转换为世界空间。 - Draco18s no longer trusts SE