Wallpaper壁纸制作学习记录14

news2025/1/14 5:30:34

交互式操控变形动画

操控变形动画与ScenceScript 结合使用还可用于创建交互式壁纸元素。在本次实例中,将讲解如何允许用户抓取和拖动单个骨骼。

交互式骨骼

这里提供了本次实例中的项目下载链接:果冻项目。

设置操控变形动画

为了实现这一点,需要将操控变形动画与SceneScript 结合使用。首先在果冻对象上创建一个操控变形动画。几何结构不需要任何特别注意。对于骨骼设置,本次实例仅包含两个骨骼:一个静态根骨骼,代表果冻对象的外部区域,另一个骨骼位于果冻对象的中心,已配置为在骨骼约束中使用弹簧模拟

对于中心骨骼的骨骼约束,启用了弹簧物理模拟,然后启用了物理平移,并将其他所有内容保留为默认状态。这意味着我们能够移动骨骼(这就是启用物理平移的作用),并且由于它是弹簧模拟,因此当释放鼠标光标时,它将自动返回到其原始位置。

此外,为骨骼设置姓名也很重要,稍后可以在代码中引用它。在实例中,在编辑器中选择骨骼时,将起命名为MouseBone。

对于骨骼权重,中心骨骼在对象的中间获得一小块区域。在本例中,绿色区域表示鼠标光标将拖动的区域,而红色区域表示属于根骨骼的不可移动区域:

我们不需要为此示例创建任何动画,因为鼠标交互与此完全分开。

用于鼠标拖动的SceneScript代码 

接下来,需要将SceneScript 代码片段分配给果冻图像层。选择图层,然后点击右上角的 眼睛图标 和锁图标旁边的齿轮图标。 您可以从下面复制粘贴代码,并检查代码注释以获取一些其他详细信息:

'use strict';

// Set the maximum distance that the bone can be dragged away 
const DRAG_MAX_DISTANCE = 100;

// Set the "Name" of the bone that can be dragged as defined in puppet warp setup
const MOUSE_BONE_NAME = 'MouseBone';
 
var activeDragBone;
var isDragging = false;
var dragDelta;
var dragStart;
 
/**
 * @param {Boolean} value - for property 'visible'
 * @return {Boolean} - update current property value
 */
export function update(value) {
	if (isDragging) {
		// Use the mouse cursor position to calculate the drag distance
		var drag = input.cursorWorldPosition.subtract(dragStart);
		var dragDist = drag.length();
		drag = drag.divide(dragDist);
		// Limit the distance to the max distance that was configured in the DRAG_MAX_DISTANCE constant at the top
		drag = dragStart.add(drag.multiply(Math.min(DRAG_MAX_DISTANCE, dragDist)));
		// Move the bone to the newly calculated drag distance
		thisLayer.setBoneTransform(activeDragBone, thisLayer.getBoneTransform(activeDragBone).translation(drag.add(dragDelta)));
	}
}
 
/**
 * @param {CursorEvent} event
 */
export function cursorDown(event) {
	var bonePos = thisLayer.getBoneTransform(1).translation();
	var delta = bonePos.copy().subtract(input.cursorWorldPosition);
	var len = delta.length();
	// Update the drag position if it's not further away than the maximum distance
	if (len < DRAG_MAX_DISTANCE) {
		dragStart = bonePos;
		dragDelta = delta;
		isDragging = true;
	}
}
 
/**
 * @param {CursorEvent} event
 */
export function cursorUp(event) {
	// Release the drag animation in the next update() call
	isDragging = false;
}
 
/**
 * Get bone for mouse movement
 */
export function init() {
	// Get the numeric index of the bone that can be dragged and store it for later use
	activeDragBone = thisLayer.getBoneIndex(MOUSE_BONE_NAME);
}

首先,代码加载可以按其名称拖动的骨骼,并将其存储在变量中。如果您在操控变形动画设置期间为骨骼制定了不同的名称,则可以更改代码顶部的值:MOUSE_BONE_NAME

