侧滑:即物体沿着红线移动 而不是头朝着红线移动
而我们要做到的便是将红线方向的力分解成垂直和水平方向的力,通过添加水平方向反向力(绿色)来让物件朝着垂直方向移动
而要求出反向力(绿色)的大小,需要用到点积(DotProduct)(即给出一个方向向量,便可以求出待分解力在此方向上的力)
eg:
void UTankTrack::ApplySideForce() {
auto RootComponent = Cast<UPrimitiveComponent>(GetOwner()->GetRootComponent()); //找到组件
//找到坦克现在的移动方向和速度
auto TankVelocity = RootComponent->GetComponentVelocity();
auto RightVector = RootComponent->GetRightVector();
//找到坦克侧滑的速度
auto SideSpeed = FVector::DotProduct(RightVector, TankVelocity); //向量点乘,返回float值
//找到坦克侧滑对应的加速度
float DeltaTime = GetWorld()->GetDeltaSeconds();
auto SideSpeedAcceleration = SideSpeed / DeltaTime * GetRightVector()*-1; //通过RihgtVector的-1值来加向左的力
//F=ma
auto CorrectForce = (RootComponent->GetMass()*SideSpeedAcceleration)/2; //一个履带一个CorrectForce(有Left和Right在Tank上)
RootComponent->AddForce(CorrectForce);
}
PS:如果红线是左边,SideSpeed返回的就是负值,在SideSpeedAcceleration中还是会算出向右的反向力