c# - 使用鼠标光标在特定轴上拖动 3D 对象
问题描述
我正在尝试构建一个简单的游戏,用户可以在其中放置一些元素并移动它们。
我想要的是让用户可以选择根据他/她的决定在特定轴上移动对象。
很像统一的运动小发明。
我知道如何用鼠标拖动世界中的对象,但如何在特定轴(例如 Z 轴)上移动。
我试图读取“鼠标 X”的值,但它只适用于特定的视角,如果我从不同的角度看物体,物体将无法正确移动。
我所做的是这样的:
private void OnMouseDrag()
{
transform.Translate(moveAxis * Input.GetAxis("Mouse X");
}
其中moveAxis
aVector3
表示轴,脚本附加到箭头 Gizmo。
解决方案
这是一种方法:
将moveAxis
方向从本地空间转换为屏幕空间。确保您有一个缓存的Camera
字段/变量,因为调用Camera.main
和/或是GetComponent<Camera>
一个缓慢的操作:
// Get world direction from moveAxis
Vector3 worldDirection = transform.TransformDirection(moveAxis);
Vector2 screenDirection = camera.WorldToScreenPoint(worldDirection + transform.position)
- camera.WorldToScreenPoint(transform.position);
// optionally, normalize the vector in screen space.
// screenDirection.Normalize();
如果您不希望屏幕上轴的角度影响拖动的速度,您可以标准化屏幕方向。您可能不想使其正常化,但如果您想要不同的感觉,请尝试一下。
然后,计算轴方向和鼠标移动之间的点积,计算出一个幅度:
Vector2 mouseMovement = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
float translateMagnitude = Vector2.Dot(mouseMovement, screenDirection);
mouseMovement.x
左必须为负,右mouseMovement.y
为正,向下必须为负,向上必须为正。如果任一轴反转,则将该轴的值乘以-1f
。
这样,translateMagnitude
如果鼠标在屏幕空间中沿轴的方向移动,则为正,如果逆着它移动,则为负。
然后,将幅度乘以一些可配置的灵敏度因子,再乘以Translate
调用的轴向量:
public float translateSensitivity;
...
transform.Translate(moveAxis * translateSensitivity * translateMagnitude);
推荐阅读
- api - Telegram API - 如何从邀请链接获取数据?聊天 ID、图像、标题、描述
- reactjs - 如何正确导入 Web 组件以响应应用程序?
- python-3.x - 同步pymol
- reactjs - 在 netlify 上托管时未捕获(承诺)
- wpf - 如何在打开事件中获取上下文菜单对象
- python - 每个带有文件名的 pdf 添加 2 页
- wordpress - 是否可以根据用户角色为 WooCommerce 提供特定的支付网关?
- openssl - OpenSSL 安装后 Python 3 SSL 失败
- c++ - cin无法输入
- android - 关于.gitignore问题,Android项目中的.cxx文件夹