zoukankan      html  css  js  c++  java
  • MMORPG中的相机跟随算法

    先上代码

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CameraFollow : MonoBehaviour {
        //摄像机与主角的直线距离
        public float distance = 15;
        //横向角度
        public float rot = 0;
        //纵向角度
        public float roll = 30f*Mathf.PI * 2 / 360;
        //目标物体
        public GameObject target;
        //横向旋转速度
        public float rotSpeed = 0.2f;
        //纵向旋转速度
        public float rollSpeed = 0.2f;
        //纵向角度范围
        public float maxRoll = 70f * Mathf.PI * 2 / 360;
        public float minRoll = -10f * Mathf.PI * 2 / 360;
        //鼠标滚动距离范围
        public float maxDistance = 22f;
        public float minDistance = 5f;
        //距离变化速度
        public float zoomSpeed = 0.2f;
        
        //设置相机焦点目标
        public void SetTarget(GameObject target) {
            if (target.transform.Find("cameraPoint") != null)
                this.target = target.transform.Find("cameraPoint").gameObject;
            else
                this.target = target;
        }
    
        private void Rotate() {
            float w = Input.GetAxis("Mouse X") * rotSpeed;
            rot -= w;
        }
    
        private void Roll() {
            float w = Input.GetAxis("Mouse Y") * rollSpeed * 0.5f;
            roll -= w;
            if (roll > maxRoll)
                roll = maxRoll;
            if (roll < minRoll)
                roll = minRoll;
        }
    
        private void Zoom() {
            if (Input.GetAxis("Mouse ScrollWheel") > 0) {
                if (distance > minDistance)
                    distance -= zoomSpeed;
            }
            else if (Input.GetAxis("Mouse ScrollWheel") < 0) {
                if (distance < maxDistance)
                    distance += zoomSpeed;
            }
        }
    
        private void LateUpdate () {
            if (target == null)
                return;
            if (Camera.main == null)
                return;
            Rotate();
            Roll();
            Zoom();
    
            Vector3 targetPos = target.transform.position;
            Vector3 cameraPos;
            float d = distance * Mathf.Cos(roll);
            float height = distance * Mathf.Sin(roll);
            cameraPos.x = targetPos.x + d * Mathf.Cos(rot);
            cameraPos.z = targetPos.z + d * Mathf.Sin(rot);
            cameraPos.y = targetPos.y + height;
    
            Camera.main.transform.position = cameraPos;
            Camera.main.transform.LookAt(target.transform);
        }
    
    }

    此代码使用了3D数学中的sin和cos函数

    计算了3D空间中相机与主角之间的位置关系

    使得相机可以围绕主角旋转

    从而360度无死角观察主角

    target表示主角物体

    SetTarget可以获取名为“cameraPoint”的主角物体

    Rotate()函数为相机旋转

    Roll()函数为相机上下角度调整

    Zoom()函数为相机拉近拉远

  • 相关阅读:
    【代码笔记】iOS-GCD用法
    【代码笔记】iOS-DropDownDemo-下拉按钮效果
    【代码笔记】iOS-cell自动变化大小
    【代码笔记】iOS-cell折叠
    【代码笔记】iOS-archive保存图片到本地
    【代码笔记】iOS-左右可滑动的选择条
    【代码笔记】iOS-自动成表格的效果
    【代码笔记】iOS-自定义选择框
    【代码笔记】iOS-实现网络图片的异步加载和缓存
    【代码笔记】iOS-自定义开关
  • 原文地址:https://www.cnblogs.com/fws94/p/7095547.html
Copyright © 2011-2022 走看看