首页 > 其他分享 >Cinemachine——磁力吸实现&CinemachineTargetGroup

Cinemachine——磁力吸实现&CinemachineTargetGroup

时间:2024-10-24 10:42:35浏览次数:5  
标签:加权 朝向 权重 GameObject 目标 摄像机 Cinemachine 磁力 CinemachineTargetGroup

image
视角“聚焦”是游戏过场动画中常见的功能,Cinemachine实现这个功能,让我们看看具体怎么使用吧。通过Package Manager导入Cinemachine插件,在导入Cinemachine Sample后,我们可以在Assets文件夹下Cinemachine/2.6.17(这个是你下载的cinemachine版本号)/Cinemachine Example Scenes/Scenes/CameraMagnets中看具体的Demo。

Cinemachine TargetGroup组件

image
使用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,计算出包围盒的中心点。公式如下:

image

返回结果:计算得出的中心点就是目标组的位置,可以用作摄像机的注视点或其他需要引用的位置。

通过这种方式,可以确保目标组的位置能够包围并涵盖所有相关的GameObject,使得摄像机能够更好地对齐视角。

Group Average

使用目标组内项目位置的加权平均值来计算目标组的位置,这种方法考虑了各个项目的重要性或影响力。具体步骤如下:

获取目标位置和权重:首先,收集目标组内所有GameObject的位置(例如,世界坐标)和它们各自的权重(Weight)。

计算加权和:

将每个目标的位置乘以其对应的权重,得到加权位置。
将所有加权位置相加,得到总的加权和。
公式为:
image
计算总权重:将所有目标的权重相加,得到总权重。

公式为:
image
计算加权平均位置:将加权和除以总权重,得到加权平均位置。公式为:
image
返回结果:最终得出的加权平均位置就是目标组的位置,可以用作摄像机的注视点或其他需要引用的位置。

Rotation Mode

计算目标组的旋转的方法。

Manual

使用目标组变换(Transform)中的旋转属性(Rotation)值来计算目标组的位置是推荐的设置。这种方法的步骤如下:

获取目标组的旋转值:首先,访问目标组对象的变换组件,找到其中的旋转属性。这通常以四元数(Quaternion)或欧拉角(Euler Angles)的形式表示。

应用旋转:根据旋转属性的值,计算目标组在世界坐标系中的方向。这一方向决定了摄像机的朝向或注视点的方向。

保持一致性:使用目标组的旋转属性可以确保在场景中,摄像机或其他对象始终保持与目标组相一致的方向,从而增强视觉效果的一致性。

推荐使用:使用目标组的旋转属性是推荐的设置,因为它可以自动适应目标组内对象的位置变化,确保摄像机的视角始终正确对齐。

通过这种方式,可以方便地管理多个GameObject的旋转,使得整体效果更加自然和流畅。

Group Average

对目标组内项目的朝向(Orientation)进行加权平均是一种计算目标组整体方向的方法。这种方法考虑了各个项目的旋转属性和它们的重要性。具体步骤如下:

获取朝向和权重:首先,收集目标组内所有GameObject的朝向信息,通常以四元数(Quaternion)或欧拉角(Euler Angles)的形式表示,并获取它们各自的权重(Weight)。

转换为四元数:如果使用的是欧拉角,先将每个目标的朝向转换为四元数,以便于后续的计算。

计算加权和:

将每个目标的朝向(四元数)乘以其对应的权重,得到加权朝向。
将所有加权朝向相加,得到总的加权和。
公式为:
image

计算总权重:将所有目标的权重相加,得到总权重。

公式为:
image
计算加权平均朝向:将加权和除以总权重,得到加权平均朝向。注意,这一步通常需要对结果进行归一化,以确保朝向表示的有效性。

返回结果:最终得出的加权平均朝向就是目标组的整体方向,可以用作摄像机的朝向或其他需要引用的方向。

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

