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

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

本来想直接比较欧拉值解决,但是欧拉角的值是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

一个硬写的旋转约束问题解决的相关文章

摄像机旋转约束问题及解决

去年2月份写过一个旋转约束的解决方法,不过是硬算的,今天无意中在论坛发现了一个解决方法 if (euler.x > 180) euler.x -= 360; if (euler.x < -180) euler.x += 360; 这样就可以保证旋转区间可比较 具体代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestCamera : MonoBe

开源一个C#写的Android和IOS都能跑的 打击感强的RPG玩玩。

不废话直接上图 关于下载和打开 没错,我强调过很多次的,Unity3D开发的.  如果你还不懂Unity3D 的基本开发套路,如何打开Unity如何安装Unity这些问题.我建议你先不要索要源代码. 下载后,直接打开这个工程......  然后打开根目录下载ManTuLanSi这个Scence  ,如果你是用PC,就可以按  ASDW开前  来控制前后左右.痛快的打一下怪吧. 源代码齐全吗?? 因为美术资源是别人的,所以实际源代码会有部分美术资源替换了.不过,代码还是这份代码.完全没变. 能商用

分享一个近期写的简单版的网页采集器

分享一个近期写的简单版的网页采集器 功能特点: 1.可通过配置,保存采集规则. 2.可通过采集规则,进行数据采集. 3.可分页,分关键字,进行采集. 4.可保存数据至数据库,文本中. ........... 功能还比较简单,喜欢深入的可以继续深入下去,暂时还没有登录的功能,因为登录功能涉及到的范围比较广,待日后慢慢研究后再开发. 我先上个图让大家一睹为快吧: 首先看看页面,我们要采集这个网站的文章 接下来,首先是查找分页,获得分页里面的文章链接,接着查找内容页需要采集的字段,生成规则,进行采集.

你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写

思路:java.util.concurrent.locks包下面ReadWriteLock接口,该接口下面的实现类ReentrantReadWriteLock维护了两个锁读锁和解锁,可用该类实现这个功能,很简单 import java.util.Date; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /**  * 你需要实现一个

SpringMVC实现一个controller写多个方法

MultiActionController与ParameterMethodNameResolver在一个Controller类中定义多个方法,并根据使用者的请求来执行当中的某个方法,相当于Struts的DispatcherAction.使用MultiActionController需要配个MethodNameResolver实例,默认使用ParameterMethodNameResolver,他会根据所给的网址中,最后请求的文件名称来判断执行Controller中的哪一个方法 1.控制器类继承M

分享一个C++写的远程控制木马:Gh0st_VS2010直接编译

经过修改VS2010已经可以直接编译了,之前做了360等主流的免杀现在已经失效了 放出代码给需要的朋友学习,请勿用作非法用途 代码下载地址如下: 链接: http://pan.baidu.com/s/1sjwhh8L  密码: rc6f 编译后有3个文件,运行Gh0st.exe就行了,运行以后配置好,可以生成被控端,运行以后自动删除自己的exe,开机启动服务等--至于使用教程百度很多,自己找一找吧 解压密码在: http://www.bcwhy.com/thread-21884-1-1.html

TinyWS —— 一个C++写的简易WEB服务器(三)

写在前面 代码已经托管在 https://git.oschina.net/augustus/TinyWS.git 可以用git clone下来.由于我可能会偶尔做一些修改,不能保证git 库上的代码与blog里的完全一致(实际上也不可能把所有的代码都贴在这里).另外,TinyWS是基于linux写的(ubuntu 14.10 + eclipse luna,eclipse工程我也push到了git库),故在Windows上可能无法正常编译(主要是系统调用 部分可能会不同). 前面的内容可参考上一篇

开源一个自己写的APP:装哔指南-记车标

想想我做安卓开发到现在也快两年了,所在的公司基本都是在做企业内部应用,自己每次做的一些小应用,都是做到一半或者快完成的时候放着积灰了.感觉很没有成就感啊!这两天心血来潮写了一个小应用:装哔指南-记车标 ,(花了两天,其中一天在搜集车标数据弄数据库 0.0 )顺便发出来给一些新手们学习学习(我也新手=.=   大神请绕道.) 下面简单介绍一下应用里面用到的知识点: 1. android SQLite 的简单使用. 2. listview和gridview 配合 BaseAdapter的使用方法.

分享一个自己写的.Net的ORM工具

注册博客园帐号也有好几年了,之前注册帐号主要是为了看别人的文章下载东西的时候方便.从来没有写过什么博客,一直以为只要注册了帐号就可以写博客,最近用到了才发现还得申请一下,于是就申请了博客,算了也不扯这么多没用的了,直接进入主题吧! 网上开源的ORM工具也不少,开源中国上就有不少,很多都下载试用过,不过感觉用起来都不是很方便,园子里面也有不少人分享自己写的ORM工具,用过一个叫 MySoft.Data 的ORM工具,感觉里面的链式调用函数的写法不错,但是用起来感觉也有些不如意的地方,于是某个周末的