使用鼠标光标在特定轴上拖动 3D 对象

Posted

技术标签:

【中文标题】使用鼠标光标在特定轴上拖动 3D 对象【英文标题】:Drag 3D object on specific axis using the mouse cursor 【发布时间】:2019-12-14 05:47:54 【问题描述】:

我正在尝试构建一个简单的游戏,用户可以在其中放置一些元素并移动它们。

我想要的是让用户可以根据自己的决定在特定轴上移动对象。

很像统一的运动小玩意儿。

我知道如何用鼠标拖动世界中的对象,但如何在特定轴(例如 Z 轴)上移动。

我试图读取“鼠标 X”的值,但它只适用于特定的视角,如果我从不同的角度看对象,对象将无法正确移动。

我做的是这样的:

private void OnMouseDrag()

   transform.Translate(moveAxis * Input.GetAxis("Mouse X");

其中moveAxis 是代表轴的Vector3,脚本附加到箭头小工具。

【问题讨论】:

Constrain dragging to local axis of object的可能重复 @Eliasar 这个例子根本不使用鼠标光标 您的问题是关于单击和拖动对象的能力还是将其限制在某个轴上?链接的问题实际上确实提到了点击拖动场景:“想象将相机指向下方立方体的表面,标有蓝色十字(光标)。按住鼠标以“抓住”立方体。现在应该将立方体的拖动限制在轴上,用红色大箭头表示。” @Eliasar 我会很快再检查一遍 @SagiZiv 请参阅Compute objects moving with arrows and mouse,以防您对如何在低级 (C++/GL) 中完成工作感兴趣 【参考方案1】:

这是一种方法:

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);

【讨论】:

谢谢你的回答,我会尽快检查的 此代码运行良好,非常感谢您的帮助

以上是关于使用鼠标光标在特定轴上拖动 3D 对象的主要内容,如果未能解决你的问题,请参考以下文章

threeJS 导入模型(不确定尺寸)后如何确定相机位置及物体缩放比例

拖动桌面文档时更改鼠标光标

如何在 QML 中设置鼠标光标位置

处理拖动(来自 DragOver 事件)时是不是可以更改鼠标光标? [复制]

即使光标移出影片后仍继续跟踪鼠标拖动事件

通过拖动鼠标滚动图像