【问题标题】:Translate position from 3D camera to 2D camera将位置从 3D 相机转换为 2D 相机
【发布时间】:2019-08-28 12:56:10
【问题描述】:

目前我有 2 个摄像头,一个用于查看 3D 对象(透视),另一个用于查看 2D 对象(正交)。
(另外,摄像头的视野永远不会相互拦截。)

我正在尝试根据 3D 对象的位置显示 2D 对象,如下所示:

我拥有的是各自的 2D 和 3D Camera,以及 3D GameObjectVector3 位置。

我目前拥有的:

public Vector2 Convert3DPositionTo2DPosition(Camera camera3D, Vector3 position3D, Camera camera2D) {
    var tempPos = camera3D.WorldToViewportPoint(position3D);

    return camera2D.ViewportToWorldPoint(tempPos);
}

唯一的问题是返回的位置与 3D 位置没有完全对齐。
导致这种结果:

此外,我已确保 3D 和 2D 对象的轴心点均正确设置在中心,但仍无法按预期工作。

(我目前正在使用Unity 2019.1.14f1

编辑

我想要的 TLDR:
我想要一个基于 3D 相机视图中的对象的世界位置,该对象现在位于 2D 相机视图中,并让它们看起来在玩家的视点(显示屏)中处于相同位置。

之后我要实例化的对象(使用该位置)是一个非 UI 游戏对象。
更具体地说是粒子系统。

【问题讨论】:

  • 不确定我是否遗漏了什么,但您不只是想要camera2D.WorldToViewportPoint,因为您想将世界位置转换为二维位置吗?
  • @John 我刚刚测试了它,它没有用(同样的问题,但实际位置最终变得更远了);也许您可以发布最终代码以防我错过了什么?
  • 嗯。我并没有真正做 Unity,所以也许我弄错了。似乎您正在将世界位置转换为相机投影中的位置,然后将该相机位置转换为 2D 投影点。
  • @derHugo 我使用了ViewportToWorldPointViewportToWorldPoint,因为我可以获得游戏对象相对于3D 摄像机 的相对位置,然后将其转换为世界相对于 2D 相机camera3D.WorldToScreenPoint(position3D) 不会剪掉它,因为它会根据屏幕空间返回我的位置,而不是基于 2D 相机;使用ScreenToWorldPoint 使用 2D 相机将其转换回世界空间也给了我同样的问题;我编辑了我的问题以使我的目标更清晰。
  • 您是否在其中一台摄像机的Viewport Rect 中有偏移?

标签: c# unity3d


【解决方案1】:

检查您的两个Cameras 的Viewport Rect 设置!

如果两个摄像头之间有任何差异,您总是会得到位置偏移。

我使用

测试了您的解决方案
public Camera camera3d;
public Camera camera2d;
public Transform obj3d;
public Transform obj2d;

void Update()
{ 
    obj2d.position = camera2d.ViewportToWorldPoint(camera3d.WorldToViewportPoint(obj3d.position)); 
}

而且它工作正常——只要Viewport Rect 设置匹配——正如你所看到的herehere

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2019-07-04
    • 2020-02-16
    • 2013-11-22
    • 1970-01-01
    • 2020-02-24
    • 2015-02-09
    • 2012-07-17
    相关资源
    最近更新 更多