Unity中镜头的控制

2022-10-22

虚拟现实技术经过这几年的发展, 已经日益成熟。涉及的领域包含各个教育、艺术、医疗、制造、房地产等。例如在房地产开发中, 通过虚拟现实可以让在虚拟空间内创造世界, 不管是内在装饰还是外部环境亦或者是小小的桌面摆件, 都对其进行了1:1还原, 逼真的纹理和色彩, 同时场景里面拥有真实的声光效果、水流的溅射等。在VR场景里通过空间视觉、听觉返汇和动作交互使用户仿佛置身真实的世界。这就要对开发者提出更高的要求, 用户进入Unity开发的样板房时, 如何控制镜头, 就成为我们的首要任务, 下列简单阐释下基本流程

一、首先为Unity设置初始值

GameObject targets;//相机跟随的目标

bool isRotate=false;//用来验证是否旋转视野

public Vector3 offset;//目标位置与摄像机的偏移

public float distance;//目标和摄像机的距离

public float scrollSpeed=10;//鼠标滚轮速度

public float rotateSpeed=1;//旋转的速度

二、设置Star () , 用于游戏对象的初始化, 在Awake函数之后执行, 只执行一次

targets=GameObject.FindGameObjectWithTag (“Player”) ;//查找标签为Player的游戏对象

transform.LookAt (targets.transform) ;//摄像机看向目标

offset=transform.position-targets.transform.position;//offset存储的就是目标与摄像机的距离, 只是以向量的表现存在, 用Vector3.magnitude可以转化成长度

三、设置LateUpdate () , 在Update函数之后调用, 一般用作摄像机跟随

transform.position=targets.transform.position+offset;

RotateView () ;//先进行旋转

ScrollView () ;//再进行视野缩放, 因为offset被旋转重置了, 而滑动是根据offset来计算的, 所以先旋转后滑动

四、ScrollView () , 定义一个函数, 实现滚轮

用这个方法的原理是通过移动摄像机的位置来实现镜头的放大和缩小的, 而不是通过摄像机身上的fieldOfView

用为如果用fieldOfView的话缩小到后面会出现奇怪的现象

distance=offset.magnitude;//将向量形式的摄像机和目标的距离转化成以长度表示的距离

distance+=Input.GetAxis (“Mouse ScrollWheel”) *-scrollSpeed;//获取滚轮的滚动并添加到距离中

if (distance>3&&distance<15) //控制放大和缩小的范围

{

offset=offset.normalized*distance;//将距离向量归一化的意义是为了等比例减小数值的大小, 实现慢慢改变距离, 然后再乘上滚轮的输入和倍数

}

五、RotateView () , 该函数实现镜头旋转

if (Input.GetMouseButtonDown (1) ) //如果按下了鼠标右键

{

isRotate=true;

}

if (Input.GetMouseButtonUp (1) ) //如果松开鼠标右键

{

isRotate=false;

}

if (isRotate)

{

transform.RotateAround (targets.transform.position, targets.transform.up, Input.GetAxis (“Mouse X”) *rotateSpeed) ;//让本身围绕着目标旋转, 方向是目标的Y轴, 角度是获取输入的鼠标X轴的值

Vector3 originPosition=transform.position;//保存当前相机的位置

Quaternion originRotation=transform.rotation;//保存当前相机的旋转transform.RotateAround (targets.transform.position, transform.right, -Input.GetAxis (“Mouse Y”) *rotateSpeed) ;//围绕目标旋转, 旋转的轴为自身的X轴, 角度是获取输入的鼠标X轴的值旋转后会改变相机的位置和旋转

float x=transform.eulerAngles.x;//获取相机的X旋转大小

if (x<10||x>80) //如果超过了80度或者旋转小于10度

{

transform.positio n=originPosition;//将改变的位置和旋转还原到改变前的状态

transform.rotation=originRotation;

}

}

offset=transform.position-targets.transform.position;//跟新偏移

六、结束语

本范例基本可以满足开发者的需求, 但是还能够有更好的效果, 希望与君探讨。

摘要:虚拟现实技术已经涉及到人们工作生活的各个层次, unity作为开发VR的主要软件在其中起到重要的作用, 其中镜头摄像机的控制是其中一个重要环节, 本文将对此进行简要说明

关键词:VR,UNITY,旋转,偏移,速度

参考文献

[1] 优美缔软件有限公司. Unity 5.X从入门到精通[M].太原:中国铁道出版社, 2015.

[2] 吴亚峰, 于复兴.Unity 3D游戏开发技术详解与典型案例[M].北京:人民邮电出版社, 2012.

[3] 郭东方.基于Unity3D坦克战争游戏的设计与实现[D].石家庄:河北科技大学, 2018.

上一篇:有机半导体:为碳电子时代绘美景下一篇:BMCVR600型防爆油气回收装置在自动装车系统中的应用

本站热搜