AdvancedLocomotionSystemV使用 UnrotateVector 和 UnrotateVector 增加向量值的原因
Posted Tanzq-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AdvancedLocomotionSystemV使用 UnrotateVector 和 UnrotateVector 增加向量值的原因相关的知识,希望对你有一定的参考价值。
问题
在Calculate Axis Independent Lag 函数中作者为什么要使用 UnrotateVector 和 UnrotateVector 增加向量值?
不用不行吗?有什么偏差?
【AdvancedLocomotionSystemV】第二篇 C++ 实现镜头跟随人物缓慢移动
解决过程
经过不断询问和学习,终于懂了,非常感谢Up主五谷延年为我解答这个问题。
这里我们要使得CurrentLocation匀速的更新至TargetLocation(世界坐标系下的向量),就要用到LagSpeeds(向量增量),如果直接相加的话会有一些偏差:
在解释这个之前,先看一种情况:
首先在角色蓝图中添加此逻辑:
那么就会有:
箭头一直都在角色前面的这个效果。
现在对蓝图做一些调整:
效果:
UnRotateVector作用是让Vector A绕着原点逆时针旋转 B。
RotateVector作用是让Vector A绕着原点顺时针旋转 B。
知道了这个知识点,那么我们就可以进行探究,为什么能让箭头指向他的前面。
在X轴上加上100.f之后,我们再RotateVector旋转会去,这个时候这个点就会变成在角色的前方100.f的点。
UnrotateVector将世界坐标系变成局部坐标系,再来一次 RotateVector 将 会把局部坐标系变成世界坐标系。
也就实现了将局部坐标系增量
(
100.
f
,
0.
f
,
0.
f
)
(100.f, 0.f, 0.f)
(100.f,0.f,0.f)变成世界坐标增量值的效果。
现在回到项目示例中,理解起来就会简单很多。
我们想要的效果是局部坐标系下向量CurrentLocation缓慢移动至向量TargetLocation,先将CurrentLocation、TargetLocation 进行UnRotateVector操作,然后添加增值LagSpeed,最后RotateVector,操作实现!
先 RotateVector 后 UnRotateVector 也可以,只不过我们增长的值要设置为负值。
深入理解
- 我们观察UnrotateVector的源代码写法:
FVector FRotator::UnrotateVector(const FVector& V) const
return FRotationMatrix(*this).GetTransposed().TransformVector( V );
可以看到,它是先将FRotator类型的变量转换为旋转矩阵,旋转矩阵有一个特性就是,旋转矩阵是正交矩阵,所以他的转置等于他的逆。
接下来进行逆的求解,那为什么要求逆呢?
我们先理解逆变换:如果说向量A是逆时针旋转90°的变换,那么A的逆就是顺时针旋转90度的变换。也就是说,当前的值再求一次逆,等于啥也没做,也就是将旋转去掉了,就是如图所示的正方形正过来了:
那么我的点是不是也要转过来。
最后一步就是将点也转换过来。
(手动旋转,有点不水平,谅解一下~)
这个时候再对点进行增值就方便很多。
- 接下来观察RotateVector的源代码写法:
FVector FRotator::RotateVector(const FVector& V) const
return FRotationMatrix(*this).TransformVector( V );
这个很好理解了,就是当前修改后的FVector按照之前的旋转矩阵变换回去。
以上是关于AdvancedLocomotionSystemV使用 UnrotateVector 和 UnrotateVector 增加向量值的原因的主要内容,如果未能解决你的问题,请参考以下文章
AdvancedLocomotionSystemV第八篇 C++ 实现角色翻滚和跳跃动作
AdvancedLocomotionSystemV第八篇 C++ 实现角色翻滚和跳跃动作
AdvancedLocomotionSystemV第八篇 C++ 实现角色翻滚和跳跃动作
AdvancedLocomotionSystemV第七篇 C++ 实现角色蹲伏和跑步细节