thisLayer.getBoneIndex(MOUSE_BONE_NAME);

骨骼的主要运动发生在功能中。骨骼不断向鼠标光标位置移动,举例来说,代码中的这一行处理所有移动:update()

thisLayer.setBoneTransform(activeDragBone, thisLayer.getBoneTransform(activeDragBone).translation(drag.add(dragDelta)));

通过使用,我们可以通过索引访问当前层上的任何骨骼。第二个参数乍一看可能看起来有点混乱,但实际上并没有那么复杂。基本上就是我们获取骨骼的位置,然后根据鼠标在壁纸上的位置移动它。

释放鼠标光标时,骨骼将返回到其原始位置,因为骨骼已在配置为操控变形动画中使用弹簧物理模拟。这意味着骨骼将自动返回到其原始位置,而无需额外的代码。

提示

您可以使用 SceneScript 可靠地覆盖所有人偶变形动画。 Wallpaper Engine 将在显示图层之前执行帧上的所有动画,然后再在帧上执行任何脚本。

 将此代码片段应用于果冻层后,您可以点击顶部的运行预览或应用壁纸,它应该已经像上面的预览视频一样运行。请记住,这仅适用于一个。

高级交互操控变形动画

在示例中还有一个更复杂的案例。在这种情况下,果冻有大量的骨骼,这些骨骼都可以拖来拖去。此外,还有一个时间轴动画,每当释放鼠标时,SceneScript 都会触发该动画,以模拟骨骼恢复到其原始状态的物理影响。果冻纹理也被制作成一个精灵表,其中包含多个面部表情,当拖动动画开始时,这些表情会切换。该实例中还包含声音,总体上稍微复杂一些。可以通过上方给出的链接查看实例项目。

具有逆运动学的肢体动画

Wallpaper Engine 支持人偶变形模型的反向运动动画。此方法允许您为角色的关节定义合理的运动范围,并且 Wallpaper Engine 将动态地为整个肢体地运动设置动画。

逆运动学的基本介绍

通常建议在使用逆运动学时使用角色表,以获得最佳视觉效果。但是,您也可以将逆运动学用于简单的人偶变形动画。在本示例中,将使用一个简单的简笔画来解释逆运动学最近本形式的核心思想。

为逆运动学创建骨骼

要开始使用逆运动学,请开始为操控变形对象创建几何图形,就像使用任何普通的人偶变形动画一样。反向运动学的第一个重要部分是骨架设置,您需要在其中指定模型的骨骼。

在示例中,有一个简单的火柴人图形,用于展示基本的反向运动学设置。首先将根骨骼放置在躯干区域。现在,我们躯干延伸到角色腿部顶部的髋关节。确保每条腿都有一个单独的骨骼,这很重要,因为两条腿都需要能够独立移动。接下来,在膝盖和脚部创建骨骼。通过在上胸部区域创建骨骼来重复此操作。从这块骨头延伸到左肩和右肩,并延伸到手臂关节和手关节。添加角色可能需要的任何其他骨骼,例如头部骨骼。

启用逆运动学 

逆运动学通常仅对每个相应肢体的最后一个骨骼启用。例如,对于手臂,您将选择最后一个手骨,对于腿部,您将选择代表脚的骨骼。选择这些最后的骨骼,然后点击右侧的编辑约束。从模拟预设选项中,选择逆运动学臂/腿。您可以通过将模式选项更改为高级来近一步调整这一点,尽管在许多情况下,只使用简单版本应该没问题。您可以稍后调整此设置。

调整位置朝向

配置逆运动学肢体后,您需要对逆运动学骨骼进行一些额外的调整,否则您可能会遇到各个肢体的异常运动和挥舞。

在操控变形对象骨架设置中,选择角色的逆运动骨骼,然后移动角度对齐,使红色箭头面向肢体的方向。例如,在本例中,通过转动角度,使其面向手的方向,对所有相关肢体重复此过程。

基本逆运动学动画示例 

