FPS相机

news/2024/10/17 12:43:23/

提要

FPS常用于FPS游戏中,Minecraft默认的视角也是第一人称的。在网上找了半天也没有找到比较好的现成的,还是自己写好了。



相机建模

不管是FPS相机还是TPS的相机,都包含了相机的两个操作,Yaw和Pitch



Roll在一些特殊情况下才会出现,比如角色死亡。


理论上只要只要Camera的position,yaw,pitch, roll,fov,就可以确定一个Viewport了。


角色结构

角色的层次结构应该是这样的:



最外层的Player,上面用来挂脚本。

里面有Model,就是角色的模型。

再有里面一个Capsule,用来处理移动和碰撞。

相机上有一个virtualPos,是相机的子物体,用来表示Model应该在的位置。

相机有一个Target变量,设为Capsule,还有一个offset表示和target之间的一个位移。


游戏的更新逻辑是这样的:

Input -> Capsule移动->更新Camera位置->更新Model位置。


代码片段

通过鼠标输入

rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp(rotationY, minimumY, maximumY);

这里用minimunY和maximumY来处理俯仰角的最大最小值,一般是不能超过90度的。


Update

transform.position = target.transform.localToWorldMatrix.MultiplyPoint3x4(FPSoffset);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
target.forward = new Vector3(transform.forward.x, 0, transform.forward.z);characterModel.transform.position = fpsVirtualTrans.position;
characterModel.transform.forward = fpsVirtualTrans.forward;


这里的localEulerAngles对应的就是角色的Pitch,Yaw, Roll。


移动端的控制

移动端主要依靠触屏的Drag手势来控制相机的Yaw和Pitch。

首先通过Delegate注册一下Drag事件。

void Start()
{
	GestureManager.Instance.DragEvent += RotateCamera;
}

接下来通过DragEvent提供的信息更新RotateX, RotateY

	void RotateCamera(DragEventData e, ref bool used){float DeltaX = e.currentPosition.x - e.lastPosition.x;float DeltaY = e.currentPosition.y - e.lastPosition.y;UpdateYawPitch(DeltaX, DeltaY);}void UpdateYawPitch(float DeltaX, float DeltaY){float fpsSensPara = 1.3f;if(GameManager.GetInstance().currentOperationMode == OperationMode.FPS) {rotationX += DeltaX / Screen.dpi * sensitivityXmobile;rotationY += DeltaY / Screen.dpi * sensitivityYmobile;}else{rotationX += DeltaX / Screen.dpi * sensitivityXmobile * fpsSensPara;rotationY += DeltaY / Screen.dpi * sensitivityYmobile * fpsSensPara;}if (rotationX > 360 || rotationX < -360){rotationX = 0;}rotationY = Mathf.Clamp(rotationY, minimumY, maximumY);}

Screen.dpi * sensitivityXmobile, 这个项用来处理不同dpi的手机。


Update部分更新和pc端的一样。


可能遇到的一些问题

model插入到场景里的物体中

当角色太靠近场景中的物体时,角色的手部或者武器可能会插入到墙体中,解决方法是单独开一个相机用于model的渲染,并且把depth放到放到最后。


注意culling mask 和 Depth。



参考

Real-Time Cameras:A Guide for Game Designers and Developers


http://www.ppmy.cn/news/182577.html

相关文章

dota2组装电脑配置推荐2021适合玩dota2游戏电脑清单

dota2最低配置&#xff1a;操作系统&#xff1a;Windows 7。CPU&#xff1a;ntel 或 AMD双核&#xff08;Dual core&#xff09; 2.8 GHz。内存&#xff1a;4GB。显卡&#xff1a;nVidia GeForce 8600/9600GT或 ATI/AMD Radeon HD2600/3600。硬盘空间&#xff1a;8GB可用空间以…

推荐5款心仪的电脑软件

1.ArcGIS Desktop ArcGIS Desktop是由ESRI公司开发的一款专业的地理信息系统&#xff0c;一个完整的桌面GIS软件套件&#xff0c;它包含ArcMap、ArcCatalog、ArcGlobe 和 ArcScene四部分&#xff0c;可供 GIS 专业人员创建、分析、管理和共享地理信息&#xff0c;以便决策者做出…

JavaScript:setInterval() 用法详解

文章目录 1 基本语法2 参数说明3 使用示例4 停止 setInterval() 方法 1 基本语法 setInterval() 是 JavaScript 中的一个内置函数&#xff0c;它用于在指定的间隔时间内重复执行一段代码&#xff0c;实现周期性操作。该函数的语法如下&#xff1a; setInterval(function, mil…

江西计算机职业学校排名2015,2015江西专科学校排名及排行榜

原标题&#xff1a;2015江西专科学校排名及排行榜 点击查看>>> 深度推荐阅读&#xff1a; 1、 2、丨 3、丨 4、 5、 江西共有51所专科学校参与了2015江西专科学院排名&#xff0c;其中排名第一的是江西电力职业技术学院&#xff0c;排名第二的是九江职业技术学院&…

陕西专科计算机学校排名2015,2015陕西专科学校排名及排行榜

原标题&#xff1a;2015陕西专科学校排名及排行榜 点击查看>>> 深度推荐阅读&#xff1a; 1、 2、丨 3、丨 4、 5、 陕西共有36所专科学校参与了2015陕西专科学院排名&#xff0c;其中排名第一的是陕西工业职业技术学院&#xff0c;排名第二的是杨凌职业技术学院&…

长沙专科学校计算机排名2015,2015湖南专科学校排名及排行榜

原标题&#xff1a;2015湖南专科学校排名及排行榜 点击查看>>> 深度推荐阅读&#xff1a; 1、 2、丨 3、丨 4、 5、 湖南共有68所专科学校参与了2015湖南专科学院排名&#xff0c;其中排名第一的是长沙民政职业技术学院&#xff0c;排名第二的是湖南工业职业技术学院&…

上半年国产手机在国内市场遭受挫折,而苹果成为大赢家

信通院公布了今年上半年国内手机市场的数据&#xff0c;数据显示国产手机品牌的跌幅比国内整体市场的跌幅还要大&#xff0c;而外资品牌主要是苹果&#xff0c;这就意味着在国内手机市场衰退的时候&#xff0c;苹果成为唯一赢家。 信通院的数据显示&#xff0c;今年上半年国内市…

2019,国产手机生死存亡的一年

作者 | 方文 本文经授权转自猎云网&#xff08;ID: ilieyun&#xff09; 责编 | 屠敏 OPPO副总裁沈义人给现在火热的5G和折叠屏泼了两盆冷水。 “目前这个阶段看来&#xff0c;折叠后除了屏幕变大&#xff0c;和可以折叠一下&#xff0c;并没有带来用户体验上的巨大提升。”…