首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么ScreenToWorldPoint总是给出与鼠标位置相同的坐标?

为什么ScreenToWorldPoint总是给出与鼠标位置相同的坐标?
EN

Game Development用户
提问于 2018-05-18 11:46:37
回答 6查看 20.2K关注 0票数 4

每当我使用ScreenToWorldPoint(Input.mousePosition)并在控制台中显示输出时,这总是给出相同的坐标。

MyCode:

代码语言:javascript
运行
复制
Vector3 screenToWorld;

void Update()
{
    screenToWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    Debug.Log(screenToWorld);
}
EN

回答 6

Game Development用户

回答已采纳

发布于 2018-05-18 11:59:45

如果我没记错的话,对于ScreenToWorldPoint,您需要提供一个Z值。这代表到飞机的距离,在飞机上你想得到你的结果位置。试着使用这个:

代码语言:javascript
运行
复制
new Vector3( Input.mousePosition.x, Input.mousePosition.y, 1.0f )

作为你的输入位置。

这里有一个统一的例子:https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html

票数 11
EN

Game Development用户

发布于 2019-02-26 22:24:05

要使它正确,你应该通过相机的z,像这样:

代码语言:javascript
运行
复制
Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, mainCamera.transform.position.z)) * -1;

但是,我不建议您使用Camera.main,如果您保持对相机的引用,性能会更好。

代码语言:javascript
运行
复制
public Camera mainCamera;

mainCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, mainCamera.transform.position.z * -1));

在这里,你应该把z乘以-1,否则这会给你带来X和Y的倒排值。

票数 2
EN

Game Development用户

发布于 2021-05-13 20:38:33

检查你的相机投影。这将是一种透视。这是因为,从透视的角度来看,深度在计算中。因为你的鼠标是在屏幕空间,简单地说,你的鼠标是在相机本身。所以你想把相机坐标转换成世界。这就是为什么该代码将调试相机本身的位置。所以,你所需要做的就是增加一个距离的相机,以转换点。

代码语言:javascript
运行
复制
Vector3 screenToWorld;

void Update()
{
    screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 5f));
    Debug.Log(screenToWorld);
}

5f是距摄像机平面的距离,坐标将被转换。现在,当您切换到相机设置中的正射投影时,将不会发生此问题,因为不需要进行深度计算。

要理解这一点,一个小窍门就是看看两个投影中的摄像机。透视有一个金字塔状的结构,其中正字法有一个长方体。所以相机原点,在透视的情况下,就像一个点,你的鼠标在这个点上操作,所以它只会给你相机坐标。难到不是么?记住这只是个小把戏而已。

票数 2
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/158815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档