Unreal Engine: usare FMath::FInterpConstantTo per interpolazioni costanti



25 Ottobre 2020

Unreal Engine c++

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…

Le novità di Itamde Studio – Ottobre 2025

Le novità di Itamde Studio – Ottobre 2025

Tra creazioni, libri e un po’ di magia artigianale L’autunno è arrivato e Itamde Studio prosegue la sua stagione creativa con la consueta energia poliedrica: tra scrittura, web, video, artigianato e nuovi progetti in vista dei mercatini di fine anno. Questo mese di...

Cos’è il gamedev?

Cos’è il gamedev?

La parola “gamedev” gira ovunque: nei forum, su YouTube, nei CV e negli annunci di lavoro. Ma cosa significa davvero? Dietro questo termine c’è tutto un mondo, quello dello sviluppo di videogiochi, che unisce tecnica, arte e narrazione. Le origini del gamedev Lo...

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.