【发布时间】:2019-08-28 12:56:10
【问题描述】:
目前我有 2 个摄像头,一个用于查看 3D 对象(透视),另一个用于查看 2D 对象(正交)。
(另外,摄像头的视野永远不会相互拦截。)
我正在尝试根据 3D 对象的位置显示 2D 对象,如下所示:
我拥有的是各自的 2D 和 3D Camera,以及 3D GameObject 的 Vector3 位置。
我目前拥有的:
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 我使用了
ViewportToWorldPoint和ViewportToWorldPoint,因为我可以获得游戏对象相对于3D 摄像机 的相对位置,然后将其转换为世界相对于 2D 相机。camera3D.WorldToScreenPoint(position3D)不会剪掉它,因为它会根据屏幕空间返回我的位置,而不是基于 2D 相机;使用ScreenToWorldPoint使用 2D 相机将其转换回世界空间也给了我同样的问题;我编辑了我的问题以使我的目标更清晰。 -
您是否在其中一台摄像机的
Viewport Rect中有偏移?