c# - 如何在 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);
解决方案
推荐阅读
- sql - 如何通过 ALTER TABLE 添加 CHECK 约束?
- django - 带有内联的 Django-cms CMS 插件一旦创建内联就不会出现在编辑模式下
- javascript - 从 javascript 获取 HTML 元素属性
- node.js - 使用 http.get 时必须设置 final_response
- android - 一些输入文件使用或覆盖 android studio 3.0 中已弃用的 API
- c++ - 从 OpenCV 手部跟踪算法制作一个 dll 并放入 Unity
- c# - C#如何在datagridview(SQL)中显示数据库表的项目
- r - 按组删除一个特定字符串前面的 NA,但保留在另一个特定字符串前面
- node.js - Firebase 函数从 URL 获取参数
- firebase - 如何使用 Firebase Admin SDK(服务器端)验证电子邮件/密码凭据?