C# 从手势决定是顺时针旋转还是顺时针旋转,3个有序采样点

C# 从手势决定是顺时针旋转还是顺时针旋转,3个有序采样点,c#,unity3d,rotation,C#,Unity3d,Rotation,用户从A开始,通过unity3d中的(通过)B(屏幕上的采样点)移动到C。在这一点上,我已经计算了角度(θ),在两幅图像中几乎都是45度(几乎)。问题是我想得出结论,在左边的图像中,用户打算逆时针运动,在右边的图像中,用户打算顺时针旋转。 啊,这真的比我想象的复杂,请建议 目前的统一代码是 protected void calcAngles(){ v1 = go2.position - go1.position; v2 = go3.position - go1.posit

用户从A开始,通过unity3d中的(通过)B(屏幕上的采样点)移动到C。在这一点上,我已经计算了角度(θ),在两幅图像中几乎都是45度(几乎)。问题是我想得出结论,在左边的图像中,用户打算逆时针运动,在右边的图像中,用户打算顺时针旋转。 啊,这真的比我想象的复杂,请建议

目前的统一代码是

    protected void calcAngles(){
    v1 = go2.position - go1.position;
    v2 = go3.position - go1.position;
    v3 = go3.position - go2.position;
    float angle = Vector3.Angle (v2, v1);
    Debug.Log ("angle:" + angle.ToString ());
    //float atan = Mathf.Atan2 (Vector3.Dot (v3, Vector3.Cross (v1, v2)), Vector3.Dot (v1, v2)) * Mathf.Rad2Deg;
    //Debug.Log ("atan2:" + atan.ToString ());
}

有什么想法吗。?psudo代码。?非常感谢。干杯,拉拉。我以前的回答完全错了。向量3.Angle似乎总是给出一个无符号的角度。但我们需要这个符号来理解是顺时针还是逆时针旋转

现在,这段代码将给出两个向量之间的有符号角度。正常的参数应该是你想考虑的平面的常态。< /P>
   float SignedAngle(Vector3 from, Vector3 to, Vector3 normal){

        float angle = Vector3.Angle(from,to);
        float sign = Mathf.Sign(Vector3.Dot(normal, Vector3.Cross(from,to)));
        float signed_angle = angle * sign;

        return signed_angle;
    }

要做到这一点非常困难

这可能有助于

private float bestKnownXYCWAngleFromTo(Vector3 a, Vector3 b)
// the best technology we have so far
    {
    a.z = 0f;
    b.z = 0f;

    float __angleCCW = Mathf.Atan2(b.y, b.x) - Mathf.Atan2(a.y, a.x);
    if ( __angleCCW < 0f ) __angleCCW += (2.0f * Mathf.PI);

    float __angleCWviaatan = (2.0f * Mathf.PI) - __angleCCW;
    __angleCWviaatan = __angleCWviaatan * (Mathf.Rad2Deg);

    if ( __angleCWviaatan >= 360.0 ) __angleCWviaatan = __angleCWviaatan-360.0f;

    return __angleCWviaatan;
    }
private float bestKnownXYCWAngleFromTo(向量3 a、向量3 b)
//迄今为止我们拥有的最好的技术
{
a、 z=0f;
b、 z=0f;
浮动角CCW=数学Atan2(b.y,b.x)-数学Atan2(a.y,a.x);
如果(uuu angleCCW<0f)uuu angleCCW+=(2.0f*Mathf.PI);
浮点数uuu anglecwviatan=(2.0f*Mathf.PI)uuu angleCCW;
__角度=角度*(数学Rad2Deg);
如果(\uuuuu anglecwviatan>=360.0)\uuuuu anglecwviatan=\uuuuuu anglecwviatan-360.0f;
返回uuu anglecwaatan;
}
请注意,这是一个二维概念,可以根据需要进行修改

请注意,“a”显然只是你的(b-a),“b”只是你的(c-a)


请注意,真实手势识别是一个非常先进的研究领域。我鼓励你拿出一个解决方案


这代表了工程师几十年的努力。PDollar非常棒(在资产存储上实现甚至是免费的!)

如果你不打算构建群组模拟器(因为这会有点重),你可以使用2个helper变换作为a的子对象。它们在局部空间中的位置为0,0,0。一个是使用LookAt(B),另一个是使用LookAt(C)。然后你可以只取它们的Y-euler角之间的差。这会告诉你是需要顺时针旋转还是逆时针旋转。“人群模拟器”你指的是什么,尼卡?从红色到绿色的方向很简单。它只是红色减去绿色。看是不相关的。用于实际扭曲
变换
。为了简单地得到方向,你只需要减去位置,也许。normalizeno,Vector3。Angle总是返回小于180度的正角度。我想说的是非常感谢,这真的很有意义。这是一个详细的想法,有参考资料和主要方程式要决定。只是等待更多的问题,伙计!!你可以在这里给他们打旗子