【UE5】基本的な数式【C++】

学んだこと、試したこと、気づいたことなどをまとめています。

数式

絶対値=Absolute Value
使い方

FMath::Abs(数値);

Round

使い方 C++

FMath::RoundToInt(数値);

👆小数点第一位を四捨五入して整数にする。

Blueprint

これは1を返す。

Floor

使い方 C++

FMath::FloorToInt(数値);

👆小数点以下切り捨て。

これは2を返す。

意味

値の取りうる値を制限する。
最小値を20、最大値を100にした場合、
200ならば最大値100より大きいので100になる。
50ならば範囲内なので50のまま。
-200ならば最小値20より小さいので20になる。

使い方(C++)

FMath::Clamp(変数, Min, Max);

スピードを取得する際にクランプする。

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
void MyActorSpeedClamp(AMyActor* MyActor, float& ClampedSpeed);

MyActor.cpp

void AMyActor::MyActorSpeedClamp(AMyActor* MyActor, float& ClampedSpeed)
{
const float MyActorSpeed = MyActor->Speed;
ClampedSpeed = FMath::Clamp(MyActorSpeed, 20.0f, 100.0f);
}

200に設定したが、クランプされて100のスピードになる。

Change Floatは前回自作したノード。

意味

向きを変えずにベクトルの大きさを1にする。

使い方

ベクトル.Normalize()

MyNormalize

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
void MyNormalize(FVector InVector, FVector& Normalized);

MyActor.cpp

void AMyActor::MyNormalize(FVector InVector, FVector& Normalized)
{
InVector.Normalize();
Normalized = InVector;
}

0.8を返す。

関連

👇UE標準のNormalizeノード

👇コード。GetSafeNormalという関数を使っている。Toleranceは許容差という意味。(あまりよく分かっていない。)

KISMET_MATH_FORCEINLINE
FVector UKismetMathLibrary::Normal(FVector A, float Tolerance)
{
return A.GetSafeNormal(Tolerance);
}

👇こんな処理をつくってみた。

この処理を実行したら、0が返ってきた。

👆これの場合は0.8を返す。
このベクトルの場合Toleranceの値が0.25以下ならば0.8、0.25より大きければ0を返すようだ。
細かい計算は良く分からないけど、大きさが小さなベクトルを0ベクトルとして近似することだけ理解しておく。

意味

線形補間=Linear Interpolation

これは13を返す。

👇Lerpノードの中身。式が明快で良い。

double UKismetMathLibrary::Lerp(double A, double B, double V)
{
	return A + V*(B-A);
}

V=0ならばA
V=1ならばB
その間は線形補間。
使うときはKismetMathLibraryのincludeをわすれないようにする。
線形でない補間も、数式を少し変えたら出来るはず。

回転行列

・X、Y、Zの出力は、回転後の前、右、上の方向を表している。
(左手系なので、X軸方向を前とするとY軸方向は右。)

👆Yから出力。入力ベクトルは(0,1,0)。

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
void MyRotationMatrix(FRotator InRot, FVector& X, FVector& Y, FVector& Z);

MyActor.cpp

void AMyActor::MyRotationMatrix(FRotator InRot, FVector& X, FVector& Y, FVector& Z)
{
X = FRotationMatrix(InRot).GetScaledAxis(EAxis::X);
Y = FRotationMatrix(InRot).GetScaledAxis(EAxis::Y);
Z = FRotationMatrix(InRot).GetScaledAxis(EAxis::Z);
}

Xの右辺は InRot.Vector(); と書いても多分同じ。

回転の単位はラジアンではなくて度。
UnrealEngineの座標系は左手系であることに注意。

Z➡Y➡Xの順に回転を適用しているので、Z軸まわりのRotationから調整すると混乱しないかも。
X軸まわり:反時計
Y軸まわり:反時計
Z軸まわり:時計

ベクトルを回転させる。

使い方

回転.RotateVector(ベクトル)

MyRotateVector

たぶん回転のさせ方はRotationMatrixと同じ。

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
FVector MyRotateVector(FRotator InRot, FVector InVec);

MyActor.cpp

FVector AMyActor::MyRotateVector(FRotator InRot, FVector InVec)
{
return InRot.RotateVector(InVec);
}

ほぼ(0,141,0)を返す。

そもそも初めからRotateVectorというノードが作られているので、自作する必要はない。
ただベクトルを回転させる処理自体は使いどころが多そうなので、コードの書き方を知れたのは良かった。

その他

読み方なるぽいんたー、など。

「ぬる」ではなくて、「なる」と僕は読むことにした。
発音記号nˈʌl

nullptr - cpprefjp C++日本語リファレンス
`nullptr`は、ヌルポインタ値を表すキーワードである。

https://wa3.i-3-i.info/word156.html

使い方

アクター名->GetActorLocation()

GetMyActorLocation。

MyActorの場所を取得するノードをつくってみた。使い道は特にない。GetActorLocationを使ってみたかっただけ。

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
FVector GetMyActorLocation(AMyActor* MyActor);

MyActor.cpp

FVector AMyActor::GetMyActorLocation(AMyActor* MyActor)
{
const FVector MyActorLocation = MyActor->GetActorLocation();
return MyActorLocation;
}

X座標をひたすら表示する処理。

使い方

クラス->変数名

スピードを取得する

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
float GetMyActorSpeed(AMyActor* MyActor);

MyActor.cpp

float AMyActor::GetMyActorSpeed(AMyActor* MyActor)
{
const float MyActorSpeed = MyActor->Speed;
return MyActorSpeed;
}

👇参考動画

UE4 – Blueprints to C++ Episode 0 – Introduction

Twitterしてます

ブログの更新をお知らせ

コメント

タイトルとURLをコピーしました