Przekształcenie jednostki Scene Graph definiuje translację (lokalizację), obrót (orientację) i skalę (rozmiar). Aby można było przekształcić jednostkę Scene Graph, jednostka musi mieć transform_component. transform_component zawiera dwa pola, którymi można manipulować za pomocą kodu UEFN lub Verse:
Początek: Opcjonalny początek, na podstawie którego obliczana jest wartość LocalTransform.
LocalTransform:
(/Verse.org/SpatialMath:)transformwzględne do obiektu bazowego jednostki nadrzędnej lub do Początku, jeśli ustawiono opcjonalne pole Początek.
Początkiem jednostki jest jednostka, z której obliczane jest LocalTransform komponentu transform_component jednostki. Jest to wartość pola Początek, jeśli pole Początek w transform_componentis jest ustawione, lub wartość nadrzędna jednostki w hierarchii Scene Graph, jeśli pole Początek nie jest ustawione.
Ważne jest, aby rozróżnić przekształcenie i transform_component. Przekształcenie jest złożonym typem danych zdefiniowanym w /Verse.org/SpatialMath moduł, który przechowuje następujące ilości w układzie współrzędnych Left-Up-Forward (LUF):
Translacja (
vector3): Lokalizacja obiektu.Obrót (
obrót): Orientacja obiektu.Scale (
vector3): Rozmiar obiektu.
transform_component jest klasą Verse zdefiniowaną w /Verse.org/SceneGraph Moduł przechowujący wartość LocalTransform jednostki Scene Graph i, opcjonalnie, alternatywny Początek. Komponent transform_component można traktować jako kontener przekazywany jednostce na potrzeby przekształcenia, które definiuje jej miejsce w symulacji.
Przekształcenia Verse
Scene Graph używa przekształceń modułu /Verse.org/SpatialMath. Przekształcenia modułu Verse używają praworęcznego układu współrzędnych LUF. Aby skonstruować przekształcenie Verse, możesz użyć archetypu klasy i wbudowanych metod do tworzenia obrotów.
# 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}
W celu uzyskania dodatkowych informacji na temat układu współrzędnych w UEFN przeczytaj stronę Układ współrzędnych od lewej do góry. Obejmuje to również informacje na temat konwersji między przekształceniem XYZ w module /UnrealEngine.com/Temporary/SpatialMath i przekształceniem modułu Verse.
Zbuduj jednostkę z transform_component
Jednostkę można skonstruować w Outlinerze UEFN lub za pomocą Verse.
W UEFN
Możesz szybko dodać jednostkę Scene Graph do projektu za pomocą menu Umieść aktorów .
Gdy dodajesz jednostkę Scene Graph do projektu za pomocą menu Umieść aktorów, jednostka jest domyślnie wyposażona w transform_component.
Jeśli chcesz, możesz usunąć transform_komponent, przechodząc do ostatnio umieszczonej jednostki w Panelu Outlinera, wyszukując transform_komponent i wybierając Usuń komponent.
Poniżej widać, że dana jednostka nie ma już transform_component.
W Verse
W przypadku tworzenia jednostki Scene Graph w kodzie Verse i archetypu klasy:
MyEntity:entity = entity{}Jednostka nie jest wyposażona w transform_component. Zamiast tego do jednostki należy dodać transform_component. Preferowanymi metodami pracy z przekształceniami są SetLocalTransform i SetGlobalTransform. Te funkcje obsługują tworzenie komponentu przekształcenia, ustawianie wartości i jednoczesne dodawanie komponentu przekształcenia do jednostki.
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)
Komponent można również dodać bezpośrednio, korzystając z 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}Dodatkowe metody dodawania transform_component do jednostki Scene Graph za pomocą kodu Verse omówiono w sekcji Praca z transform_component w Verse.
Sposób obliczania przekształcenia jednostki
Najważniejszą operacją, jaką można wykonać na jednostce Scene Graph za pomocą komponentu transform_component, jest pobranie lub ustawienie przekształcenia jednostki.
Istnieją dwa typy przekształcenia, które mogą cię zainteresować: przekształcenie lokalne i przekształcenie globalne. Aby skutecznie modyfikować przekształcenie jednostki, ważne jest zrozumienie, w jaki sposób są obliczane te przekształcenia.
Przekształcenie lokalne jest przekształceniem względem początku jednostki. Lokalne przekształcenie dowolnej jednostki Scene Graph jest wartością pola LocalTransform w elemencie transform_component jednostki Scene Graph.
Transformacja globalna to przekształcenie względem początku układu współrzędnych LUF w przestrzeni globalnej. Globalne przekształcenie jednostki Scene Graph jest obliczane poprzez skomponowanie LocalTransform jednostki z:
Globalne przekształcenie jednostki nadrzędnej, jeśli pole Początek nie jest ustawione na transform_component jednostki, lub
Globalne przekształcenie Początku jednostki, jeśli pole Początek jest ustawione na komponentu transform_component jednostki.
Poniżej przedstawiono przykładową pracę z translacją bez obrotu i skalowania, dzięki czemu powstałe przekształcenia można obliczyć przez dodanie translacji. W tym przykładzie założono, że obrót i skalę pozostawiono jako odpowiadające sobie jednostki we wszystkich przekształceniach, dlatego w odniesieniu do przekształcenia jednostki za pomocą wektora translacji przekształcenia jednostki używa się skrótu.
Rozważmy trzy jednostki Scene Graph zorganizowane w następujący sposób:
BaseEntity: LocalTransform (0.0, 0.0, 0.0) w układzie współrzędnych LUF.
A: LocalTransform (750.0, 100.0, 0.0)
B: LocalTransform (-250.0, 100.0, 0.0)
Poniżej znajdują się trzy jednostki w scenie, w której BaseEntity nie ma mesh_component, A to sześcian, a B to stożek:
Załóżmy na przykład, że chcesz określić zarówno przekształcenie lokalne, jak i przekształcenie globalne jednostki B. Przekształcenie lokalne widać od razu: jest to wartość pola LocalTransform transform_component jednostki B, jak pokazano poniżej:
Przekształcenie lokalne jednostki B to (-250.0, 100.0, 0.0).
Aby obliczyć globalne przekształcenie jednostki B, musisz prześledzić hierarchię jednostki B wstecz do jednostki symulacji i utworzyć przekształcenia, zaczynając od jednostki symulacji, a kończąc na jednostce B. Jednostka symulacji to element bazowy bieżącej symulacji, w której wszystkie inne symulowane jednostki są elementami podrzędnymi.
Oto kroki, aby obliczyć przekształcenie globalne jednostki B:
Jednostka symulacji jest komponentem głównym bieżącej symulacji.
Przekształcenie globalne jednostki symulacji: (0.0, 0.0, 0.0).
BaseEntity jest elementem podrzędnym jednostki symulacji. BaseEntity ma przekształcenie lokalne (0.0, 0.0, 0.0), jak widać na obrazku 1.0. Komponowanie globalnego przekształcenia jednostki symulacji z lokalnym przekształceniem BaseEntity daje:
Przekształcenie globalne BaseEntity: (0.0, 0.0, 0.0) + (0.0, 0.0, 0.0) = (0.0, 0.0, 0.0).
Jednostka A jest elementem podrzędnym BaseEntity. Jednostka A ma przekształcenie lokalne (750.0, 100.0, 0.0) jak na obrazku 1.1. Komponowanie przekształcenia globalnego BaseEntity z przekształceniem lokalizacji jednostki A daje następujące efekty:
Przekształcenie globalne jednostki A: (0.0, 0.0, 0.0) + (750.0, 100.0, 0.0) = (750.0, 100.0, 0.0).
Jednostka B jest elementem podrzędnym jednostki A. Jednostka B ma przekształcenie lokalne (-250.0, 100.0, 0.0), jak widać na obrazku 1.2. Komponowanie przekształcenia globalnego A z przekształceniem lokalizacji jednostki B daje następujące efekty:
Przekształcenie globalne Jednostki B: (750.0, 100.0, 0.0) + (-250.0, 100.0, 0.0) = (500.0, 200.0, 0.0).
Dlatego przekształcenie globalne jednostki B to (500.0, 200.0, 0.0) w układzie współrzędnych LUF.
Praca z transform_component w edytorze
Za pomocą LocalTransform i Początku można manipulować przekształceniem jednostki.
Przekształcenie lokalne
Pole LocalTransform komponentu transform_component jednostki jest (/Verse.org/SpatialMath:)transform jednostki związaną z jej Początkiem. Jeśli pole Początek nie jest wyraźnie ustawione, domyślna wartość Początku jednostki jest ustawiana na jej element nadrzędny w hierarchii Scene Graph. Pole LocalTransform jest polem edytowalnym, które pojawia się w UEFN, gdzie można bezpośrednio edytować jednostkę:
Translacja: Lokalizacja względem elementu nadrzędnego lub ręcznie definiowanego Początku.
Zmień translację jednostki, aby poruszać ją po poziomie.
Obrót: Orientacja względem elementu bazowego lub ręcznie zdefiniowanego początku.
Zmień obrót jednostki, aby obrócić ją wokół punktu obrotu jednostki.
Skala: Rozmiar względem elementu nadrzędnego lub ręcznie zdefiniowanego Początku.
Zmień skalę jednostki, aby ją powiększyć lub zmniejszyć.
Punkt początkowy
Początkiem transform_component jednostki jest obiekt, względem którego jest obliczana wartość LocalTransform. To pole w transform_component jest opcjonalne. Domyślnie LocalTransform transform_component jest przekształceniem jednostki na podstawie początku jednostki, obliczanym w odniesieniu do jednostki nadrzędnej. Opcjonalnie można ustawić pole Początek w transform_component Jednostki, aby obliczyć wartość LocalTransform w odniesieniu do obiektu innego niż obiekt nadrzędny jednostki.
Możesz na przykład ustawić Początek jednostki tak, aby była całkowicie inną jednostką. Możesz ustawić to pole z dowolną klasą implementującą interfejs źródła Verse. Konkretnie, aby ustawić pole Początek na inną jednostkę Scene Graph, wybierz klasę entity_origin , a następnie wybierz jednostkę, która ma być nowym początkiem.
Ważne, aby wprowadzić jednoznaczność między Początkiem w odniesieniu do transform_component a Początkiem układu współrzędnych LUF. Początkiem układu współrzędnych LUF jest punkt w przestrzeni świata z translacją (0.0, 0.0, 0.0).
Źródło pochodzenia komponentu transform_component jednostki jest lokalizacją, w której znajduje się jednostka, jeśli komponent transform_component LocalTransform jednostki ma wartość translacji (0.0, 0.0, 0.0).
Poniżej przedstawiono w praktyce przykład działania pola Początek i funkcji LocalTransform. Weźmy pod uwagę jednostkę BaseEntity umieszczoną na początku przestrzeni świata z jednostką podrzędną A reprezentowaną przez element mesh_component sześcianu oraz jednostkę podrzędną B reprezentowaną przez element mesh_component stożka.
Jak widać na powyższym obrazie, BaseEntity znajduje się w początku Przestrzeni świata, ponieważ jego pole Początek w transform_component nie jest ustawione, a LocalTransform jest ustawione na Początek Przestrzeni świata.
Jak pokazano poniżej, widać, że pole Początek jednostki A również nie jest ustalone, więc wartość LocalTransform jest obliczana w odniesieniu do transform_component jego elementu nadrzędnego, BaseEntity.
Ponieważ BaseEntity znajduje się w początku przestrzeni świata, a translacja LocalTransform jednostki A jest ustawiona na vector3{Left := 750.0, Up := 100.0, Forward := 0.0}, więc jednostka A znajduje się w vector3{Left := 750.0, Up := 100.0, Forward := 0.0}. Rotacja i skala jednostki A pozostają niezmienione, ponieważ rotacja i skala LocalTransform na BaseEntity są odpowiednimi jednostkami.
Na poniższej ilustracji widać, że jednostka B, która jest również elementem podrzędnym BaseEntity, ma swoje pole Początek w swoim komponencie transform_component ustawione jako jednostka A.
W rezultacie pole B LocalTransform jednostki w jego transform_component jest zależne od obliczonego przekształcenia jednostki A. Ponieważ właściwość LocalTransform jednostki B jest ustawiona na vector3{Left := -250.0, Up := 100.0, Forward := 0.0}, a właściwość LocalTransform jednostki A jest ustawiona na vector3{Left := 750.0, Up := 100.0, Forward := 0.0}, przekształcenie globalne jednostki B to vector3{Left := 500.0, Up := 200.0, Forward := 0.0}.
Jeśli zmienisz komponent Obrót (Rotation) pola LocalTransform jednostki A transform_komponent na -90.0 stopni wokół osi Forward, jednostka B również obróci się o -90.0 stopni wokół osi Forward. Dzieje się tak dlatego, że obrót elementu podrzędnego jest również dziedziczony po elemencie nadrzędnym.
Praca z transform_component w Verse
Możesz sprawdzić, czy jednostka ma transform_component za pomocą 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[]):
Zamiast pobierać transform_component za pomocą GetComponent i pracować bezpośrednio z transform_component, zalecanym sposobem interakcji z transform_component jest użycie metod rozszerzających jednostki.
Transform
Lokalne lub globalne przekształcenie jednostki można ustawić bezpośrednio za pomocą metod rozszerzających jednostki SetLocalTransform lub 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{}
Te metody rozszerzające są preferowanym sposobem ustawienia Przekształcenia w jednostce Scene Graph w kodzie Verse. Te metody jawnie ustawiają lokalne (względem elementu nadrzędnego jednostki) lub globalne (względem początku świata) przekształcenie danej jednostki. Jeśli Jednostka nie ma transform_component w momencie wywołania jednej z tych funkcji, komponent transform_component zostanie niejawnie utworzony i dodany do jednostki. Po wywołaniu którejkolwiek z tych funkcji, jednostka będzie teraz miała transform_component. Można to potwierdzić przy kolejnym wywołaniu GetComponent.
if (MyEntity.GetComponent[transform_component]):
# success, entity has a transform_component
else:
# failure, entity does not have a transform_component
Przy użyciu metod rozszerzających można uzyskać lokalne przekształcenie lub globalne przekształcenie powiązanego z jednostką transform_component. GetLocalTransform zwraca przekształcenie jednostki względem jej jednostki nadrzędnej lub określonego pola Początek, jeśli jest ono ustawione. Jeśli jednostka nie ma transform_component, ta funkcja zwróci przekształcenie tożsamości.
# 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 zwraca przekształcenie jednostki względem początku świata. Jeśli Jednostka nie ma komponentu transform_component, funkcja ta zwraca globalne przekształcenie najbliższego przodka z komponentem 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
Punkt początkowy
Metod rozszerzających jednostki można używać również w przypadku operacji dotyczących pola Początku transform_component. Możesz bezpośrednio ustawić pole Początek komponentu transform_component swojej jednostki za pomocą metody rozszerzającej jednostki 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}
Aby uzyskać Początek jednostki w kodzie Verse, użyj 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 decyduje, czy jednostka ma ustawione pole Początek, a jeśli tak, zwraca wartość tego pola. Jeśli nie, wywołanie kończy się niepowodzeniem. W przypadku powodzenia typem zwracanym GetOrigin jest obiekt początkowy – klasa Verse, która implementuje interfejs początku. Ten interfejs udostępnia pojedynczą funkcję GetTransform do uzyskiwania przekształcenia określonego początku jednostki. Możesz też sprawdzić, czy alternatywne pole jest ustawione na jednostkę i określić, która jednostka jest ustawiona jako Początek jednostki.
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()
Na koniec możesz zresetować pole Początek transform_component jednostki za pomocą ResetOrigin.
MyEntity.ResetOrigin()Po wywołaniu ResetOrigin, pole Początek komponentu transform_component MyEntity zostaje zresetowane, a przekształcenie MyEntity jest teraz obliczane względem jednostki nadrzędnej MyEntity w hierarchii Scene Graph.
Komponenty zależne
Działanie niektórych innych komponentów Scene Graph zależy od transform_component. Obejmują one:
light_component i jego klasy podrzędne
mesh_component
particle_system_component
Jeśli dodasz którykolwiek z tych komponentów do jednostki Scene Graph, która nie ma jeszcze komponentu transform_component, komponent transform_component zostanie domyślnie dodany do jednostki.
Uwaga dotycząca przekształceń XYZ
Przekształcenia wykorzystujące układ współrzędnych XYZ nadal istnieją w pliku /UnrealEngine.com/Temporary/SpatialMath Moduł Verse. Te przekształcenia są nadal używane przez urządzenia i rekwizyty trybu kreatywnego na /Fortnite.com Moduł Verse. Więcej informacji na temat statusu tych przekształceń i konwersji między różnymi typami przekształceń w Verse znajduje się na stronie Układ współrzędnych Left-Up-Forward.