Unreal Engine: usare FMath::FInterpConstantTo per interpolazioni costanti

๎€ฃ

25 Ottobre 2020

Il FMath::FInterpConstantTo interpola il float dalla Posizione attuale al Target desiderato con un andamento costante.

FMath::FInterpConstantTo, Riferimenti

Module 	Core
Header 	/Engine/Source/Runtime/Core/Public/Math/UnrealMathUtility.h
Include 	#include "Math/UnrealMathUtility.h"
Source 	/Engine/Source/Runtime/Core/Private/Math/UnrealMath.cpp

Sintassi:

 static float FInterpConstantTo
(
    float Current,
    float Target,
    float DeltaTime,
    float InterpSpeed
)
  • Current: il valore di partenza da cui si desidera iniziare l'interpolazione.
  • Target: il valore di destinazione a cui si desidera arrivare.
  • DeltaTime: il tempo trascorso tra un frame e l'altro, solitamente ottenuto dal frametime del gioco.
  • InterpSpeed: la velocitร  di interpolazione, che determina quanto rapidamente l'oggetto si sposterร  verso il valore di destinazione.

La funzione restituirร  il nuovo valore interpolato che puรฒ essere utilizzato per aggiornare l'oggetto o il parametro desiderato.

Esempio sulla rotazione

Nella classe corrente di MioScript.h:

 private:
      float TargetYaw = 90.f; 
      float InitialYaw = 0.f; 
      float CurrentYaw;

MioScript.cpp:

// Called every frame
void UMioScript::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
ย ย ย ย ย ย Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

ย ย ย ย ย ย // HERE BEGIN CODE
ย ย ย ย ย ย CurrentYaw = GetOwner()->GetActorRotation().Yaw;
ย ย ย ย ย ย FRotator OpenDoor(0.f, TargetYaw, 0.f);

ย ย ย ย ย ย /*
ย ย ย ย ย ย Change Yaw of OpenDoorย ย ย ย ย ย 
ย ย ย ย ย ย StartingYaw
ย ย ย ย ย ย TargetYaw: CurrentYaw
ย ย ย ย ย ย 0-1
ย ย ย ย ย ย */
ย ย ย ย ย ย OpenDoor.Yaw = FMath::FInterpConstantTo(CurrentYaw, TargetYaw, DeltaTime, 45);
ย ย ย ย ย ย GetOwner()->SetActorRotation(OpenDoor);
}

Questo รจ un esempio di codice all'interno di una funzione TickComponent di una classe chiamata UMioScript, che estende la classe base AActorComponent in Unreal Engine. Questa funzione viene chiamata ad ogni frame per aggiornare il componente.

Ecco una descrizione linea per linea del codice:

  1. Super::TickComponent(DeltaTime, TickType, ThisTickFunction); - Questa chiamata richiama l'implementazione della classe base per assicurarsi che la logica di aggiornamento di base venga eseguita correttamente.
  2. CurrentYaw = GetOwner()->GetActorRotation().Yaw; - Questa riga ottiene l'angolo di rotazione attuale (yaw) dell'oggetto proprietario del componente e lo assegna alla variabile CurrentYaw.
  3. FRotator OpenDoor(0.f, TargetYaw, 0.f); - Qui viene creato un oggetto FRotator chiamato OpenDoor con valori predefiniti di roll e pitch pari a 0 e un valore di yaw impostato sulla variabile TargetYaw.
  4. OpenDoor.Yaw = FMath::FInterpConstantTo(CurrentYaw, TargetYaw, DeltaTime, 45); - Questa riga utilizza la funzione FMath::FInterpConstantTo per calcolare un nuovo valore di yaw per l'oggetto OpenDoor. L'interpolazione costante viene utilizzata per spostare gradualmente il valore di CurrentYaw verso il valore di TargetYaw con una velocitร  di interpolazione di 45 unitร  al secondo. Il risultato viene quindi assegnato a OpenDoor.Yaw.
  5. GetOwner()->SetActorRotation(OpenDoor); - Questa riga imposta la rotazione dell'oggetto proprietario del componente sul valore di OpenDoor, applicando la rotazione calcolata nell'interpolazione costante.

In sostanza, questo codice viene utilizzato per creare un'animazione di transizione fluida della rotazione di un oggetto nel tempo. Ad ogni frame, la funzione TickComponent calcola un nuovo valore di rotazione per l'oggetto, spostandolo gradualmente da CurrentYaw a TargetYaw utilizzando l'interpolazione costante. Infine, viene impostata la nuova rotazione sull'oggetto.

Un altro esempio

Ed ecco un altro esempio di utilizzo della funzione FMath::FInterpConstantTo per interpolare un valore da 0 a 100 con una velocitร  di 50 unitร  al secondo:

float StartValue = 0.0f;
float TargetValue = 100.0f;
float InterpolationSpeed = 50.0f;

// Nel tuo ciclo di gioco o aggiornamento
float DeltaTime = ...; // Ottenere il tempo trascorso tra un frame e l'altro

float InterpolatedValue = FMath::FInterpConstantTo(StartValue, TargetValue, DeltaTime, InterpolationSpeed);

// Usa InterpolatedValue per aggiornare l'oggetto o il parametro desiderato

Questa funzione รจ molto utile quando si desidera creare animazioni o transizioni fluide tra valori nel corso del tempo, senza accelerazioni o decelerazioni.

Articoli recenti

Commenti recenti

  1. Massimiliano Ferretti su I Commenti

    Mi permetto di aggiungere una mia considerazione personale che ho riportato dall'utilizzo di C#. Personalmente mi piace commentare funzioni e…

  2. Personalmente ritengo che utilizzare git porti sempre dei vantaggi anche per lo sviluppo solo. Giร  solo la possibilitร  di fare…

  3. ciao, il link a discord non รจ piu valido, vorrei utilizzare il materiale che hai pubblicato tempo fa, come faccio?

"

Itamde รจ anche una scuola di programmazione online.

Itamde

Impara ciรฒ che desideri, al tuo ritmo

0 Commenti

Potrebbe interessarti anche...

Rimani aggiornato sulle ultime notizie e novitร 

Accedi ai contenuti riservati

Scopri il dietro le quinte dei nostri progetti, risorse esclusive e lo stato di avanzamento delle nostre creazioni in tempo reale.

Iscriviti alla newsletter

Ricevi le nostre notizie, le nostre riflessioni creative e le novitร  dell'atelier direttamente nella tua casella di posta elettronica.

Seguici

Unisciti alla nostra community sui social network per seguire i nostri progetti quotidiani e interagire con noi.