相关文章

  • Cinemachine系列——CinemachineConfiner
    使用CinemachineConfiner扩展可以限制相机的位置在特定的体积或区域内。Confiner可以在2D或3D模式下工作,不同的模式影响它接受的边界形状。在3D模式下,相机在三维空间中的位置被限制在一个体积内,这同样适用于2D游戏,但需要考虑深度。在2D模式下,深度问题不需要考虑。对于正交相机......
  • Cinemachine系列——任意门
    今天来看一下官方Demo的任意门具体实现方式吧,通过PackageManager导入Cinemachine插件,在导入CinemachineSample后,我们可以在Assets文件夹下Cinemachine/2.6.17(这个是你下载的cinemachine版本号)/CinemachineExampleScenes/Scenes/AnywhereDoor中看具体的Demo。具体原理是通过......
  • Cinemachine系列——Noise&Basic Multi Channel Perlin
    在Cinemachine相机的游戏对象中使用基本多通道柏林噪声组件,以通过柏林噪声运动模拟相机抖动。柏林噪声是一种计算伪随机运动并具有自然行为的技术。简单来说,基本多通道柏林噪声组件应用了一个噪声配置资产,用于定义噪声随时间变化的行为。Cinemachine自带了一些噪声配置资产,你可以......
  • Cinemachine系列——Cinemachine Collider
    CinemachineCollider是Cinemachine虚拟相机的一个扩展,它对虚拟相机的最终位置进行后处理,旨在保持与虚拟相机的“关注目标”(LookAttarget)之间的视线。它通过远离阻碍视线的游戏对象来实现这一点。添加CinemachineCollider扩展到Cinemachine虚拟相机,可以完成以下任务:将相机......
  • Cinemachine系列——CinemachineBrain & CinemachineVirtualCamera
    CinemachineBrainCinemachineBrain是Unity摄像机与场景中的Cinemachine虚拟摄像机之间的链接。它监控优先级堆栈以选择当前的虚拟摄像机,并在必要时进行混合。最后,也是最重要的一点,它将虚拟摄像机的状态应用到附加的Unity摄像机上。CinemachineBrain还定义了虚拟摄像机之......
  • 磁力天堂视频下载时DLL文件不见了?这里提供解决方案
    当您在使用磁力天堂或者任何其他软件时遇到丢失DLL文件的提示,这通常意味着某个动态链接库文件(.dll)缺失或损坏,这个文件是Windows操作系统的一部分,也是很多应用程序运行所必需的。以下是一些可能的解决方法:重新安装软件:尝试卸载磁力天堂软件,然后从官方网站或可信来源重新下载......
  • 磁力万合AI智能全自动挂机掘金脚本,曰进五张
    本项目介绍了一种通过自动化脚本在磁力万合平台上刷视频以产生广告搜易的方法。用户可以通过在小号上安装脚本,自动访问特定账号的视频内容,从而获得广告搜易。项目概述通过在小号上安装自动化脚本,用户可以让这些账号自动访问并播放指定的磁力万合账号视频,模拟正常用户观......
  • 磁力万合AI智能全自动挂机掘金脚本,曰进五张
    本项目介绍了一种通过自动化脚本在磁力万合平台上刷视频以产生广告搜易的方法。用户可以通过在小号上安装脚本,自动访问特定账号的视频内容,从而获得广告搜易。项目概述通过在小号上安装自动化脚本,用户可以让这些账号自动访问并播放指定的磁力万合账号视频,模拟正常用户观......
  • 磁力万合AI智能全自动挂机掘金脚本,曰进五张
    本项目介绍了一种通过自动化脚本在磁力万合平台上刷视频以产生广告搜易的方法。用户可以通过在小号上安装脚本,自动访问特定账号的视频内容,从而获得广告搜易。项目概述通过在小号上安装自动化脚本,用户可以让这些账号自动访问并播放指定的磁力万合账号视频,模拟正常用户观......
  • 磁力万合AI智能全自动挂机掘金脚本,曰进五张
    本项目介绍了一种通过自动化脚本在磁力万合平台上刷视频以产生广告搜易的方法。用户可以通过在小号上安装脚本,自动访问特定账号的视频内容,从而获得广告搜易。项目概述通过在小号上安装自动化脚本,用户可以让这些账号自动访问并播放指定的磁力万合账号视频,模拟正常用户观......