unity3d Unity ScreenToWorldPoint函数始终返回照相机位置,即使有z轴值

sdnqo3pr  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(339)

我有一个透视摄影机在我的场景中,我有这行代码来获取鼠标位置的世界点,但它总是返回摄影机的位置,尽管有z值。

Vector2 screenPosition = Input.touches[0].position;
Vector2 touchPosition = Camera.main.ScreenToWorldPoint(new Vector3
        (screenPosition.x, screenPosition.y, -Camera.main.transform.position.z));

我已经检查了相机,触摸和屏幕位置等变量的值。我也尝试了一些矢量3和矢量2之间的转换,但没有得到解决方案。
先谢了。

mi7gmzs6

mi7gmzs61#

如果要将输入的屏幕位置变换为世界位置,可以用途:

Vector2 screenPosition = Input.touches[0].position;
Vector3 touchPosition = Camera.main.ScreenToWorldPoint(new Vector3
        (screenPosition.x, screenPosition.y, Camera.main.nearClipPlane));
  • (您将需要将touchPosition更改为Vector3,因为它位于 * worldSpace中)。

这会将输入放置在摄影机的近剪裁平面上。
你可能想使用屏幕位置作为光线投射到世界的来源,这基本上是将光线从相机的位置投射到世界中。如果是这种情况,你会需要这个代码片段:

Vector2 screenPosition = Input.touches[0].position;
Ray ray = Camera.main.ScreenPointToRay(screenPosition);
if (Physics.Raycast(ray, out RaycastHit hitInfo))
{
    worldPosition = hitInfo.point;
}
kxkpmulp

kxkpmulp2#

我已经意识到这个问题是由脚本中的FOV设置引起的。我猜它在试图设置FOV并在同一帧中找到鼠标位置的世界点时不知何故导致了计算错误。这里的代码在没有FOV部分的情况下也能正常工作。谢谢你的帮助。

Vector3 screenPoint = Input.mousePosition;
screenPoint.z = -cam.transform.position.z;

worldPosition = cam.ScreenToWorldPoint(screenPoint);

相关问题