每当我使用ScreenToWorldPoint(Input.mousePosition)
并在控制台中显示输出时,这总是给出相同的坐标。
MyCode:
Vector3 screenToWorld;
void Update()
{
screenToWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Debug.Log(screenToWorld);
}
发布于 2018-05-18 11:59:45
如果我没记错的话,对于ScreenToWorldPoint
,您需要提供一个Z值。这代表到飞机的距离,在飞机上你想得到你的结果位置。试着使用这个:
new Vector3( Input.mousePosition.x, Input.mousePosition.y, 1.0f )
作为你的输入位置。
这里有一个统一的例子:https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html
发布于 2019-02-26 22:24:05
要使它正确,你应该通过相机的z,像这样:
Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, mainCamera.transform.position.z)) * -1;
但是,我不建议您使用Camera.main
,如果您保持对相机的引用,性能会更好。
public Camera mainCamera;
mainCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, mainCamera.transform.position.z * -1));
在这里,你应该把z乘以-1,否则这会给你带来X和Y的倒排值。
发布于 2021-05-13 20:38:33
检查你的相机投影。这将是一种透视。这是因为,从透视的角度来看,深度在计算中。因为你的鼠标是在屏幕空间,简单地说,你的鼠标是在相机本身。所以你想把相机坐标转换成世界。这就是为什么该代码将调试相机本身的位置。所以,你所需要做的就是增加一个距离的相机,以转换点。
Vector3 screenToWorld;
void Update()
{
screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 5f));
Debug.Log(screenToWorld);
}
5f是距摄像机平面的距离,坐标将被转换。现在,当您切换到相机设置中的正射投影时,将不会发生此问题,因为不需要进行深度计算。
要理解这一点,一个小窍门就是看看两个投影中的摄像机。透视有一个金字塔状的结构,其中正字法有一个长方体。所以相机原点,在透视的情况下,就像一个点,你的鼠标在这个点上操作,所以它只会给你相机坐标。难到不是么?记住这只是个小把戏而已。
https://gamedev.stackexchange.com/questions/158815
复制相似问题