首页 > 解决方案 > 如何在 Unity 中获取 3D 空间中对象的屏幕点?

问题描述

我正在尝试将使用线渲染器绘制的线的末端与距离相机仅几个单位的空间点匹配,并且位于可能离相机非常远或非常近的物体上方。当我使用 WorldToScreenPoint 时,我得到的结果让我难以理解。设置位置 0 是我得到难以理解的结果的地方。该代码是我试图获取其屏幕位置的对象的一个​​组件。任何帮助表示赞赏。

foreach (int i in identifiers)
{
    GameObject lineHolder = new GameObject();
    lineHolder.transform.position = transform.position;
    lineHolder.transform.parent = transform;
    LineRenderer line = lineHolder.AddComponent<LineRenderer>();
    lineHolders.Add(lineHolder);
    line.positionCount = 2;
    line.SetPosition(0, Camera.main.WorldToScreenPoint(new Vector3(transform.position.x, transform.position.y, master.screenPoint.z)));
    line.widthMultiplier = .1f;
    line.SetPosition(1, master.controlPanel.controlElements[i].position);
}

这就是我在我所指的“主”代码中获得“screenPoint”的方式:

screenPoint = Camera.main.WorldToScreenPoint(controlPanel.transform.position);

“controlPanel”对象距离相机 5 个单位。我试图防止在控制面板中的对象下绘制线条,这些对象只是对象,不是画布的一部分,但与相机保持 5 个单位。

我从屏幕点转换为世界点。这是有效的更正代码:

foreach (int i in identifiers)
                    {
                        GameObject lineHolder = new GameObject();
                        lineHolder.transform.position = transform.position;
                        lineHolder.transform.parent = transform;
                        LineRenderer line = lineHolder.AddComponent<LineRenderer>();
                        lineHolders.Add(lineHolder);
                        line.positionCount = 2;
                        Vector3 screenPoint = Camera.main.WorldToScreenPoint(transform.position);
                        line.SetPosition(0, Camera.main.ScreenToWorldPoint(new Vector3(screenPoint.x, screenPoint.y, master.controlPanel.transform.localPosition.z)));
                        line.widthMultiplier = .1f;
                        line.SetPosition(1, master.controlPanel.controlElements[i].position);

标签: c#unity3d

解决方案


推荐阅读