Unity3D 自由视角代码之解析
来源:互联网 发布:淘宝卖家怎么上架商品 编辑:程序博客网 时间:2024/06/05 17:22
效果:实现对物体的自由视角观察
本代码是《Unity3D游戏开发》一书中,7-11的例子,其中有几处注释是我个人的分析
using UnityEngine;using System.Collections;public class NewBehaviourScript : MonoBehaviour {//摄像机参照的模型public Transform target;//摄像机距离模型的默认距离public float distance = 20.0f;//鼠标在x轴和y轴方向移动的速度float x;float y;//限制旋转角度的最小值与最大值float yMinLimit = -20.0f;float yMaxLimit = 80.0f;//鼠标在x和y轴方向移动的速度float xSpeed = 250.0f;float ySpeed = 120.0f;// Use this for initializationvoid Start () {//初始化x和y轴角度,使其等于参照模型的角度Vector2 Angles = transform.eulerAngles;x = Angles.y;y = Angles.x;if (gameObject.GetComponent<Rigidbody>() != null) {gameObject.GetComponent<Rigidbody>().freezeRotation = true;}//Debug.Log (this.transform == this.gameObject.transform);}void LateUpdate(){if(target){//我的分析:1.根据垂直方向的增减量修改摄像机距离参照物的距离distance += Input.GetAxis("Vertical");//根据鼠标移动修改摄像机的角度x += Input.GetAxis ("Mouse X") * xSpeed * 0.02f;y -= Input.GetAxis ("Mouse Y") * ySpeed * 0.02f;//我的分析:2.这句相当于限制了摄像机在X轴方向上的视觉范围y = ClampAngle(y, yMinLimit, yMaxLimit);//我的分析:3.刚开始我还在纠结为什么将y作为X轴的旋转角度量,将x作为Y轴的角度旋转量。但仔细一想,这里的x和y分别就指的是鼠标水平方向和垂直方向的移动量,对应的不就刚好是y轴方向的转动与x轴方向的转动么,哈哈Quaternion rotation = Quaternion.Euler (y,x,0);//我的分析:4.这一句就比较有意思了,后面详解Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;Debug.Log (position.ToString());//设置摄像机的位置与旋转transform.rotation = rotation;transform.position = position;}}float ClampAngle(float angle, float min, float max){//我的分析:5.这里之所以要加360,因为比如-380,与-20是等价的if(angle < -360){angle += 360;}if (angle > 360) {angle -= 360;}return Mathf.Clamp (angle, min, max);}// Update is called once per framevoid Update () {}}
以上我的分析部分作出以下解释:
请看行号:35 ------> 1.这个例子是固定的Distance,但明显在操作的时候,是希望可以自己调节的拉近的,就可以采用↑ ↓来控制远近;
请看行号:40 ------>2.至于为什么角度要限制在-20到80度之间,请看图:
摄像机从正方移到俯视角度观察,请看咖啡色的线,就是80°,那为什么是正80°呢?请看银灰色的虚线,这个银灰色的虚线箭头是那根咖啡色的箭头的平行线,也就是说,其实摄像机是顺时针旋转了80°,当然是正了。
同理,橙色的线代表了摄像机转为仰视坦克的极限位置,黄色虚线是对橙色的箭头做了平行,也就是逆时针20°,当然是负了。
这就是[80°,-20°]的来源。
这样也是因为这个自由视角的的设定是:x轴上的旋转小于100°就够了,如果超过了100°,摄像机就是反的了没有意义。如果想看坦卡另外一边,通过旋转Y轴绕到另一边查看即可。
请看行号:45 ------> 4.Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;
这一句是为了算出来当前摄像机的位置;
分析有两点:1)保证摄像机与目标的距离为distance,
2) 保证摄像机面向目标
1)的思路很简单,就是从目标位置(target.position)加上相机距离目标的向量,就是相机的位置;
2)怎么让相机面向目标?关键就在于-distance的这个负号!!!
我把这个是这样理解的;
请看图:
从图中我们可以看到,如果想让摄像机面向目标,也就是target.position - camera.position ,那么z方向就是-20.
这样达到的效果就是:如果水平方向移动鼠标,相机一直绕着坦克转:
那么我很好奇,如果distance是正的呢?
就是上面的效果,相机一直别想看到坦克了
- Unity3D 自由视角代码之解析
- Unity3D游戏开发之自由视角下的角色控制
- Unity3D游戏开发之自由视角下的角色控制
- [Unity3D]Unity3D游戏开发之自由视角下的角色控制
- 【Unity3D自学记录】Unity3D游戏开发之自由视角状态下的角色控制(二)
- 【Unity3D自学记录】Unity3D游戏开发之自由视角状态下的角色控制(一)
- Unity3D自带Mouse Look鼠标视角代码解析。
- Unity3D游戏开发之自由视角状态下的角色控制
- Unity3D游戏开发之自由视角状态下的角色控制(二)
- 【Unity3D游戏开发学习笔记】(七)上帝之眼—第三人称摄像机的简单实现(跟随视角,自由视角)
- D3D11 自由视角相机
- unity3d超简单的自由移动代码
- OpenGL实现3D模型自由旋转——之代码解析
- Unity3D工程生成代码解析
- 无锁定自由视角Camera控制器
- 自由视角摄像机,实现旋转,缩放
- [unity3d]第三人称视角相关脚本
- Unity3D:摄像头主角视角追踪
- jquery限制复选框个数最多为3个
- Bitcode适配指南
- 欢迎使用css3
- python爬虫学习记录之报错及解决方案
- (九)Swift StatusBar 状态栏
- Unity3D 自由视角代码之解析
- EXT4文件系统 mount 参数翻译
- App审核指南丨AppStore被拒理由大全
- ViewPager 3D翻转
- Eclipse:带库文件、自定义控件的Android项目修改包名,绝对管用简单!
- 高斯消元应用 开关问题
- android.view.InflateException: Binary XML file line #10: Error inflating class fragment
- Java Cache系列之Cache概述和Simple Cache
- java向oracle中存取图片