您當前的位置:首頁 > 旅遊

UE4在不開啟物理模擬的情況下如何模擬物體的自由掉落?

作者:由 假作真時真亦假 發表于 旅遊時間:2020-08-05

UE4在不開啟物理模擬的情況下如何模擬物體的自由掉落?Lino-TA2020-08-05 14:25:35

我能想到的只有自定重力加速度,tick裡算出速度,乘以deltaTime,求出單幀移動值,然後設定位置

UE4在不開啟物理模擬的情況下如何模擬物體的自由掉落?quabqi2020-08-07 00:57:07

每幀tick裡按重力算好位置設上去

UE4在不開啟物理模擬的情況下如何模擬物體的自由掉落?Zarza Ng2020-08-11 13:32:36

如果題主是

想模擬物理掉落

的話,可以在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(與所有物體重疊,視需要修改),獲取桌面上每一個與碰撞元件重疊的物體。

UE4在不開啟物理模擬的情況下如何模擬物體的自由掉落?

碰撞盒設定在桌面上方

然後到藍圖或C++中使用函式GetOverlappingActors獲取所有重疊的Actor(作為一個數組),之後題主對陣列中的物件進行遍歷設定相應內容就好了。

UE4在不開啟物理模擬的情況下如何模擬物體的自由掉落?

藍圖中的相應函式

這裡我將所有的碰撞物體名稱進行了列印。

UE4在不開啟物理模擬的情況下如何模擬物體的自由掉落?

UE4在不開啟物理模擬的情況下如何模擬物體的自由掉落?知乎使用者2020-08-11 14:13:23

看一下《程式碼本色》這本書就可以解開你的疑惑。

用向量就可以搞定,非常簡單。

這本書雖然是教processing程式設計程式碼(java的拓展語言)但是演算法邏輯到哪個語言都是一樣的,即便到unity也照樣有用。

這本書專門講述用程式碼模擬物理現實世界,包括粒子系統,流體運動,模擬生態系統等等。從零開始創造系統,不買收藏也值了。

買一本吧,

標簽: 桌子  模擬  物理  函式  碰撞