LoginSignup
5
3

More than 3 years have passed since last update.

UE4 PhysicalMaterialの設定と取得についてのメモ

Last updated at Posted at 2019-11-02

概要

UnrealEngine の 物理マテリアル(PhysicalMaterial) の設定と取得についてのメモです。
単純なコリジョン(SimpleCollision)と複雑なコリジョン(ComplexCollision)のケースがあるようです。

更新履歴

日付 内容
2021/02/26 サーフェイス型の追加設定について追記

環境

Windows10
Visual Studio 2017
UnrealEngine 4.22

参考

以下を参考にさせて頂きました、ありがとうございます。
物理マテリアルのユーザーガイド
ueHow - HitResult
UE4における大規模背景制作事例(コリジョン編)

物理マテリアル

コンテンツブラウザから[フィジックス] -> [物理マテリアル]で作成できます。
PhysicsMaterialAsset.jpg

物理マテリアルの取得 - ライントレースでのブロックヒット取得

ライントレースを使ってコリジョンを調べます。結果が HitResultに返ってきます。
他のトレース系もほぼ一緒だと思われます。

LineTraceBP.png

C++コードだと以下の様になります。

FVector _St;
FVector _Ed;
FHitResult HitResult;
TArray<AActor*> ActorsToIgnore;

// _Stから_EdまでのライントレースをしてぶつかったSimpleCollisionを取得する
UKismetSystemLibrary::LineTraceSingle(GetWorld(), _St, _Ed, UEngineTypes::ConvertToTraceType(ECollisionChannel::ECC_Visibility),
false, ActorsToIgnore, EDrawDebugTrace::None, _HitResult, true);

HitResultは以下のようなメンバを持ち、PhysMat にて物理マテリアルを取得できます。
HitResult_Detail.jpg

C++コードだと以下の様になります。

// 物理マテリアルを取得する例
auto _PhysMat = _HitResult.PhysMaterial;
if (_PhysMat != nullptr) {
 // アセット名を表示
 UE_LOG(LogTemp, Log, TEXT("%s"), *_PhysMat->GetName());
}

物理マテリアルの設定

SimpleCollision用の設定

単純なコリジョンの場合は、コンポーネントの [Collision] -> [Phys Material Override] に物理マテリアルを設定することで取得ができます。
空欄の場合に取得をするとエンジンの DefaultPhysicalMateral が返ってくるようです。

SimpleCollisionSetting.png

スタティックメッシュに設定する場合、[Simple Collison Physical Material]に設定します。
SimpleCollisionSetting_Mesh.png

ComplexCollision用の設定

複雑なコリジョンの場合はマテリアルの[Physical Material] -> [Phys Material] に設定します。

MaterialSetting.png

この場合、HitResultを取得するためのトレースも ComplexCollisionに対して行わないと取得できません。
(LineTraceSingle()の場合は、第5引数 bTraceComplex を true にする)

[Return Material on Move]設定について

コリジョンの設定[Return Material on Move]についてですが、このチェックを入れないと HitResult で PhysicalMaterial を取得できないかと思ったのですが、床などのスタティックなものについてはチェック不要のようです。

ReturnMaterialOnMove.jpg

PhysicalMaterialクラスの継承について

物理マテリアルクラスを継承して、必要なメンバを追加できます。

以下、float を1つ追加しているだけのコード例です。

MyPhysicalMaterial.h
#pragma once

#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "UObject/Object.h"
#include "Engine/EngineTypes.h"
#include "EngineDefines.h"
#include "PhysxUserData.h"
#include "Vehicles/TireType.h"
#include "PhysicsEngine/PhysicsSettingsEnums.h"
#include "Physics/PhysicsInterfaceCore.h"
#include "PhysicalMaterials/PhysicalMaterial.h"
#include "MyPhysicalMaterial.generated.h"

class UPhysicalMaterial;

UCLASS(BlueprintType, Blueprintable, CollapseCategories, HideCategories = Object)
class TEST_API UMyPhysicalMaterial : public UPhysicalMaterial
{
    GENERATED_UCLASS_BODY()

public:
    // 追加パラメータ
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "AddParam")
    float       AddParam;

};

cppはコンストラクタで追加パラメータを初期化してあるだけです。

MyPhysicalMaterial.cpp
// コンストラクタ
UMyPhysicalMaterial::UMyPhysicalMaterial(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{
    Friction = 1.0f;
    AddParam = 1.5f;
}

物理マテリアル作成時に継承したMyPhysicalMaterialクラスが選択できるようになります。
MyPhysicalMaterial.png

物理設定について

サーフェイス型の追加設定

[プロジェクト設定] -> [エンジン/物理] -> [Physical Surface]
にてカスタムのサーフェイス型を設定することができます。

MyPhysucalSurface.jpg

ここで設定したサーフェイス型が物理マテリアルアセットのフィジカルプロパティSurfaceTypeとして設定ができるようになります。

PMSetting.jpg

まとめ

コリジョンの形状によって設定がかわるため、最初うまく情報が取得できず混乱しました。まとめてみると理解ができます。
あとは物理マテリアルの設定がされているかどうかを簡単に確認できるような手法が欲しい所です。(ビューの表示切り替え辺りでできるように)

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3