Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用鼠标光标在特定轴上拖动三维对象_C#_Unity3d_Math_Draggable - Fatal编程技术网

C# 使用鼠标光标在特定轴上拖动三维对象

C# 使用鼠标光标在特定轴上拖动三维对象,c#,unity3d,math,draggable,C#,Unity3d,Math,Draggable,我正在尝试构建一个简单的游戏,用户可以在其中放置一些元素并移动它们 我想要的是给用户一个选项,根据他/她的决定在特定轴上移动对象 很像unity中的运动gizmo 我知道如何使用鼠标拖动世界上的对象,但如何在特定轴(例如Z轴)上移动 我试图读取“鼠标X”值,但它只在特定的视角下工作,如果我从不同的角度观察对象,对象将无法正确移动 我所做的是: private void OnMouseDrag() { transform.Translate(moveAxis * Input.GetAxis(

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

我想要的是给用户一个选项,根据他/她的决定在特定轴上移动对象

很像unity中的运动gizmo

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

我试图读取“鼠标X”值,但它只在特定的视角下工作,如果我从不同的角度观察对象,对象将无法正确移动

我所做的是:

private void OnMouseDrag()
{
   transform.Translate(moveAxis * Input.GetAxis("Mouse X");
}
其中
moveAxis
是一个表示轴的
Vector3
,脚本附加到箭头gizmo。

这里有一种方法:

moveAxis
方向从本地空间转换为屏幕空间。确保您有一个缓存的
Camera
字段/变量,因为调用
Camera.main
和/或
GetComponent
是一个缓慢的操作:

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

@Eliasar的可能副本此示例根本不使用鼠标光标您的问题是关于单击并拖动对象或将其约束到某个轴的能力?链接的问题实际上提到了点击拖动场景:“想象一下,将相机指向下方立方体的正面,用蓝色十字(光标)标记。按住鼠标“抓取”立方体。立方体的拖动现在应该约束到轴上,用红色大箭头表示。”@Eliasar我会再检查一遍soon@SagiZiv如果您对如何在低级(C++/GL)中完成事情感兴趣,请参阅。谢谢您的回答,我会尽快检查。此代码运行良好,非常感谢您的帮助