Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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# 如何使用手指滑动沿所有3个轴旋转对象?_C#_Unity3d_Augmented Reality_Vuforia - Fatal编程技术网

C# 如何使用手指滑动沿所有3个轴旋转对象?

C# 如何使用手指滑动沿所有3个轴旋转对象?,c#,unity3d,augmented-reality,vuforia,C#,Unity3d,Augmented Reality,Vuforia,我正在开发一个简单的AR Vuforia应用程序。如何通过一个手指滑动实现对象沿所有三个轴的旋转 我当前使用的代码有一个bug:对象的旋转取决于其局部轴。例如,如果我从前面看对象,一切正常,但如果我从后面看对象,手指向上滑动使其向下旋转,反之亦然 以下是脚本: public float rotSpeed = 30f; void OnMouseDrag() { float rotX = Input.GetAxis("Mouse X")*rotSpeed*Mathf.Deg2Rad; float

我正在开发一个简单的AR Vuforia应用程序。如何通过一个手指滑动实现对象沿所有三个轴的旋转

我当前使用的代码有一个bug:对象的旋转取决于其局部轴。例如,如果我从前面看对象,一切正常,但如果我从后面看对象,手指向上滑动使其向下旋转,反之亦然

以下是脚本:

public float rotSpeed = 30f;

void OnMouseDrag()
{
float rotX = Input.GetAxis("Mouse X")*rotSpeed*Mathf.Deg2Rad;
float rotY = Input.GetAxis("Mouse Y")*rotSpeed*Mathf.Deg2Rad;

transform.Rotate(Vector3.up, -rotX);
transform.Rotate(Vector3.right, -rotY);
} 
这不是我所需要的,我如何根据手指滑动方向旋转对象,而不管我从哪个角度看它

更新 一个简单的非AR示例,可以帮助您理解我需要的是一款iOS游戏“太空前沿2”。火箭成功发射后,它降落在行星上,你可以用手指滑动行星


这是视频演示:

我现在没有确切的代码

但是,如果没有更新视点坐标,这应该是预期的结果

考虑一个有两种颜色的真实球,蓝色和红色,垂直分开。 当你在它前面时,只看到蓝色的一面,向上抚摸它会使蓝色的一面向上,红色的一面从底部出现。 现在移动到它的后面,只看到红色的一面,然后再次向上抚摸它。 蓝色的脸将向下,并从底部出现。 Unity将物理应用于虚拟对象,就像我们与真实对象交互一样

因此,当你应用相机的位置时,你需要考虑物体的方位。 您需要根据与对象原点方向相关的摄影机位置,将变换矩阵应用于移动


我希望这足够清楚,可以让你走上正轨来修复它。

我认为你必须以某种方式夹紧旋转,以获得所需的行为。我最近写了一个脚本就是为了做到这一点。不过我做了一点修改

public float rotSpeed = 30f;

float ClampAngle(float _angle, float _min, float _max)
{
    if (_angle < 0f) _angle = 360 + _angle;
    if (_angle > 180f) Mathf.Max(_angle, 360 + _min);
    return Mathf.Min(_angle, _max);
}

看看这是否有效,当然,尝试使用这些值。

无论对象的旋转如何,也不管相机相对于对象的位置如何,这都很有效:

public float rotSpeed = 30f;

void OnMouseDrag()
{
    float rotX = Input.GetAxis("Mouse X") * rotSpeed;
    float rotY = Input.GetAxis("Mouse Y") * rotSpeed;

    Camera camera = Camera.main;

    Vector3 right = Vector3.Cross(camera.transform.up, transform.position - camera.transform.position);
    Vector3 up = Vector3.Cross(transform.position - camera.transform.position, right);

    transform.rotation = Quaternion.AngleAxis(-rotX, up) * transform.rotation;
    transform.rotation = Quaternion.AngleAxis(rotY, right) * transform.rotation;
}

确保您的相机带有“Main camera”标签,或在必要时从外部指定相机。

因此,我想到了一个问题-您希望如何通过作用在物体上的单个力来实现力?要在多个轴上完成移动,我们需要多个力,例如,1个模拟力(可能使用设备的旋转/倾斜/方向/指南针方向?)和单指滑动。想想物理物体——如果我抓起现在放在桌子上的手机,沿着X轴移动它(例如,平行于我的桌子,甚至是对角线)——直到我开始扭动手腕,它才使用第三轴;加上那个额外的动作。@KasemO感谢你们提出了一个有趣的想法,尽管我不能说你们已经完全理解了。我不需要移动手机来旋转屏幕上的对象,因为这是一个AR应用程序,用户将在标记上查看3D模型。我在视频演示中添加了一个小的UPD,这可能会帮助您理解我的意思。再次感谢你们!你试过我的答案了吗?它结构紧凑,在任何情况下都能工作。@ThomasHilbert非常感谢,它工作得非常完美!这听起来像是我需要的,谢谢!如果您能将代码添加到您的答案中,以便我可以对其进行测试,我将不胜感激。另外,我在问题描述中添加了一个小的UPD,作为示例可能也很有用。我还添加了一个视频演示作为示例。请看一下DMGregory在这个链接中给出的非常好的答案/解释谢谢您提供了一个有趣的示例,我尝试调用RotateGameObject()函数OnMouseDrag(),它的工作方式有点奇怪——在手指滑动过程中,对象的旋转多次“跳跃”到默认状态。如果我用错了,请告诉我。还是很有趣的代码,我可以从中学到很多,谢谢!非常感谢,这段代码真的很棒!我将在21小时内颁发赏金。
public float rotSpeed = 30f;

void OnMouseDrag()
{
    float rotX = Input.GetAxis("Mouse X") * rotSpeed;
    float rotY = Input.GetAxis("Mouse Y") * rotSpeed;

    Camera camera = Camera.main;

    Vector3 right = Vector3.Cross(camera.transform.up, transform.position - camera.transform.position);
    Vector3 up = Vector3.Cross(transform.position - camera.transform.position, right);

    transform.rotation = Quaternion.AngleAxis(-rotX, up) * transform.rotation;
    transform.rotation = Quaternion.AngleAxis(rotY, right) * transform.rotation;
}