一个摄像机控制类的总结

来源:互联网 发布:mac 编译安装php 编辑:程序博客网 时间:2024/06/02 02:51

一个摄像机控制类的总结


实现功能:

        通过鼠标的操纵,控制摄像机环绕模型对象旋转,从而进行对模型对象的观察。

 

设计思路:

        首先根据摄像机的当前方位,计算它应该到达的目标方位;

        然后通过插值运算,将摄像机逐帧移动到该目标方位。

 

过程描述:

1、 计算摄像机的目标方位。

 

        先计算摄像机本地坐标系轴向与世界坐标系轴向的夹角,作为方位的初始值。注意,这里只取摄像机需要旋转变化的坐标轴即可,这里我们用的是X和Y轴。

 

        在鼠标的控制过程中,实时的修改此夹角值。

 

        对修改后的夹角值进行限位处理,使之满足我们的需要。

 

        将限位处理后的夹角值由欧拉角的表示形式转换到四元数的表示形式,作为摄像机的目标方位保存。

      

2、 通过在摄像机的当前方位与目标方位间做插值运算,以一定的速度将摄像机向目标方位移动。

 

源代码:绑定在摄像机对象之上



///<summary>    ///旋转轴的变换组件(模型对象)    ///</summary>    public Transform _tfmRotAxis;    ///<summary>    ///摄像机的移动缓冲    ///</summary>    public float _fZoomDmp = 5f;    ///<summary>    ///摄像机的移动速度    ///</summary>    public float _fZoomRate = 240f;    ///<summary>    ///鼠标X方向移动灵敏度    ///</summary>    public float _fXSpe = 6f;    ///<summary>    ///鼠标Y方向移动灵敏度    ///</summary>    public float _fYSpe = 6f;    ///<summary>    ///鼠标X方向最小角度限位    ///</summary>    public float _fMinLimitX = -360f;    ///<summary>    ///鼠标X方向最大角度限位    ///</summary>    public float _fMaxLimitX = 360f;    ///<summary>    ///鼠标Y方向最小角度限位    ///</summary>    public float _fMinLimitY = -360f;    ///<summary>    ///鼠标Y方向最大角度限位    ///</summary>    public float _fMaxLimitY = 360f;    ///<summary>    ///摄像机距旋转轴的最近距离    ///</summary>    public float _fMinDist = 0f;    ///<summary>    ///摄像机距旋转轴的最远距离    ///</summary>    public float _fMaxDist = 20f;    ///<summary>    ///移动的偏移量    ///</summary>    public Vector3 _vec3TarOffset;//------------------------------ Private ----------------------------------    ///<summary>    ///摄像机的变换组件    ///</summary>    private Transform _tfmThis;    ///<summary>    ///摄像机到旋转轴的当前距离    ///</summary>    private float _fCurtDist;    ///<summary>    ///摄像机到旋转轴的目标距离    ///</summary>    private float _fTarDist;    ///<summary>    ///摄像机的目标朝向(方位)    ///</summary>    private Quaternion _quaTarRtn;    ///<summary>    ///摄像机X轴与世界坐标X轴的夹角    ///</summary>    private float _fXDgre;    ///<summary>    ///摄像机Y轴与世界坐标Y轴的夹角    ///</summary>    private float _fYDgre; void Awake()    {        // cache        _tfmThis = transform;         _fCurtDist = Vector3.Distance(_tfmThis.position, _tfmRotAxis.position );        _fTarDist = _fCurtDist;         // 在世界坐标系之下,计算摄像机本地坐标系各坐标轴        // 与世界坐标系各坐标轴的夹角        _fXDgre = Vector3.Angle(Vector3.right, _tfmThis.right );// X轴夹角        _fYDgre = Vector3.Angle(Vector3.up, _tfmThis.up );// Y轴夹角    }     void LateUpdate()    {        // 检测鼠标右键按下        if ( Input.GetMouseButton( 1 ) ) {             // 计算当前的轴向夹角            _fXDgre += Input.GetAxis("Mouse X" ) * _fXSpe;            _fYDgre -= Input.GetAxis("Mouse Y" ) * _fYSpe;            // 对夹角进行限位处理            _fXDgre = Mathf.Clamp(_fXDgre, _fMinLimitX, _fMaxLimitX );            _fYDgre = Mathf.Clamp(_fYDgre, _fMinLimitY, _fMaxLimitY );            // 计算目标朝向(方位)            _quaTarRtn = Quaternion.Euler( _fYDgre, _fXDgre, 0 );            // 插值运算            _tfmThis.rotation = Quaternion.Lerp( _tfmThis.rotation, _quaTarRtn,_fZoomDmp *Time.deltaTime );        }         ScrollWheelCtrl();    }    ///<summary>    ///鼠标滚轮控制视野的缩放    ///</summary>    private void ScrollWheelCtrl()    {        _fTarDist -= Input.GetAxis("Mouse ScrollWheel" ) * _fZoomRate*Time.deltaTime;         _fTarDist = Mathf.Clamp(_fTarDist, _fMinDist, _fMaxDist );         _fCurtDist = Mathf.Lerp(_fCurtDist, _fTarDist, _fZoomDmp *Time.deltaTime);         _tfmThis.position =_tfmRotAxis.position - ( _tfmThis.rotation *Vector3.forward* _fCurtDist + _vec3TarOffset );    }


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 爱用商城发货没有物流信息怎么办 拼多多的快递的运单号发错了怎么办 追光娱乐账号被别人盗用了怎么办啊 用鲁大师检测硬盘出现损坏怎么办 客户拖款迟迟不给给怎么办 百度云盘文件密码忘记了怎么办 用来注册亚马逊的公司注销了怎么办 亚马逊中国卖家太多美国卖家怎么办 付款了!卖家不想卖了怎么办? 手机通讯录同步助手密码忘了怎么办 毕业生学位信息照片上传错了怎么办 报名计算机二级照片上传很慢怎么办 网上报名时照片上传错了怎么办 特岗教师报名时照片上传模糊怎么办 百家号申请过新手被拒绝三次怎么办 6岁儿童个子高不长肉体形瘦怎么办 网页游戏加载完毕卡了不动怎么办 小番茄未成熟下面就坏掉是怎么办 千牛快捷短语界面变得好宽怎么办 申请大王卡手机号填错了怎么办 别人盗用我手机号申请微信号怎么办 淘宝支付宝里没钱了买家退款怎么办 如果外包把员工社保忘交了怎么办 外包工人没有和包工头的证据怎么办 试用期辞职公司给交的社保怎么办 单位给交员工不想交社保怎么办 淘宝收不到卖家的信息怎么办 不小心把微信聊天记录删掉了怎么办 不小心把打印机驱动删除了怎么办 蓝牙不小心点到忽略此设备怎么办 千牛工作台无线开店确认不了怎么办 开通诚信通后营业执照注销了怎么办 淘宝标的货跟发的不一样怎么办 wps表格里单元之间重叠了怎么办 淘宝店铺停了一段时间没了怎么办 转转买家收货为敲诈卖家怎么办 淘宝被投诉盗用官网图片怎么办 淘宝订单买下后卖家告知无货怎么办 盗图被删除还是待处理违规该怎么办 如果买家说你们的买家秀一样怎么办 花呗唤起安全核身验证失败怎么办