U3D-根据两2D向量,求最小夹角

备注

由于Mathf.DeltaAngle求不出想要的两angle之间的最小夹角(我觉得很有可能是自己不熟悉该API,使用姿势不对导致),所以自己写法用

代码

// author   :   jave.lin
// date     :   2018-02-01

public const float ANGLE_90 = Math.PI / 2;
public const float ANGLE_N90 = -ANGLE_90;

private float getMinDeltaAngle( Vector2 moveOffset, Vector2 faceOffset )
{
    var moveAngle = Mathf.Atan2( moveOffset.y, moveOffset.x );
    var faceAngle = Mathf.Atan2( faceOffset.y, faceOffset.x );

    var moveLeftOffset = new Vector2( -moveOffset.y, moveOffset.x );
    var moveRightOffset = new Vector2( moveOffset.y, -moveOffset.x );

    var ret = moveAngle;
    if ( faceOffset.x != 0 || faceOffset.y != 0 )
    {
        ret = faceAngle;
        if ( moveOffset.x != 0 || moveOffset.y != 0 )
        {
            var cross = moveOffset.x * faceOffset.y - moveOffset.y * faceOffset.x;
            if ( cross < 0 )
            {
                var cross1 = moveRightOffset.x * faceOffset.y - moveRightOffset.y * faceOffset.x;
                if ( cross1 < 0 )
                {
                    ret = ( ANGLE_N90 + Mathf.Asin( cross1 ) );
                }
                else
                {
                    ret = Mathf.Asin( cross );
                }
            }
            else
            {
                var cross1 = moveLeftOffset.x * faceOffset.y - moveLeftOffset.y * faceOffset.x;
                if ( cross1 > 0 )
                {
                    ret = ( ANGLE_90 + Mathf.Asin( cross1 ) );
                }
                else
                {
                    ret = Mathf.Asin( cross );
                }
            }
        }
    }
    return ret;
}

// 应用
var deltaMinAngle = getMinDeltaAngle( move, face );
var deltaMinDegree = deltaMinAngle * Mathf.Rad2Deg;

应用

目前在测试项目中,应用于,根据move, face两方向,可选择动作状态要播放:向前,向左,向右,退后,的判断

参考

上面的代码里头大家发现有2d向量的叉乘,大家可以考考我之前写的:已知两向量,如何求其中一个向量在另一个向量的左边、还是右边

猜你喜欢

转载自blog.csdn.net/linjf520/article/details/79232869