FPS相机

提要

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-20 12:01:29

FPS相机的相关文章

DirectX 9.0 (12) FPS相机

作者: i_dovelemon 来源:CSDN 日期:2014 / 9 / 25 主题: View Space, Perspective Matrix 引言 在游戏中,我们能够很容易的在3D世界中漫游.要完成这样的功能,我们就需要定制自己的相机.在这里,我们来一起实现一个类似FPS游戏中的第一人称相机,让你能够自由自在的在3D世界中遨游. 相机功能 要想实现FPS的相机,那么我们首先要做的就是确定FPS游戏中相机的功能有哪些了.我们可以想象下,在CF或者COD中,我们能够通过鼠标的移动来改变相机

TPS相机及相机遮挡的一些处理方法

提要 第三人称相机有非常多种,今天要实现的一个第三人称射击游戏的相机. 如果对相机控制不是很了解,建议看一下上一篇博文FPS相机. 控制思路 鼠标控制yaw和pitch,添加一个distance变量来记录角色和相机之间的距离.通过yaw和pitch来得到相机的position. 最后添加一个向右的位移和向上的位移量,将角色放在屏幕偏左边的位置. transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0); characte

OpenGL学习脚印: 视变换(view transformation)

写在前面 OpenGL中的坐标处理过程包括模型变换.视变换.投影变换.视口变换等内容,这个主题的内容有些多,因此分节学习,主题将分为5节内容来学习.上一节模型变换,本节学习模型变换的下一阶段--视变换.到目前位置,主要在2D下编写程序,学习了视变换后,我们可以看到3D应用的效果了.本节示例程序均可在我的github下载. 通过本节可以了解到 视变换的概念 索引绘制立方体 LookAt矩阵的推导(对数学不感兴趣,可以跳过) 相机位置随时间改变的应用程序 坐标处理的全局过程(了解,另文详述) Ope

ROS可视化工具RViz的简单使用教程

1.安装rviz sudo apt-get install ros-melodic-rviz  环境检测.安装 rosdep install rviz rosmake rviz startup(开两个终端) source /opt/ros/indigo/setup.bash roscore rosrun rviz rviz rviz不同的配置,其用途也不尽相同. A configuration contains: Displays + their properties(显示以及属性)Tool p

HoloLens开发手记 - Unity之Locatable camera 使用相机

Enabling the capability for Photo Video Camera 启用相机能力 为了使用摄像头,我们必须启用WebCam能力. 在Unity中打开Player settings 展开Windows Store标签页 在"Publishing Settings > Capabilities"部分勾选WebCam能力 同一时刻只能执行一次相机操作.为了识别当前相机处在哪种模式下(拍照还是视频),你可以通过UnityEngine.VR.WSA.WebCam.

Intel想用6个深感相机实现全身追踪

对VR来说,追踪是很关键的技术.当前市面上的VR头显主要支持手柄和头部追踪,一些公司如CTRL-labs曾提出通过电脉冲追踪手势的方案.Clay AIR在研发无硬件手势追踪技术,而Leap Motion.Magic Leap已经有效果优秀的这方面技术了. Holosuit Valve曾研发针对手部的骨骼追踪技术,不过这并不能满足全身追踪的需求.当前存在一些还在开发中的全身追踪方案,比如OptiTrack通过六个身体部位捕捉动作的追踪方案.Teslasuit动作捕捉全身服.Holosuit等. 上

线扫相机项目中定量判断机构运动是否匀速的方法

线扫相机的原理:线扫相机一般一次只拍摄一条线(线宽通常是1个像素),在机构运动的过程中,线扫相机不断地拍摄线,于是“聚线成面”,这就是线扫相机成像的原理. 线扫相机的原理决定了,它所拍摄的物体必须要运动.机构运动的话,就存在机构的速度是否和线扫相机采集的速度匹配的问题. 将对机构运动速度的要求进行拆分的话,其实就是如下两点: ① 运动速度必须与线扫相机的工作行频(即采集速度)相匹配. ② 机构的运动速度最好是匀速,或者十分接近匀速. 如果机构速度过快,最后的图像在运动方向上被压缩:如果机构速度过

理解HTC Vive更新——控制相机旋转和位移

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/72188658 作者:cartzhang 一.写在前面 在HTC的vive 头盔中, 一旦Vive头盔连接都unity游戏中,就会控制所有Camera的旋转和位置. 这对于有需要的控制非头盔相机带来了烦恼. 比方说,上篇博客中,在VR中,对某个特点位置截图,就会由于头盔控制所有相机的旋转, 造成截图不精确和出现偏移. 地址:

Android Multimedia框架总结(十四)Camera框架初识及自定义相机案例

转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52738492 前言:国庆节告一段落,又是新一月,上月主要是围绕MediaPlayer相关展开,从今天开始,开始分析多媒体框架中的Camera模块,看下今天的Agenda: Camera拍照 Camera录像 新API android.hardware.camera2 新旧API特点对比 Camera自定义相机 新API andro