码迷,mamicode.com
首页 > 其他好文 > 详细

一个硬写的旋转约束问题解决

时间:2016-02-28 12:29:58      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

 

最近遇到一个相机旋转约束问题

技术分享

 

本来想直接比较欧拉值解决,但是欧拉角的值是0-360的区间,比如当前角度是1,范围是350-10,就会出错。需要做环形范围的判断

当然也可以转换成向量来比较,但那样计算太昂贵了

 

也就是说需要写一个环形区间的clamp,类似下面这张图

技术分享

 

 

数学不好,直接硬写:

技术分享
public static float AngleClamp(float min, float max, float value)
{
    if (min > max && (value < max || value > min))
    {
        return value;
    }

    if (value > min && value < max)
    {
        return value;
    }

    value = value == 0 ? 360 : value;
    min = min == 0 ? 360 : min;
    max = max == 0 ? 360 : max;

    var a1 = 360 - value + min;
    var b1 = Math.Abs(min - value);
    var c1 = a1 < b1 ? a1 : b1;

    var a2 = 360 - value + max;
    var b2 = Math.Abs(max - value);
    var c2 = a2 < b2 ? a2 : b2;

    if (c1 < c2)
    {
        if (value < min || value > max)
        {
            return min;
        }
    }
    else
    {
        return max;
    }

    return float.NaN;
}
AngleClamp

 

测试用例:

技术分享

 

类似的问题有很多,但大多可以直接写死数值判断

一个硬写的旋转约束问题解决

标签:

原文地址:http://www.cnblogs.com/hont/p/5224243.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!