Cinemachine——磁力吸实现CinemachineTargetGroup

news/2024/10/24 10:51:34/文章来源:https://www.cnblogs.com/chenxiayun/p/18499043

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 updatevoid Start(){cameraMagnets = GetComponentsInChildren<CameraMagnetProperty>();playerIndex = 0;}// Update is called once per framevoid 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;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/821074.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

去哪儿旅行携手 HarmonyOS SDK | 告别繁琐,常用信息秒级填充

背景 去哪儿旅行作为行业内领先的一站式在线旅游平台,多年来在日益加剧的市场竞争中积极寻求创新,凭借其优质的服务深受消费者青睐。2024年,去哪儿旅行适配HarmonyOS NEXT版本, 升级用户服务体验。 当前,去哪儿旅行应用中多个业务服务涉及表单填充场景。用户在进行身份信息…

AOT漫谈专题(第七篇): 聊一聊给C#打造的节点依赖图

一:背景 1. 讲故事 上一篇我们聊过AOT编程中可能会遇到的三大件问题,而这三大件问题又是考验你对AOT中节点图的理解,它是一切的原点,接下来我就画几张图以个人的角度来解读下吧,不一定对。 二:理解节点依赖图 1. 对节点的理解 按照官方的说法,构建依赖节点和GC的标记算法…

ton 通过queryId关联交易

js发起交易代码: async function sendTransaction(item, queryId) {// return false;// console.log(sendTransaction, item, address);const {beginCell,toNano,Address,TonClient,StateInit,storeStateInit,JettonMaster,Cell,} = await import("@ton/ton");const…

MD文档转幻灯片软件:Deckset MacOS电脑版Markdown文档无缝转换为演示文稿

Deckset是一款基于Mac平台的幻灯片制作软件,它允许用户将Markdown文档无缝转换为精美的演示文稿。软件内置多种主题和模板,支持自定义样式,能够满足学术或商务会议等多种需求。Deckset界面简洁直观,操作简便,支持Markdown和LaTeX语法,并提供自动布局、实时预览、演讲者笔…

火山引擎数据飞轮线上研讨会即将开启,助力消费品牌双十一造爆款

随着双十一的临近,各大品牌方的备战工作已进入紧张而有序的倒计时阶段。随着双十一的临近,各大品牌方的备战工作已进入紧张而有序的倒计时阶段。这场持续十多年的电商大促,对消费者来说是购物狂欢节,对各大品牌方来说,则是更是品牌实力与策略的比拼。面对日益激烈的市场竞…

[图像处理] 基于CleanVision库清洗图像数据集

CleanVision是一个开源的Python库,旨在帮助用户自动检测图像数据集中可能影响机器学习项目的常见问题。该库被设计为计算机视觉项目的初步工具,以便在应用机器学习之前发现并解决数据集中的问题。CleanVision的核心功能包括检测完全重复、近似重复、模糊、低信息量、过暗、过…

资料:工业定制化仪器设计方案

Camera Link 输出子卡 , FPGA逻辑视频采集 , FPGA实时计算平台 , 实物仿真平台 , 工业定制化仪器

为啥我的mysql根目录没有my.ini

为啥我的mysql根目录没有my.ini? 正确的是:

媲美PS的修图软件推荐:Pixelmator Pro 保持图片原始质量修图 macOS电脑激活软件

Pixelmator Pro是一款专为Mac用户设计的图像编辑软件。它拥有直观易用的界面和丰富的工具集,支持非破坏性编辑,确保原始文件质量不受影响。该软件集成了先进的机器学习技术,提供智能调色、抠图等功能,并支持多种文件格式,包括JPEG、PNG及Photoshop的PSD文件。无论是摄影后…

linux提交之6e90b6-开源之耻!

本周合并到 Linux 6.12-rc4 内核中的一个补丁删除了一些内核维护者,使其不再出现在官方 MAINTAINERS 文件中,该文件可识别所有驱动程序和子系统维护者。 其中包括宏碁 Aspire 1 EC 驱动程序、Cirrus Logic CLPS711X ARM 架构、Baikal-T1 PVT 硬件监控器驱动程序、Libata PATA…

PbootCMS登录后无法访问特定页面,提示404错误或权限不足怎么办

问题描述:登录后无法访问特定页面,提示404错误或权限不足。 解决方案:检查URL:确保访问的URL正确无误。 检查权限设置:确保当前用户具有访问该页面的权限。 检查路由配置:确保PBootCMS的路由配置正确。 清除缓存:清除浏览器缓存和PBootCMS的缓存,重新加载页面。 检查插…

网站首页后台怎么修改?

1. 登录后台管理系统打开浏览器,访问你的网站后台管理系统的登录页面。 输入当前的用户名和密码,登录到后台管理系统。2. 导航到首页管理登录后,进入后台管理系统的主界面。 在顶部菜单或左侧导航栏中,找到并点击“首页管理”、“页面管理”或“内容管理”等相关选项。3. 选…