视角“聚焦”是游戏过场动画中常见的功能,Cinemachine实现这个功能,让我们看看具体怎么使用吧。通过Package Manager导入Cinemachine插件,在导入Cinemachine Sample后,我们可以在Assets文件夹下Cinemachine/2.6.17(这个是你下载的cinemachine版本号)/Cinemachine Example Scenes/Scenes/CameraMagnets中看具体的Demo。
Cinemachine TargetGroup组件
使用Cinemachine目标组(Target Group)可以将多个GameObject视为一个单一的“注视”目标。通过目标组和组合算法(Group Composer),可以轻松管理多个对象的摄像机视角。
以下是在Unity中创建一个使用目标组的虚拟摄像机的步骤:
创建目标组摄像机:在Unity菜单中选择 Cinemachine > Create Target Group Camera。这样Unity会在场景中添加一个新的虚拟摄像机和一个目标组。
设置虚拟摄像机的目标:新创建的虚拟摄像机的跟随(Follow)和注视(Look At)目标会指向这个新目标组。
选择目标组对象:在层级面板(Hierarchy)中,选择新创建的目标组对象。
添加新项:在检查器(Inspector)中,点击“+”符号以向目标组中添加一个新项。
分配GameObject:在新项中分配一个GameObject,并编辑其权重(Weight)和半径(Radius)属性。
添加更多GameObject:如果需要向目标组中添加更多GameObject,可以重复步骤3和4。
通过以上步骤,你可以轻松地管理多个GameObject,让摄像机更好地聚焦于这些目标。
Position Mode
计算目标组的位置的方法。
Group Center
使用包含目标组内所有项目的轴对齐包围盒(Axis-Aligned Bounding Box,AABB)的中心点来计算目标组的位置。这种方法的步骤如下:
定义包围盒:首先,计算一个轴对齐包围盒,它能够包含目标组内所有的GameObject。这个包围盒是一个矩形立方体,边界平行于坐标轴。
找到最小和最大点:
最小点:找出所有目标的最小X、Y和Z坐标,形成一个点(minPoint)。
最大点:找出所有目标的最大X、Y和Z坐标,形成另一个点(maxPoint)。
计算中心点:通过将最小点和最大点的坐标相加,然后除以2,计算出包围盒的中心点。公式如下:
返回结果:计算得出的中心点就是目标组的位置,可以用作摄像机的注视点或其他需要引用的位置。
通过这种方式,可以确保目标组的位置能够包围并涵盖所有相关的GameObject,使得摄像机能够更好地对齐视角。
Group Average
使用目标组内项目位置的加权平均值来计算目标组的位置,这种方法考虑了各个项目的重要性或影响力。具体步骤如下:
获取目标位置和权重:首先,收集目标组内所有GameObject的位置(例如,世界坐标)和它们各自的权重(Weight)。
计算加权和:
将每个目标的位置乘以其对应的权重,得到加权位置。
将所有加权位置相加,得到总的加权和。
公式为:
计算总权重:将所有目标的权重相加,得到总权重。
公式为:
计算加权平均位置:将加权和除以总权重,得到加权平均位置。公式为:
返回结果:最终得出的加权平均位置就是目标组的位置,可以用作摄像机的注视点或其他需要引用的位置。
Rotation Mode
计算目标组的旋转的方法。
Manual
使用目标组变换(Transform)中的旋转属性(Rotation)值来计算目标组的位置是推荐的设置。这种方法的步骤如下:
获取目标组的旋转值:首先,访问目标组对象的变换组件,找到其中的旋转属性。这通常以四元数(Quaternion)或欧拉角(Euler Angles)的形式表示。
应用旋转:根据旋转属性的值,计算目标组在世界坐标系中的方向。这一方向决定了摄像机的朝向或注视点的方向。
保持一致性:使用目标组的旋转属性可以确保在场景中,摄像机或其他对象始终保持与目标组相一致的方向,从而增强视觉效果的一致性。
推荐使用:使用目标组的旋转属性是推荐的设置,因为它可以自动适应目标组内对象的位置变化,确保摄像机的视角始终正确对齐。
通过这种方式,可以方便地管理多个GameObject的旋转,使得整体效果更加自然和流畅。
Group Average
对目标组内项目的朝向(Orientation)进行加权平均是一种计算目标组整体方向的方法。这种方法考虑了各个项目的旋转属性和它们的重要性。具体步骤如下:
获取朝向和权重:首先,收集目标组内所有GameObject的朝向信息,通常以四元数(Quaternion)或欧拉角(Euler Angles)的形式表示,并获取它们各自的权重(Weight)。
转换为四元数:如果使用的是欧拉角,先将每个目标的朝向转换为四元数,以便于后续的计算。
计算加权和:
将每个目标的朝向(四元数)乘以其对应的权重,得到加权朝向。
将所有加权朝向相加,得到总的加权和。
公式为:
计算总权重:将所有目标的权重相加,得到总权重。
公式为:
计算加权平均朝向:将加权和除以总权重,得到加权平均朝向。注意,这一步通常需要对结果进行归一化,以确保朝向表示的有效性。
返回结果:最终得出的加权平均朝向就是目标组的整体方向,可以用作摄像机的朝向或其他需要引用的方向。
Target&Weight&Radius
- weight:在计算平均时给该项目多少权重。权重不能为负。
- radius:该项目的半径,用于计算包围盒。半径不能为负。
VirtualCamera设置
CinemachineVirtualCamera的Follow属性,需要指向拥有TargetGroup组件的gameObject
TargetGroup权重调整
接下来我们就可以自己实现代码,在每一帧根据与目标距离调整 TargetGroup 中每个item的权重,就可以实现磁力吸效果了,看看官方提供的代码:
public class CameraMagnetTargetController : MonoBehaviour
{
public CinemachineTargetGroup targetGroup;
private int playerIndex;
private CameraMagnetProperty[] cameraMagnets;
// Start is called before the first frame update
void Start()
{
cameraMagnets = GetComponentsInChildren<CameraMagnetProperty>();
playerIndex = 0;
}
// Update is called once per frame
void Update()
{
for (int i = 1; i < targetGroup.m_Targets.Length; ++i)
{
float distance = (targetGroup.m_Targets[playerIndex].target.position -
targetGroup.m_Targets[i].target.position).magnitude;
if (distance < cameraMagnets[i-1].Proximity)
{
targetGroup.m_Targets[i].weight = cameraMagnets[i-1].MagnetStrength *
(1 - (distance / cameraMagnets[i-1].Proximity));
}
else
{
targetGroup.m_Targets[i].weight = 0;
}
}
}
}
标签:加权,朝向,权重,GameObject,目标,摄像机,Cinemachine,磁力,CinemachineTargetGroup
From: https://www.cnblogs.com/chenxiayun/p/18499043