现在我们已经完成了基本的操控变形动画设置,可以为角色模型创建动画了。创建新动画并配置所需的动画长度。由于将展示循环动画,因此还启用了创建平滑的动画循环选项。这允许我们创建复杂的动画,并且Wallpaper Engine 将始终让动画的所有部分在它们开始的地方完成,以实现平滑的动画循环。

在示例中,我们抓住角色的根骨骼并将其降低,这将导致我们的角色将腿部和手臂动画化为蹲下位置。然后,我们将时间轴滑块移动到动画时间轴的中心。同样,我们不会将滑块移动到末尾,因为我们启用了创建平滑的动画循环选项,因此Wallpaper Engine 将为我们完成动画的其余部分,我们不需要再次定义结束位置。现在我们将角色的根骨骼向上移动,这将根据其配置自动移动所有逆运动学肢体。您会注意到,双腿在过度伸展之前保持静止,只有在整个骨骼链完全伸展后才会离开地面。这回产生涉及所有肢体的逼真跳跃动作。

使用目标控制器的动画

前面的跳跃动画示例有点过于简化,以快速展示逆运动学的肢体运动。通常,您不直接对骨骼进行动画处理,而是使用动画概述中显示的目标控制器。

目标控制器显示为方形而不是圆点,因此可以轻松区分它们。目标控制器会影响它们所属的整个肢体位置,它们允许您根据该肢体的逆运动学配置轻松设置整个肢体的动画。您还可以过渡拉伸目标控制器,它会自动对齐肢体,就像您物理拉动它一样。

调整方向控制器

您可能已经注意到,Wallpaper Engine 会通过逆运动学将您显示通向四肢中心的其他点。这些所谓的方向控制器决定了肢体的扭曲方向。您可以重新定位它们以调整肢体将相应方向扭曲的点。您可以在开始动画之前执行此操作,但也可以在动画本身期间移动它们。

骨骼的混合规则

混合规则是人偶变形动画的一项高级功能。它们允许您解决一些特定的动画情况,即您想要将骨骼附加到另一个对象。例如,角色左手拿着一个物体,然后将其扔到右手。在这种情况下,您现在希望对象自动跟随它所在手的所有动作。混合规则允许您执行此操作,因为您基本上可以在动画期间更改对象的父骨骼。

通过以下示例动画展示混合规则。注意剑是如何一直附在岩石上的,直到骑士拉动它。拔出剑后,它会继续跟随骑士握剑的手部动作。这是通过混合规则实现的,该规则将剑的父骨骼从岩石更改为骑士的手。

设置混合规则

 为了配置混合规则,我们首先需要在人偶操控变形动画模型的骨骼设置中配置两个骨骼之间的这种关系。打开操控变形对象设置过程中的第2步(骨架设置),然后选择要用于此目的的骨骼。

对于这个特定示例,需要为骑士角色创建一个法线骨架,并创建另一个漂浮在岩石上方的单独根骨骼。第二个根骨骼没有直接的动画目的,它仅用作动画中岩石位置的参考点。在本例中,您应该选择要在动画中将对象附加到的骨骼,例如角色的手。

在下一步中,选择代表剑的骨骼,然后点击右侧的编辑约束按钮以显示骨骼约束的设置。之后导航到混合规则选项卡,然后选择要将对象附加到的骨骼。在本例中,选择将表示岩石的骨骼作为混合规则骨骼。

 提示

你可以为每个骨骼命名,这有助于在混合规则设置中选择骨骼,因为你将能够轻松地按名称识别它们。

 

为Blend规则制作动画

创建混合规则后,您会注意到骨骼现在已附加到您在骨骼约束设置中选择的骨骼。

在示例中,我们希望骑士从石头中拔出剑后,剑就会附着在它原本属于的手上。

剑从默认值1.00的混合规则开始,这意味着它完全附加到表示岩石位置的骨骼。现在,我们想降低混合规则,并通过在动画中的右帧将其设置为0.00来将其关闭。

