2015-04-14 11 views
28

Istnieje kilka odpowiedzi wavey ręki na to na answer.unrealengine.com, ale wydaje się, że brakuje im żadnych szczegółów lub przykładów.W jaki sposób dynamicznie renderujesz quady w UE4?

W szczególności, jeśli chcesz zaimplementować zestaw dynamicznych teksturowanych quadów renderowanych w świecie gier 3D, jak byś to zrobił?

W przypadku użycia rozważ dwujęzyczny wałek, który korzysta z animacji Spriter. Animacje 2D są ładowane z XML z łatwością, ale w jaki sposób renderujesz ten 2D zestaw teksturowanych, obróconych i skalowanych quadów dynamicznie na scenie?

+0

myślę, że trzeba zajrzeć do proceduralnego statycznej siatki i materialnego stworzenia. Wydaje się, że nie jest to zbyt dobrze dostosowane do API UE4, ale możesz zacząć od https://docs.unrealengine.com/latest/INT/API/Plugins/ProceduralMeshComponent/index.html i https: // wiki. unrealengine.com/Procedural_Materials – vipw

+0

@vipw O, przeczytałem je ... Po prostu nie mogę ich zmusić do pracy. Jeśli masz * przykład * z nich * faktycznie działa *, możesz otrzymać wygasłą premię 200 punktów za to pytanie. – Doug

+0

Mam coś działającego w oparciu o ten kod: https://wiki.unrealengine.com/Procedural_Mesh_Component_in_C%2B%2B:Getting_Started Kolejny, bardziej złożony przykład: https://github.com/LaP0573/ue4-fbx -importer/blob/master/ProceduralEntity.cpp – vipw

Odpowiedz

3

Czy problem, przed którym stoisz, dotyczy tarczy siatkowej lub uzyskania właściwej orientacji? (czyli rzut ortogonalny, przodem do kamery)

Tarła siatka jest dość łatwa, można to zrobić za pomocą Blueprints lub w kodzie.

W Blueprintach można ustawić pewne warunki wstępne, a następnie wybrać opcję odrodzenia aktorów w zależności od warunków. Rzeczywiste rozwiązanie kodowania będzie wyglądać tak samo.

Jeśli to dotyczy orientacji, to odpowiedź będzie pomocne dla Ciebie, znaleźć na Unreal Engine forach:

https://answers.unrealengine.com/questions/62126/how-do-i-render-a-dynamic-mesh-with-orthographic-p.html

EDIT:

Po wielu ciągnięcie za włosy i dokumentacji surfingu, oto kod, który sprawił, że rzeczy działały.

ADynamicMeshSpawner::ADynamicMeshSpawner() 
{ 
    // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. 
    PrimaryActorTick.bCanEverTick = true; 

    // Using a SphereComponent is not particularly necessary or relevant, but the cube refused to spawn without a root component to attach to, or so I surmise. Yay Unreal. =/ 
    USphereComponent* CubeComponent = CreateDefaultSubobject<USphereComponent>(TEXT("RootComponent")); 
    RootComponent = CubeComponent; 
    CubeComponent->InitSphereRadius(40.0f); 
    CubeComponent->SetCollisionProfileName(TEXT("Pawn")); 

    // Create and position a mesh component so we can see where our cube is 
    UStaticMeshComponent* CubeVisual = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation")); 
    CubeVisual->AttachTo(RootComponent); 
    static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereVisualAsset(TEXT("StaticMesh'/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube'")); 
    if (SphereVisualAsset.Succeeded()) 
    { 
     CubeVisual->SetStaticMesh(SphereVisualAsset.Object); 
     CubeVisual->SetRelativeLocation(FVector(-200.0f, 0.0f, 100.0f)); 
     CubeVisual->SetWorldScale3D(FVector(2.0f)); 
    } 
    // Create a material to be applied on the StaticMeshComponent 
    static ConstructorHelpers::FObjectFinder<UMaterial> Material(TEXT("Material'/Game/StarterContent/Materials/M_Tech_Hex_Tile_Pulse.M_Tech_Hex_Tile_Pulse'")); 

    if (Material.Object != NULL) 
    { 
     TheMaterial = (UMaterial*)Material.Object; 
    } 

    CubeVisual->SetMaterial(0, TheMaterial); 
} 

