效果如下:
原理是代码手动模拟物理变化(可能和引擎的物理计算结果有所偏差,不适用高精度的模拟)
百度百科抛体运动:
https://baike.baidu.com/item/%E6%8A%9B%E4%BD%93%E8%BF%90%E5%8A%A8/6796509
参数说明:
参数 | 意义 |
---|---|
FromLocation | 起始场景坐标 |
Velocity | 速度大小 |
gravity | 重力大小(引擎默认为980) |
n | 抛物线线段数目 |
代码如下:
DrawPreviewLine(const FVector& FromLocation, const FVector& Velocity, float gravity,int n)
{
const float ZAxisVelocity=Velocity.Z;
const FVector2D XYAxisVelocity=FVector2D(Velocity.X,Velocity.Y);
constexpr float Dt=0.05f;
for(float t=0;t<=n*Dt;t+=Dt)
{
bool End=0;
const float Z0=ZAxisVelocity*t-0.5*gravity*t*t;
const FVector2D XY0=XYAxisVelocity*t;
const float Z1=ZAxisVelocity*(t+Dt)-0.5*gravity*(t+Dt)*(t+Dt);
const FVector2D XY1=XYAxisVelocity*(t+Dt);
FVector Point0=FVector(XY0,Z0)+FromLocation;
FVector Point1=FVector(XY1,Z1)+FromLocation;
FHitResult HitResult;
GetWorld()->LineTraceSingleByChannel(HitResult,Point0,Point1,ECC_Visibility);
if(HitResult.GetActor())
{
End=true;
Point1=HitResult.Location;
GEngine->AddOnScreenDebugMessage(2,3.0f,FColor::Blue,HitResult.ToString());
}
DrawDebugLine(GetWorld(),Point0,Point1,FColor::Red,false,-1,0,3);
if(End)
{
DrawDebugSphere(GetWorld(),Point1,5.0f,10,FColor::Blue);
break;
}
}
}
蓝图调用