• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

一个摄像机控制类的总结

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/1101/692.html

 
 
完成功用:
        经过常州手游开发鼠标的支配,控制摄像机环绕模型对象旋转,从而停止对模型对象的察看。
 
设计思绪:
        首先依据摄像机的当前方位,计算它应该抵达的目的方位;
 
        然后经过插值运算,将摄像机逐帧挪动到该目的方位。
 
过程描绘:
1、 计算摄像机的目的方位。
 
        先计算摄像机本地坐标系轴向与世界坐标系轴向的夹角,作为方位的初始值。留意,这里只取摄像机需求旋转变化的坐标轴即可,这里我们用的是X和Y轴。
 
        在鼠标的控制过程中,实时的修正此夹角值。
 
        对修正后的夹角值停止限位处置,使之满足我们的需求。
 
        将限位处置后的夹角值由欧拉角的表示方式转换到四元数的表示方式,作为摄像机的目的方位保管。
 
2、 经过在摄像机的当前方位与目的方位间做插值运算,以一定的速度将摄像机向目的方位挪动。
 
常州游戏开发培训源代码:绑定在摄像机对象之上
 
 
///
    ///旋转轴的变换组件(模型对象)
    ///
    public Transform _tfmRotAxis;
    ///
    ///摄像机的挪动缓冲
    ///
    public float _fZoomDmp = 5f;
    ///
    ///摄像机的挪动速度
    ///
    public float _fZoomRate = 240f;
    ///
    ///鼠标X方向挪动灵活度
    ///
    public float _fXSpe = 6f;
    ///
    ///鼠标Y方向挪动灵活度
    ///
    public float _fYSpe = 6f;
    ///
    ///鼠标X方向最小角度限位
    ///
    public float _fMinLimitX = -360f;
    ///
    ///鼠标X方向最大角度限位
    ///
    public float _fMaxLimitX = 360f;
    ///
    ///鼠标Y方向最小角度限位
    ///
    public float _fMinLimitY = -360f;
    ///
    ///鼠标Y方向最大角度限位
    ///
    public float _fMaxLimitY = 360f;
    ///
    ///摄像机距旋转轴的最近间隔
    ///
    public float _fMinDist = 0f;
    ///
    ///摄像机距旋转轴的最远间隔
    ///
    public float _fMaxDist = 20f;
    ///
    ///挪动的偏移量
    ///
    public Vector3 _vec3TarOffset;
//------------------------------ Private ----------------------------------
    ///
    ///摄像机的变换组件
    ///
    private Transform _tfmThis;
    ///
    ///摄像机到旋转轴的当前间隔
    ///
    private float _fCurtDist;
    ///
    ///摄像机到旋转轴的目的间隔
    ///
    private float _fTarDist;
    ///
    ///摄像机的目的朝向(方位)
    ///
    private Quaternion _quaTarRtn;
    ///
    ///摄像机X轴与世界坐标X轴的夹角
    ///
    private float _fXDgre;
    ///
    ///摄像机Y轴与世界坐标Y轴的夹角
    ///
    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();
    }
    ///
    ///鼠标滚轮控制视野的缩放
    ///
    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 个人打赏

上篇:上一篇:Cocos2d-X之触摸事情
下篇:下一篇:unity3d播放帧动画