Godot4一个实现第三人称相机的方法
概述
该项目具备较强的可移植性,只需要把文件拖入需要相机的其它项目,再根据脚本提示修改部分参数即可工作。
程序运用了一些简单的角度运算和线性变换,用于相机的运镜、变焦;控制人物运动方向。
本文部分用词不是很准确,请多包涵。
只讲大概思路和部分细节,具体请移步到项目仓库。
效果概览
主要演示以下功能
(演示视频)
运镜
摄像机可以水平垂直围绕角色旋转、可以利用滚轮进行变焦(效果上)、角色运动及停止时摄像机可以适当缓冲。
角色
角色正常的移动,方向以摄像机为准。由于只准备了相机和角色模型,这里的动画十分生硬。
一些细节
场景树
主要介绍CameraBase节点。CameraBase作为CharacterBody3D的节点可以保证相机持续跟踪人物。
CameraPivot作为相机的支点,相机在旋转时借助使用。
SpringArm3D是一个动态处理碰撞的类,当该节点遇到碰撞时会让子节点朝碰撞点移动并保留一定的间距,很好的处理相机经过物体的情况。
最小一代的节点是记录画面的相机,本项目并没有直接调整相机节点,而是调整其父节点。
请注意:源码仓库中没有包含角色模型,所以继承自角色模型的节点需要你导入。不过你不使用CharacterBody3D下的角色节点也可以让相机正常工作。
脚本
主要内容分别是CharacterBody3D、CameraPivot、SpringArm3D关联的脚本。
SpringArm3D与CameraPivot
SpringArm3D的关键属性应该是SpringLength和Margin,分别对应距离子节点的长度(沿-Z方向)、碰撞时的子节点边距。脚本只有监听滚轮事件以动态调整FOV属性值,达成“变焦”的效果。
CameraPivot也是比较简单的代码。通过鼠标滑动键盘的相对距离以一定倍率改变欧拉角。
CharacterBody3D
direction可以看作归一化的输入“速度”向量,transform_direction函数用于将dirention变换到相机的Basis下。再把处理好的准“速度”应用到实际速度(velocity)上。
check_idle函数用于检测运动状态分配对应动画。由于笔者动画这部分不是很熟,只是简单地结合枚举状态用了不同状态的动画节点的play方法。
alter_fov函数用于运动时动态调整焦距。基本思路是分别对放大缩小焦距用不同非线性递减的表达式控制,同时记录ΔFOV用于恢复焦距状态。
笔者的话
这个东西折腾得比较久了。刚使用Godot时得第一个问题是Blender导出模型,光材质就折腾死了,最后还是摆了不导出材质资源。还有动画的制作,没有艺术细菌做得就要红温了最后总算是能动了,但也只有能动了。
Godot实现个相机也不是一步到位的(至少我不是)。查文档、遇问题、搜论坛一条龙服务。得益于Godot的社区环境比较友好,问题还是解决了。
Godot小巧精悍,对于一些游戏引擎概念的学习挺有帮助。
最后,如果有什么想法的话,欢迎私信。ヾ(≧▽≦*)o