La Trasformazione di un'entità Scene Graph definisce la traslazione (posizione), la rotazione (orientamento), e la scala di un'entità. Per trasformare un'entità Scene Graph, l'entità deve avere un transform_component. Il transform_component contiene due campi che puoi modificare tramite UEFN o codice Verse:
Origine: origine opzionale da cui viene calcolato LocalTransform.
LocalTransform: una
(/Verse.org/SpatialMath:)transformrelativa al genitore dell'entità o a Origine se è impostato il campo opzionale Origine.
L'origine di un'entità è l'entità da cui viene calcolato il LocalTransform di transform_component di un'entità. Questo è il valore del campo Origine se il campo Origine di transform_component è impostato, o del genitore dell'entità nella gerarchia del Scene Graph se il campo Origine non è impostato.
È importante distinguere tra Trasformazione e transform_component. Una trasformazione è un tipo di dati composito definito nel modulo /Verse.org/SpatialMath che memorizza le seguenti quantità nel sistema di coordinate Sinistra-Su-Avanti (LUF):
Traslazione (
vector3): la posizione di un oggetto.Rotazione (
rotation): l'orientamento dell'oggetto.Scala (
vector3): le dimensioni dell'oggetto.
transform_component è una classe Verse definita nel modulo /Verse.org/SceneGraph che memorizza LocalTransform di un'entità Scene Graph e, facoltativamente, un'origine alternativa. Puoi pensare a transform_component come a un contenitore fornito a un'entità per una trasformazione che ne definisce la posizione nella simulazione.
Trasformazioni Verse
Scene Graph utilizza le trasformazioni del modulo /Verse.org/SpatialMath . Le trasformazioni dei moduli Verse utilizzano il sistema di coordinate LUF destrorsi. Per costruire una trasformazione di Verse, puoi utilizzare l'archetipo della classe e i metodi integrati per la creazione delle rotazioni.
# Transform specifying all fields
MyTransform:transform = transform:
Translation := vector3{Left := 2.0, Up := -4.0, Forward := 8.0}
Rotation := MakeRotationFromEulerDegrees(-90.0, 180.0, 0.0)
Scale := vector3{Left := 2.0, Up := 4.0, Forward := 2.0}
# Transform specifying only Translation
MyOtherTransform:transform = transform:
Translation := vector3{Up := 512.0}
Per maggiori informazioni sul sistema di coordinate in UEFN, consulta la pagina Sistema di coordinate Sinistra-Su-Avanti. Ciò include anche informazioni sulla conversione tra le trasformazioni XYZ nel modulo /UnrealEngine.com/Temporary/SpatialMath e la trasformazione del modulo Verse.
Costruire un'entità con transform_component
Puoi costruire un'entità nell'outliner UEFN o tramite Verse.
In UEFN
Puoi aggiungere rapidamente un'entità Scene Graph al tuo progetto tramite il menu Posiziona attori.
Quando aggiungi un'entità Scene Graph al tuo progetto tramite il menu Posiziona attori, l'entità è dotata di transform_component per impostazione predefinita.
Se lo desideri, puoi rimuovere transform_component andando all'entità posizionata di recente nel pannello Outliner, trovando transform_component e selezionando Rimuovi componente.
Di seguito puoi vedere che l'entità in questione non ha più un transform_component.
In Verse
Quando crei un'entità Scene Graph tramite il codice Verse con l'archetipo della classe:
MyEntity:entity = entity{}L'entità non è dotata di transform_component. Al contrario, è necessario aggiungere un transform_component all'entità. I metodi preferiti per utilizzare le trasformazioni sono SetLocalTransform e SetGlobalTransform. Queste funzioni gestiscono contemporaneamente la creazione del transform_component, l'impostazione dei valori e l'aggiunta del componente trasformazione all'entità.
MyEntity:entity = entity{}
# Add entity to simulation entity so MyEntity begins simulating when play begins
if (SimEntity := Entity.GetSimulationEntity[]):
SimEntity.AddEntities(array{MyEntity})
# Identity transform
IdentityTransform:transform = transform:
Translation := vector3{Left := 0.0, Up := 0.0, Forward := 0.0}
Rotation := MakeRotationFromEulerDegrees(0.0, 0.0, 0.0)
Puoi anche aggiungere il componente direttamente con AddComponents:
# Add entity to simulation entity so MyEntity begins simulating when play begins
if (SimEntity := Entity.GetSimulationEntity[]):
SimEntity.AddEntities(array{MyEntity})
# Use AddComponents
MyEntity.AddComponents(array{ transform_component{ Entity := MyEntity }})
# Same as above, but more readable if adding multiple components at once
MyEntity.AddComponents of array:
transform_component{Entity := MyEntity}Altri metodi per aggiungere un transform_component a un'entità Scene Graph tramite il codice Verse sono illustrati nella sezione Utilizzo di transform_component in Verse.
Come viene calcolata la trasformazione di un'entità
L'operazione più importante che puoi eseguire su un'entità Scene Graph con transform_component è ottenere o impostare la trasformazione di un'entità.
Ci sono due tipi di trasformazione che potrebbero interessarti: trasformazione locale e trasformazione globale. Per manipolare in modo efficace la trasformazione di un'entità, è importante capire come vengono calcolate queste trasformazioni.
La trasformazione locale è la trasformazione rispetto all'origine di un'entità. La trasformazione locale di qualsiasi entità Scene Graph è il valore del campo LocalTransform su transform_component dell'entità Scene Graph.
La trasformazione globale è la trasformazione rispetto all'origine del sistema di coordinate LUF nello spazio globale. La trasformazione globale di un'entità Scene Graph viene calcolata componendo la LocalTransform di un'entità con:
La trasformazione globale del genitore dell'entità se il campo Origine non è impostato sul transform_component dell'entità, o
La trasformazione globale dell'origine dell'entità se il campo Origine è impostato sul transform_component dell'entità.
Di seguito viene illustrato un esempio di questo usando la traslazione senza rotazione o ridimensionamento in modo che le trasformazioni risultanti possano essere calcolate aggiungendo traslazioni. Poiché in questo esempio si presuppone che la rotazione e la scala siano lasciate come rispettive identità in tutte le trasformazioni, l'abbreviazione viene utilizzata per fare riferimento alla trasformazione di un'entità dal vettore di traslazione della trasformazione dell'entità.
Considera tre entità Scene Graph organizzate come segue:
BaseEntity: LocalTransform (0.0, 0.0, 0.0) nel sistema di coordinate LUF.
A: LocalTransform (750.0, 100.0, 0.0)
B: LocalTransform (-250.0, 100.0, 0.0)
Di seguito sono riportate le tre entità in una scena in cui BaseEntity non ha mesh_component, A è un cubo e B è un cono:
Ad esempio, supponiamo di voler determinare sia la trasformazione locale che la trasformazione globale dell'entità B. La trasformazione locale è rapida da vedere: è il valore del campo LocalTransform dell'entità B transform_component come mostrato di seguito:
La trasformazione locale dell'entità B è (-250.0, 100.0, 0.0).
Per calcolare la trasformazione globale dell'entità B, devi tracciare la gerarchia dell'entità B fino all'entità di simulazione e comporre le trasformazioni a partire dall'entità di simulazione, quindi fino all'entità B. L'entità di simulazione è la radice della simulazione corrente in cui tutte le altre entità di simulazione sono figlie.
Questi sono i passaggi per calcolare la trasformazione globale dell'entità B:
L'entità di simulazione è la radice della simulazione corrente.
Trasformazione globale dell'entità di simulazione: (0.0, 0.0, 0.0).
BaseEntity è un elemento figlio dell'entità di simulazione. BaseEntity ha una trasformazione locale di (0.0, 0.0, 0.0) come mostrato nell'immagine 1.0. Componendo la trasformazione globale dell'entità di simulazione con la trasformazione locale di BaseEntity si ottiene:
Trasformazione globale BaseEntity: (0.0, 0.0, 0.0) + (0.0, 0.0, 0.0) = (0.0, 0.0, 0.0).
L'entità A è figlia di BaseEntity. L'entità A ha una trasformazione Locale di (750.0, 100.0, 0.0) come mostrato nell'immagine 1.1. Componendo la trasformazione globale di BaseEntity con la trasformazione della posizione dell'entità A si ottiene:
Trasformazione globale dell'entità A: (0.0, 0.0, 0.0) + (750.0, 100.0, 0.0) = (750.0, 100.0, 0.0).
L'entità B è figlia dell'entità A. L'entità B ha una trasformazione Locale di (-250.0, 100.0, 0.0) come mostrato nell'immagine 1.2. Componendo la trasformazione globale di A con la trasformazione di posizione dell'entità B si ottiene:
Trasformazione globale dell'entità B: (750.0, 100.0, 0.0) + (-250.0, 100.0, 0.0) = (500.0, 200.0, 0.0).
Pertanto la trasformazione globale dell'entità B è (500.0, 200.0, 0.0) nel sistema di coordinate LUF.
Utilizzo di transform_component nell'editor
Utilizzando LocalTransform e Origine, puoi manipolare la trasformazione di un'entità.
Trasformazione locale
Il campo LocalTransform di transform_component di un'entità è la (/Verse.org/SpatialMath:)transform di un'entità rispetto alla sua origine. Se il campo Origine non è esplicitamente impostato, l'Origine di un'entità è impostata sul genitore nella gerarchia del Scene Graph. Il campo LocalTransform è un campo modificabile che appare in UEFN quando modifichi direttamente un'entità:
Traslazione: posizione relativa al suo genitore o all'origine definita manualmente.
Modifica la traslazione di un'entità per spostarla all'interno del livello.
Rotazione: orientamento relativo al suo genitore o all'origine definita manualmente.
Modifica la rotazione di un'entità per ruotarla attorno al punto cardine dell'entità.
Scala: dimensione relativa al suo genitore o all'origine definita manualmente.
Modifica la scala di un'entità per ingrandirla o ridurla.
Origine
L'origine di transform_component di un'entità è l'oggetto rispetto al quale viene calcolato LocalTransform. Questo campo di transform_component è opzionale. Per impostazione predefinita, LocalTransform di transform_component è la trasformazione dell'entità basata sull'origine dell'entità, calcolata rispetto all'entità genitore dell'entità proprietaria. Facoltativamente, puoi impostare il campo Origine su transform_component di un'entità per calcolare il LocalTransform rispetto a un oggetto diverso dal genitore dell'entità.
Ad esempio, puoi impostare l'origine di un'entità in modo che sia un'entità completamente diversa. Puoi impostare questo campo con qualsiasi classe che implementa l'interfaccia origine Verse. In particolare, per impostare il campo Origine su un'altra entità Scene Graph, scegli la classe entity_origin , quindi seleziona l'entità che vuoi che sia la nuova origine.
È importante distinguere tra Origine rispetto a transform_component e Origine del sistema di coordinate LUF. L'origine del sistema di coordinate LUF è il punto nello spazio del mondo con traslazione (0.0, 0.0, 0.0).
L'origine di transform_component di un'entità è la posizione in cui si trova un'entità se il transform_component LocalTransform dell'entità ha traslazione (0.0, 0.0, 0.0).
Di seguito viene illustrato un esempio di come funzionano in pratica il campo Origine e LocalTransform. Considera una BaseEntity situata all'origine dello spazio mondo con l'entità figlio A rappresentata dal cubo mesh_component e l'entità figlia B rappresentata dal cono mesh_component.
Come si può vedere nell'immagine sopra, BaseEntity si trova all'origine dello spazio mondo poiché il suo campo Origine è disattivato in transform_component e LocalTransform è impostato all'origine dello spazio mondo.
Come mostrato di seguito, puoi vedere che anche il campo Origine dell'entità A è disattivato, quindi LocalTransform viene calcolato rispetto al transform_component del suo genitore, BaseEntity.
Poiché BaseEntity si trova all'origine dello spazio mondo e la traslazione di LocalTransform dell'entità A è impostata su vector3{Left := 750.0, Up := 100.0, Forward := 0.0}, l'entità A si trova a vector3{Left := 750.0, Up := 100.0, Forward := 0.0}. La rotazione e la scala dell'entità A rimangono invariate poiché la rotazione e la scala di LocalTransform su BaseEntity sono le rispettive identità.
Nell'immagine seguente, puoi vedere che l'entità B, che è anche figlia di BaseEntity, ha il suo campo Origine sul suo transform_component impostato come entità A.
Di conseguenza, il campo LocalTransform dell'entità B sul suo transform_component è relativo alla trasformazione calcolata dell'entità A. Poiché LocalTransform dell'entità B è impostato su vector3{Left := -250.0, Up := 100.0, Forward := 0.0} e LocalTransform dell'entità A è impostato su vector3{Left := 750.0, Up := 100.0, Forward := 0.0}, la trasformazione globale dell'entità B è vector3{Left := 500.0, Up := 200.0, Forward := 0.0}.
Se modifichi il componente rotazione del campo LocalTransform dell'entità A transform_component a -90.0 gradi intorno all'asse Avanti, anche l'entità B ruota di -90.0 gradi intorno all'asse Avanti. Questo perché anche la rotazione di un figlio viene ereditata dal genitore.
Utilizzo di transform_component in Verse
Puoi verificare se un'entità ha un transform_component con GetComponent:
MyEntityNoTransform:entity = entity{}
if (SimEntity := Entity.GetSimulationEntity[]):
SimEntity.AddEntities(array{MyEntityNoTransform})
MyEntityWithTransform:entity = entity{}
MyEntityWithTransform.AddComponents of array:
transform_component{Entity := MyEntityWithTransform}
if (SimEntity := Entity.GetSimulationEntity[]):
Invece di recuperare transform_component con GetComponent e utilizzare direttamente transform_component, il modo consigliato per interagire con transform_component è attraverso i metodi di estensione dell'entità.
Trasforma
Puoi impostare direttamente la trasformazione locale o globale dell'entità con i metodi di estensione dell'entità SetLocalTransform o SetGlobalTransform.
MyEntity:entity = entity{}
MyTransform:transform = transform{}
if (SimEntity := Entity.GetSimulationEntity[]):
SimEntity.AddEntities(array{MyEntity})
# Set the local transform
MyEntity.SetLocalTransform(MyTransform)
MyOtherEntity:entity = entity{}
Questi metodi di estensione rappresentano il modo migliore per impostare la trasformazione di un'entità Scene Graph nel codice Verse. Questi metodi impostano in modo esplicito la trasformazione locale (rispetto al genitore dell'entità) o globale (rispetto all'origine del mondo) dell'entità in questione. Se l'entità non ha un transform_component quando viene chiamata una di queste funzioni, un transform_component viene creato e aggiunto implicitamente all'entità. Dopo una di queste chiamate di funzione, l'entità ha ora un transform_component. Puoi confermarlo con una chiamata successiva a GetComponent.
if (MyEntity.GetComponent[transform_component]):
# success, entity has a transform_component
else:
# failure, entity does not have a transform_component
Utilizzando i metodi di estensione, puoi ottenere la trasformazione locale o globale del transform_component associato a un'entità. GetLocalTransform restituisce la trasformazione di un'entità rispetto all'entità genitore o al campo Origine specificato, se impostato. Se l'entità non ha un transform_component, questa funzione restituisce la trasformazione di identità.
# Entity object
MyEntity:entity = entity{}
if (SimEntity := Entity.GetSimulationEntity[]):
SimEntity.AddEntities(array{MyEntity})
# Obtain the local transform with respect to Parent or Origin (if set)
EntityLocalTransform := MyEntity.GetLocalTransform() # no transform component, returns identity
MyOtherEntity:entity = entity{}
GetGlobalTransform restituisce la trasformazione di un'entità rispetto all'origine del mondo. Se l'entità non ha un transform_component, questa funzione restituisce la trasformazione globale dell'antenato più vicino con un transform_component.
# Entity object
MyEntity:entity
if (SimEntity := Entity.GetSimulationEntity[]):
SimEntity.AddEntities(array{MyEntity})
# Obtain the global transform
EntityGlobalTransform := MyEntity.GetGlobalTransform() # returns global transform of Simulation Entity
Origine
Puoi utilizzare i metodi di estensione delle entità anche per le operazioni che coinvolgono il campo Origine di transform_component. Puoi direttamente impostare il campo Origine del transform_component della tua entità con il metodo di estensione dell'entità SetOrigin.
MyEntity:entity = entity{}
MyOtherEntity:entity = entity{}
if (SimEntity := Entity.GetSimulationEntity[]):
SimEntity.AddEntities(array{MyEntity, MyOtherEntity})
MyEntity.SetLocalTransform(transform{Translation := vector3{Left := 100.0}})
# Construct an entity_origin object and set the new origin of MyEntity to MyOtherEntity
NewOrigin:entity_origin = entity_origin{Entity := MyOtherEntity}
Per ottenere l'origine di un'entità nel codice Verse, utilizza GetOrigin.
MyEntity:entity = entity{}
if (SimEntity := Entity.GetSimulationEntity[]):
SimEntity.AddEntities(array{MyEntity})
if (OriginValue := MyEntity.GetOrigin[]):
# should not succeed
else:
# should fail, no transform_component on entity MyEntity
GetOrigin decide se un'entità ha il suo campo Origine impostato e, in caso affermativo, restituisce il valore di quel campo. In caso contrario, la chiamata non riesce. In caso di esito positivo, il tipo restituito di GetOrigin è un oggetto origine, una classe Verse che implementa l'interfaccia di origine. Questa interfaccia fornisce una singola funzione GetTransform per ottenere la trasformazione dell'origine specificata dell'entità. Puoi anche verificare se il campo Origine alternativo è impostato su un'entità e determinare quale entità è impostata come origine della tua entità.
if:
OriginValue := MyOtherEntity.GetOrigin[] # get Origin object
OriginEntityCast := entity_origin[OriginValue] # cast to entity_origin
then:
# Obtain the entity that is set as MyOtherEntity's Origin field on its transform_component
MyOtherEntityOrigin := OriginEntityCast.Entity
# Obtain the origin's transform
TransformOfOrigin := OriginEntityCast.GetTransform()
Infine, puoi reimpostare il campo Origine di transform_component di un'entità con ResetOrigin.
MyEntity.ResetOrigin()Dopo aver chiamato ResetOrigin, il campo Origine di transform_component di MyEntity viene reimpostato e la trasformazione di MyEntity viene ora calcolata rispetto all'entità genitore di MyEntity nella gerarchia del Scene Graph.
Componenti dipendenti
Alcuni altri componenti di Scene Graph dipendono da transform_component per funzionare. Questi includono:
light_component e le relative classi figlie
mesh_component
partition_system_component
Se aggiungi uno di questi componenti a un'entità Scene Graph che non ha già un transform_component, il transform_component viene aggiunto all'entità per impostazione predefinita.
Nota sulle trasformazioni XYZ
Le trasformazioni che utilizzano il sistema di coordinate XYZ esistono ancora nel modulo Verse /UnrealEngine.com/Temporary/SpatialMath . Queste trasformazioni sono ancora utilizzate dai dispositivi e dagli oggetti scenografici di modalità Creativa di Fortnite nel modulo Verse /Fortnite.com . Per maggiori informazioni sullo stato di queste trasformazioni e sulla conversione tra diversi tipi di trasformazioni in Verse, consulta la pagina Sistema di coordinate Sinistra-Su-Avanti.