学んだこと、試したこと、気づいたことなどをまとめています。
数式
絶対値=Absolute Value
使い方
FMath::Abs(数値);
Round
使い方 C++
FMath::RoundToInt(数値);
👆小数点第一位を四捨五入して整数にする。
Blueprint
Floor
使い方 C++
FMath::FloorToInt(数値);
👆小数点以下切り捨て。
意味
値の取りうる値を制限する。
最小値を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);
}
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;
}
関連
👇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
👇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);
}
そもそも初めからRotateVectorというノードが作られているので、自作する必要はない。
ただベクトルを回転させる処理自体は使いどころが多そうなので、コードの書き方を知れたのは良かった。
その他
読み方なるぽいんたー、など。
「ぬる」ではなくて、「なる」と僕は読むことにした。
発音記号nˈʌl
使い方
アクター名->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;
}
👇参考動画
Twitterしてます
ブログの更新をお知らせ
コメント