选择首部骨骼,并在时间轴动画列表中查找我们的混合规则。然后右键点击它并选择显示单个。我们现在可以看到blend规则的动画时间轴。现在需要找到我们希望剑移动到骑士手中的确切帧。通过导航到时间轴中的确切帧,然后点击切换关键帧来在该帧上放置一个关键帧。然后我们向右移动一帧并放置第二个关键帧。可以通过选择骨骼并滚动到右侧菜单的底部来找到骨骼中的所有混合规则。对于第二个关键帧,我们将混合规则的值降低到0.0,这将在两帧之间创建一条平滑的曲线,其中剑从岩石上分离。

展示的示例是一个不循环的动画。如果要创建平滑循环的动画,只需将混合规则值恢复为其起始值即可。

在更复杂的动画中,一个骨骼甚至可能有多个混合规则。在这种情况下,Wallpaper Engine会根据对象的混合规则值将您的对象放置在骨骼之间。这将允许您将对象浮动在某些骨骼之间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode 扩展Cline、Continue的差别?

Cline和Continue都是VSCode的AI编程插件&#xff0c;它们在功能、用户体验、性能、适用场景以及配置和使用步骤等方面存在一些差别&#xff1a; 一、功能差异 编辑功能 Cline&#xff1a;能够分析项目的文件结构和源代码抽象语法树&#xff08;AST&#xff09;&#xff0c;通…

【Rust自学】12.3. 重构 Pt.1:改善模块化

12.3.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读取…

excel设置好的可选择列数据后,如何快速输入到单元格中?

当设置好列的【数据】-【数据有效性】-【序列】后&#xff0c;在单元格中输入可选择数据的开头&#xff0c;就会提示出对应的可选择数据&#xff0c;然后&#xff0c;按一下键盘上的【↓】键&#xff0c;再按回车&#xff0c;即可快速输入到单元格中。

Vue3.5 企业级管理系统实战(二):Router、Pinia 及 Element-Plus 集成

1 Vue Router 集成 1.1 安装 vue-router 通过 pnpm 安装 Vue Router pnpm i vue-router 1.2 配置 Router 在 src 文件夹下新建 views 文件夹&#xff0c;新建文件 Home.vue 和 About.vue 在 src 文件夹下新建 router 文件夹&#xff0c;在 router 下新建 index.ts 用来配置…

OPT: Open Pre-trained Transformer语言模型

摘要 大规模语言模型通常需要数十万计算日的训练时间&#xff0c;展现了在零样本和小样本学习中的显著能力。鉴于其计算成本之高&#xff0c;这些模型在没有大量资本投入的情况下难以复现。对于那些通过API提供的少数模型&#xff0c;研究者无法获取完整的模型权重&#xff0c…

【PDF转Word】 PDF在线转word文档 好用!优质网站资源推荐

大家在工作与学习中&#xff0c;经常需要将PDF文件转换为Word格式以便进行编辑和修改。很多人都不知道怎么操作&#xff0c;今天我们介绍一个非常好用的工具&#xff1a;小白工具网&#xff0c;可以在线帮忙大家快速把PDF转换成word格式。 小白工具网提供的PDF转Word功能&…

2025 年前端开发学习路线图完整指南

如果您想成为前端开发人员&#xff0c;本指南适合您。无论您是从零开始还是已经了解基础知识&#xff0c;它都会帮助您专注于真正重要的事情并学习让您脱颖而出的技能。 刚开始的时候&#xff0c;我浪费了几个月的时间在不相关的教程上&#xff0c;因为我不知道从哪里开始&…

妙用编辑器:把EverEdit打造成一个编程学习小环境

1 妙用编辑器&#xff1a;把EverEdit打造成一个编程学习小环境 1.1 应用场景 最近在学习Python语言&#xff0c;由于只是学习和练习&#xff0c;代码规模很小&#xff0c;不想惊动PyCharm、VSCode、WingIDE这些重型武器&#xff0c;只想轻快的敲些代码&#xff0c;记事本虽好&…

