最近遇到一个相机旋转约束问题
本来想直接比较欧拉值解决,但是欧拉角的值是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
测试用例:
类似的问题有很多,但大多可以直接写死数值判断
时间: 2024-11-03 22:41:12