UE4在不開啟物理模擬的情況下如何模擬物體的自由掉落?
我能想到的只有自定重力加速度,tick裡算出速度,乘以deltaTime,求出單幀移動值,然後設定位置
每幀tick裡按重力算好位置設上去
如果題主是
想模擬物理掉落
的話,可以在Tick中用公式ma == mg來獲取掉落時每幀的位置,落地時獲取與地面碰撞的位置、方向、速度加上衰減係數(最終需要停下)來求出碰撞時的反作用力,但這些都是UE4裡面寫好了的。
如果題主是想在
桌子破碎時通知道具開啟物理模擬
,我嘗試過的有兩種方法:
一種使用藍圖實現:
把桌子上的物體寫為一個藍圖類 a,裡面補充一個開啟物理的函式。再把桌子寫為一個藍圖類 b,在桌子破碎時去呼叫a裡面開啟物理模擬的函式。
另一種用C++實現:
在桌子類中宣告一個多播委託:
DECLARE_DYNAMIC_MULTICAST_DELEGATE
(
FOnTableBroken
);
// FOnTbaleBroken為代理名稱,可視為變數型別使用
UCLASS
()
class
ATable
:
public
AActor
{
GENERATED_BODY
()
public
:
UPROPERTY
(
BlueprintAssignable
,
Category
=
“Events”
)
FOnTableBroken
OnTableBroken
;
}
然後在桌子破碎的地方呼叫
OnTableBroken。Broadcast();
再到桌子上需要模擬物理的物體類中加入一個函式
void APhysicalObject::OnBroken()
{
MeshComponent->SetSimulatePhysics(true);
}
最後到模擬物理類的建構函式中繫結委託
void APhysicalObject::APhysicalObject()
{
MyTable->OnTableBroken。AddDynamic(this, &APhysicalObject::OnBroken);
}
這樣每當桌子破碎時,Broadcast()函式會呼叫每一個與其繫結的函式,也就是開啟物件的物理模擬。
更新一下
題主還需要得到放置在桌子上的每一樣物品,且物品是不確定的。
所以可以在桌面上方增加一個碰撞元件,用來檢測桌面上有哪些物體。元件設定為OverlapAll(與所有物體重疊,視需要修改),獲取桌面上每一個與碰撞元件重疊的物體。
碰撞盒設定在桌面上方
然後到藍圖或C++中使用函式GetOverlappingActors獲取所有重疊的Actor(作為一個數組),之後題主對陣列中的物件進行遍歷設定相應內容就好了。
藍圖中的相應函式
這裡我將所有的碰撞物體名稱進行了列印。
看一下《程式碼本色》這本書就可以解開你的疑惑。
用向量就可以搞定,非常簡單。
這本書雖然是教processing程式設計程式碼(java的拓展語言)但是演算法邏輯到哪個語言都是一樣的,即便到unity也照樣有用。
這本書專門講述用程式碼模擬物理現實世界,包括粒子系統,流體運動,模擬生態系統等等。從零開始創造系統,不買收藏也值了。
買一本吧,