【江协STM32】10-4/5 I2C通信外设、硬件I2C读写MPU6050

1. I2C外设简介 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担支持多主机模型支持7位/10位地址模式支持不同的通讯速度&#xff0c;标准速度(高达100 kHz)&#xff0c;快速…

初识 Git——《Pro Git》

Why Git&#xff1f; 1. 本地版本控制系统 Why&#xff1a; 许多人习惯用复制整个项目目录的方式来保存不同的版本&#xff0c;或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单&#xff0c;但是特别容易犯错。 有时候会混淆所在的工作目录&#xff0c;一不小心…

记一次学习skynet中的C/Lua接口编程解析protobuf过程

1.引言 最近在学习skynet过程中发现在网络收发数据的过程中数据都是裸奔&#xff0c;就想加入一种数据序列化方式&#xff0c;json、xml简单好用&#xff0c;但我就是不想用&#xff0c;于是就想到了protobuf&#xff0c;对于protobuf C/C的使用个人感觉有点重&#xff0c;正好…

使用RSyslog将Nginx Access Log写入Kafka

个人博客地址&#xff1a;使用RSyslog将Nginx Access Log写入Kafka | 一张假钞的真实世界 环境说明 CentOS Linux release 7.3.1611kafka_2.12-0.10.2.2nginx/1.12.2rsyslog-8.24.0-34.el7.x86_64.rpm 创建测试Topic $ ./kafka-topics.sh --zookeeper 192.168.72.25:2181/k…

MySQL(行结构)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; MySQL 一行记录是怎么存储的&#xff1f; | 小林coding MySQL原理 - InnoDB引擎 - 行记录存…

ros2笔记-6.2 使用urdf创建机器人模型

本节主要跟着小鱼老师的视频操作&#xff0c;不同的仿真平台有不同的建模语言&#xff0c;但是几乎都支持URDF。 本节使用URDF创建一个机器人模型。 6.2.1 帮机器人创建一个身体 URDF使用XML来描述机器人的结构和传感器、执行器等信息。 在chapt6/chap6_ws/src创建功能包:r…

基于mybatis-plus历史背景下的多租户平台改造

前言 别误会&#xff0c;本篇【并不是】 要用mybatis-plus自身的多租户方案&#xff1a;在表中加一个tenant_id字段来区分不同的租户数据。并不是的&#xff01; 而是在假设业务系统已经使用mybatis-plus多数据源的前提下&#xff0c;如何实现业务数据库隔开的多租户系统。 这…

【JAVA基础】Collections方法的具体使用方法

java基础中Collections及collect(toList,toSet,toMap)的用法 package com.gaofeng;import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream;public class demo01 {public static void main(String[] …

HDFS 的API的操作

3.1 客户端环境准备(windows) 1&#xff09;拷贝hadoop-3.1.X到非中文路径&#xff08;比如d:\&#xff09;。 2&#xff09;配置HADOOP_HOME环境变量 3&#xff09;配置Path环境变量。 注意&#xff1a;如果环境变量不起作用&#xff0c;可以重启电脑试试。 也可以直接添加…

【数据库】二、关系数据库

文章目录 二、关系数据库1 关系2 关系数据库3 完整性约束4 关系运算 二、关系数据库 1 关系 域&#xff1a;一组具有相同数据类型的值的集合。 笛卡尔积&#xff1a;所有域&#xff08;域可相同&#xff09;中所有取值的组合 例如&#xff1a;D1{1,2,3}&#xff0c;D2{A,b}&…

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器&#xff0c;为开发者提供了一个强大的平台来实施这些实践。然而…

playwright 模拟登录

一、流程如下 C#代码&#xff1a; using Microsoft.Playwright; using Newtonsoft.Json; using System; using System.IO; using System.Net.Http; using System.Text; using System.Xml.Linq;namespace TestProject3 {[TestClass]public class UnitTest1 : PageTest{[TestMet…