我在具有“屏幕空间-相机”渲染模式的画布中有一个图像UI.我想做的是通过遍历所有LineRenderer位置并更改其y轴,将LineRenderer移至图像垂直位置.我的问题是我无法获得LineRenderer可以理解的图像的正确位置.我试过使用ViewportToWorldPoint和ScreenToWorldPoint,但位置不同.
Vector3 val = Camera.main.ViewportToWorldPoint(new Vector3(image.transform.position.x, image.transform.position.y, Camera.main.nearClipPlane));
for (int i = 0; i < newlistofPoints.Count; i++)
{
line.SetPosition(i, new Vector3(newlistofPoints[i].x, val.y, newlistofPoints[i].z));
}
使用Vector3的屏幕截图结果val = Camera.main.ScreenToWorldPoint(new Vector3(image.transform.localPosition.x,image.transform.localPosition.y,-10));
绿色的LineRenderer是更改y位置的结果.它应该在正方形图像的底部.
解决方法:
哇,这很烦人而且很复杂.
这是我最终得到的代码.您问题中的代码是Update()函数的下半部分.我唯一更改的是传递给ScreenToWorldPoint()方法的内容.该值在Update()函数的上半部分中计算.
RectTransformToScreenSpace()函数是从this Unity Answer post1改编而来的,关于获取RectTransform的屏幕空间坐标(这正是我们想要从屏幕空间坐标转换回世界空间的目的!),唯一的区别是我得到了反Y值,所以我从Screen.height-transform.position.y更改为仅transform.position.y,完美地完成了这个技巧.
之后,仅需抓住矩形的左下角,使其成为Vector3而不是Vector2,然后将其传递回ScreenToWorldPoint().唯一的技巧是由于使用了透视相机,我需要知道线条与相机的原始距离是多少,以便保持相同的距离(否则线条在屏幕上上下移动的速度比图像快).对于正交摄影机,此值可以是任何值.
void Update () {
//the new bits:
float dist = (Camera.main.transform.position - newlistofPoints[0]).magnitude;
Rect r = RectTransformToScreenSpace((RectTransform)image.transform);
Vector3 v3 = new Vector3(r.xMin, r.yMin, dist);
//more or less original code:
Vector3 val = Camera.main.ScreenToWorldPoint(v3);
for(int i = 0; i < newlistofPoints.Count; i++) {
line.SetPosition(i, new Vector3(newlistofPoints[i].x, val.y, newlistofPoints[i].z));
}
}
//helper function:
public static Rect RectTransformToScreenSpace(RectTransform transform) {
Vector2 size = Vector2.Scale(transform.rect.size, transform.lossyScale);
Rect rect = new Rect(transform.position.x, transform.position.y, size.x, size.y);
rect.x -= (transform.pivot.x * size.x);
rect.y -= ((1.0f - transform.pivot.y) * size.y);
return rect;
}
1从通用搜索中找到有关“如何获取UI对象的屏幕坐标”的帖子并不容易.还有很多其他帖子,并提供了一些代码,但是都没有达到我想要的功能(包括将屏幕空间坐标转换回UI对象的世界空间坐标,这很愚蠢而又不可逆,谢谢RectTransformUtility
!)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。