旋转动画组件
<p>[TOC]</p>
<table>
<thead>
<tr>
<th>作者</th>
<th>QFord(350107)</th>
</tr>
</thead>
<tbody>
<tr>
<td>更新日期</td>
<td>2024-6-13</td>
</tr>
<tr>
<td>版本</td>
<td>V1.1.1</td>
</tr>
</tbody>
</table>
<h2>组件-旋转动画组件</h2>
<h3>策划设计案</h3>
<p>2024-6-12:原有设计案地址已无法访问,已反馈策划。
沈秋娟(小仙女) 2024/6/12 16:59:49
<a href="https://lanhuapp.com/link/#/invite?sid=qXllMKXa">https://lanhuapp.com/link/#/invite?sid=qXllMKXa</a></p>
<p>> 此策划设计案主要是用于旋转交互的设计,而本组件-<strong>旋转动画组件</strong>主要是旋转动画表现相关的,不含交互。</p>
<h3>组件能力描述</h3>
<p>此组件可控制目标对象的旋转表现</p>
<h3>组件设计描述</h3>
<p>组件的设计,在源头就需要抓清楚,抽象合理。如果将组件设计为小磁针动画组件,光从名字上看,就已经不合理了。小磁针动画组件,是专门针对小磁针而定制不具备通用性,这种组件不做也罢,如果做了就只服务于小磁针,没有必要浪费人力。我们在执行上,要坚持避免任何不合理抽象找借口,如果连组件名字都不能取准确,那这个组件根本没必要开发了。
而在抽象层面,至少应该往上提一个层级,比如抽象为旋转动画组件,这个组件可以拥有输入参数旋转终点向量、旋转速度、是否抖动等等,而这样设计,基本上可以覆盖大部分的旋转业务,比如小磁针的旋转、所有指针类的偏转(电流表、电压表、灵敏电流计)等等。</p>
<h3>组件接口和参数描述</h3>
<pre><code class="language-cpp">
/**
* 旋转目标(Unreal中的节点目标)
*/
SceneCompoment Target;
/**
* 旋转终点向量
*/
FVector EndRotationVector;
/**
* 是否支持抖动
*/
bool bEnableJitter = false;
/**
* 当前旋转角度([0,360]度)
*/
float CurrentAngle;
/**
* 执行 旋转动画
* Angle:旋转的欧拉角
*/
void Rotate(float Angle)
/**
* 执行 旋转动画
* Angle:旋转的欧拉角
* AngularVelocity:角速度
*/
void Rotate(float Angle, float AngularVelocity)
/**
* 暂定 旋转动画
*/
void Pause()
/**
* 恢复 旋转动画
*/
void Resume()
/**
* 停止 旋转动画
*/
void Stop()
// 定义多播委托,无返回值,带一个float参数表示旋转欧拉角度
//UE的多播委托是使用宏DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam来定义
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnRotationStarted, float, StartAngle);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnRotationInProgress, float, CurrentAngle);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnRotationEnded, float, EndAngle);
</code></pre>
<h3>组件业务规则</h3>
<ol>
<li>调用组件的Rotate后,当动画播放播放未结束,再次调用Rotate,则终止动画播放,转而播放新的旋转动画。</li>
</ol>
<h3>组件补充说明</h3>
<ol>
<li>旋转轴由<strong>约束组件</strong>负责处理</li>
<li>档位设定由<strong>交互组件</strong>负责处理</li>
<li>此组件主要负责旋转动画表现</li>
</ol>
<h3>组件用例描述</h3>
<ul>
<li>用例1:此组件可用于控制小磁针在磁场作用下的旋转表现。它能够根据磁场的方向和强度,动态调整磁针的旋转角度。
组件通过从器材那边获取到的磁学引擎提供的目标旋转向量,逐步调整磁针的方向以模拟真实的物理效果。</li>
</ul>
<p>> </p>
<ol>
<li>小磁针器材负责获取磁学引擎提供的<strong>旋转终点向量</strong>数据,并向[旋转动画组件]提供。</li>
<li>小磁针偏转表现,通过器材直接设定角速度参数是不合适的。计算小磁针在磁场中的偏转速度,可以使用角度差和对应的时间差来计算。</li>
<li>已有小磁针的偏转的旋转的deltaAngle算法总结如下:
3.1:获取当前磁场向量,通过磁学引擎组件获取
3.2:计算目标向量:将磁场向量投影到小磁针的本地Y轴平面上,得到目标向量
3.3:判断目标向量变化:如果目标向量发生变化,重新计算晃动后的目标向量
3.4:计算旋转角度:计算从当前向量到目标向量的旋转角度
3.5:计算旋转的deltaAngle</li>
</ol>
<ul>
<li>用例2:此组件也可用于指针类偏转的表现,如电流表、电压表和灵敏电流计。</li>
</ul>