力和扭矩
UE4中的力与我们生活中所学的力的概念相同,同时这个力是遵循牛顿力学的规则的,在UE4中,我们的力并不是直接施加在我们的物体整体上,而是要施加在这个物体的模型组件上。
UE4中的扭矩是给予我们的模型一个进行旋转的力,类似于用鞭子去抽一个陀螺,抽了之后施加给了这个陀螺一个可以让他旋转的力,而陀螺也就旋转了起来。
无论是力还是扭矩,我们都需要让这个力或者扭矩施加在Actor的模型上,也就是UStaticMeshComponent或者USkeletalMeshComponent上,而这两个组件是继承于UMeshComponent的,而UMeshComponent是继承于UPrimitiveComponent,我们添加力和扭矩的方法都是定义在UPrimitiveComponent中的。
在C++中添加力和扭矩
以UStaticMeshComponent为例:
首先我们需要定义模型组件
UPROPERTY(VisibleAnywhere,BlueprintReadWrite)
UStaticMeshComponent *STMesh;
在其CPP文件对应位置
// 添加力,传入一个Vector三维向量,分别对应X,Y,Z三个轴
STMesh->AddForce(FVector(0));
// 添加扭矩,传入一个Vector三维向量,分别对应X,Y,Z三个轴
STMesh->AddTorque(FVector(0));
无论是添加力还是扭矩,我们要注意打开模型组件的物理模拟,否则无论如何施加都不会起作用。将物体拖入场景中,选中物体的模型组件,在Physics下将模拟物理勾选上,如下图:

AddTorque和AddLocalRotation的区别
如果让物体旋转,我们有AddTorque和AddLocalRotation这两种方法,使用AddTorque,添加一个扭矩让其旋转起来,使用AddLocalRotation,如果我们每一帧都让Rotation值变化,那么物体也就旋转起来了,但是要注意,AddLocalRotation是修改旋转值,在Tick函数下是一直旋转的,而且是匀速旋转,例如:
Tick(float DeltaTime){
Super::Tick(DeltaTime);
Mesh->AddLocalRotation(FRotation(DeltaTime * 60.f,0.f,0.f));
}
但是如果使用的是AddTorque,在Tick函数下,那么这个物体会越转越快,这是模拟的物理,旋转的时候会出现惯性,而放在Tick函数下,那么我们每一帧都会对这个物体施加一个让它旋转的力,而由于惯性的存在,这个物体将会越转越快,代码示例如下:
Tick(float DeltaTime){
Super::Tick(DeltaTime);
Mesh->AddTorque(FVector(60.f,0.f,0.f));
}