欢迎光临散文网 会员登陆 & 注册

游戏开发中的倾斜相机鼠标旋转实现

2022-08-30 11:21 作者:DeadCyber  | 我要投稿

问题的出现

    平常时,游戏相机正常:也就是如果我们用up-right-forward描述相机姿态时,up总是向上,鼠标的x,y轴偏移转换成yaw,pitch。

正常时相机姿态

    游戏中很少有roll的偏转,或者说不为主要的位姿调整手段。比如彩虹6号:围攻(Tom Clancy's Rainbow Six Siege)中的q/e歪头探头查看/射击。

但本篇要讲的不是这种歪头,而是重力方向整个倾斜:

此时仍然希望鼠标的x,y位移能正确地对相机进行“横轴”和“纵轴”的旋转:

如果还用原来的鼠标位移旋转逻辑,相机会“坏掉”。因为显然此时相机的“自然状态”(以下我简称为0姿态)并非(roll=0,pitch=0,yaw=0)。(类比坐标系的变换,此时我们的“坐标系原点”已经不在(0,0,0)了,再在其基础上应用基于(0,0,0)的操作是不成立的

    关键部分只要看Update函数中的第一行和最后一行,通过鼠标的MouseX,MouseY,转换成了相机的欧拉角的yaw和pitch,注意到eulerAngles.z一直为0,因为平常是不会有“歪头”情况的。

正确计算旋转

    修复后的代码:

    

注意到这几个变动:

  1. 需要在转换重力方向时,进行RecordCamDir,记录下相机的新的0姿态:即自然状态下的三轴方向和世界旋转。

  2. 新的旋转由3部分四元数相乘,相乘顺序不能反,类似矩阵乘法:先是0姿态的baseRot,然后是“横轴旋转”dRotX,最后是“竖轴旋转”dRotY。

  3. 计算dRotX时,是以camUp为x旋转轴,而不是(0,1,0);计算dRotY时,要先根据当前的transform.forward和camUp叉乘出新的y旋转轴,再根据此轴进行旋转(此称为旋转顺规,Unity默认顺规为zxy)。并且根据叉乘计算dRotY之前,通过对transform.rotation赋值完成了对tranform的更新,否则得不到转完横轴之后的transform.forward。

换个角度看世界




游戏开发中的倾斜相机鼠标旋转实现的评论 (共 条)

分享到微博请遵守国家法律