【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按照之前的旋转矩阵变换回去。

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值