headerfile wygląda następująco:

UCLASS() 
class MYPROJECT_API ADynamicMeshSpawner : public AActor 
{ 
    GENERATED_BODY() 

public: 
    // Sets default values for this actor's properties 
    ADynamicMeshSpawner(); 

    // Called when the game starts or when spawned 
    virtual void BeginPlay() override; 

    // Called every frame 
    virtual void Tick(float DeltaSeconds) override; 
    // Pointer to the material that needs to be used 
    UMaterial* TheMaterial; 
}; 

Wyjście końcowy wyglądał jak ten w edytorze:

A glorious cube spawned from code!

ustawić go tak, że wystąpienie mojej klasie "DynamicMeshSpawner" będzie pojawiał się za każdym razem, gdy uderzę "P" na klawiaturze. Kiedy instancja tej klasy jest tworzona, wywołuje konstruktora, który spawnuje kostkę z zastosowanym materiałem. Zrobiłem instancję klasy spawning rzeczy w BluePrints za pomocą węzła SpawnActor.

Implemented in the level blueprint

Warunki, które wymagają do tarła rzeczy będzie oczywiście zależeć od zastosowania.

Ta metoda działa dla normalnych materiałów, ale nie dla materiałów. Sądzę, że musiałbyś wprowadzić zmiany w typie TheMaterial, ConstructorHelper i rzutowaniu z materiału referencyjnego na TheMaterial, aby mógł on funkcjonować.

Jestem przekonany, że to też będzie działać z materiałami animowanymi, co oznacza, że ​​animacje 2D będą musiały zostać przekształcone w materiał jakiegoś rodzaju.

Być może poniższy link pomoże.

https://forums.unrealengine.com/showthread.php?6744-Flipbook-material-to-recreate-an-animated-gif

EDIT 2:

Poniżej znajduje się bardzo dobry zestaw przykładów, w jaki sposób tworzyć obiekty proceduralnie w Unreal. Zostaw to tutaj dla potomności i na wypadek, gdyby ktoś przyszedł.

https://github.com/SiggiG/ProceduralMeshes/

+0

Tak jak powiedziałem w pytaniu: "Są odpowiedzi na wiele wskazówek na ten temat na answer.unrealengine.com, ale brakuje im szczegółów lub przykładów.". To, czego chcę, jest bardzo proste: proceduralnie twórz quady (w środowisku wykonawczym) i renderuj teksturę (wybraną w środowisku wykonawczym). to jest to! To nie jest mgliste pytanie; i niestety link, z którym się łączysz, to dokładnie ten rodzaj "mglistego handwavingu", o którym mówię. Z radością przyjmuję odpowiedź, która * faktycznie pokazuje kod *, jak to zrobić. – Doug

+0

Fair point Doug. Przepraszam za przyczynianie się do niejasności. Jestem dość rozzłoszczony brakiem dokumentacji lub przykładów czegoś, co powinno być całkiem łatwe do wdrożenia. Dajcie mi trochę, sam sobie poradzę z tym, i wkrótce do was wrócę. –

+0

Opublikowałem wdrożenie, które zadziałało dla mnie. Zauważyłem, że poprosiłeś o wybranie tekstury w środowisku wykonawczym. Jestem prawie pewien, że taka funkcja nie byłaby łatwa do wdrożenia. Wymagałoby to uprzedniego przekonwertowania wszystkich tekstur na materiały (przed uruchomieniem) i przechowywania w jakiejś strukturze danych. Tablica byłaby najłatwiejsza. Ta tablica (na przykład) będzie musiała być dostępna do indeksowania w środowisku wykonawczym. Warunki wstępne wyzwalają odradzanie się różnych quadów z różnymi Materiałami (teksturami) renderowanymi na nich. Nie niemożliwe, ale też nie łatwe. –

Powiązane problemy