2017-03-21 4 views
0

Die meisten Libgdx-Tutorials, die ich gefunden habe, zeigen, wie man 2D-Elemente in einer 3D-Welt hinzufügt, aber ich würde gerne wissen, wie man das Gegenteil macht und 3D-Elemente in einer 2D-Bühne hinzufügt.Wie Rendern 3D-Objekt in einem Libgdx Actor?

Ich habe versucht, ein Hintergrundbild zu Stage hinzuzufügen, dann zu Stage eine Actor hinzufügen, die den Modellstapel und die 3D-Instanzen in seiner draw() -Methode rendert.

Stattdessen wird das Bild nicht gezeichnet und ein Teil des 3D-Objekts ist ausgeblendet.

SimpleGame Klasse

public class SimpleGame extends ApplicationAdapter { 

    Stage stage; 

    @Override 
    public void create() { 
     stage = new Stage(); 

     InputMultiplexer im = new InputMultiplexer(stage); 
     Gdx.input.setInputProcessor(im); 

     Image background = new Image(new Texture("badlogic.jpg")); 
     background.setSize(stage.getWidth(), stage.getHeight()); 
     stage.addActor(background); 

     setup(); 
    } 

    private void setup() { 
     SimpleActor3D group = new SimpleActor3D(); 
     group.setSize(stage.getWidth(), stage.getHeight()); 
     group.setPosition(0, 0); 
     stage.addActor(group); 
    } 

    @Override 
    public void render() { 
     stage.act(); 

     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 

     stage.draw(); 
    } 
} 

SimpleActor3D Klasse

public class SimpleActor3D extends Actor { 

    public Environment environment; 
    public PerspectiveCamera camera; 

    public ModelBatch modelBatch; 
    public ModelInstance boxInstance; 

    public SimpleActor3D() { 
     environment = SimpleUtils.createEnvironment(); 
     camera = SimpleUtils.createCamera(); 
     boxInstance = SimpleUtils.createModelInstance(Color.GREEN); 

     modelBatch = new ModelBatch(); 
    } 

    @Override 
    public void draw(Batch batch, float parentAlpha) { 
     Gdx.gl.glViewport((int)getX(), (int)getY(), (int)getWidth(), (int)getHeight()); 

     modelBatch.begin(camera); 
     modelBatch.render(boxInstance, environment); 
     modelBatch.end(); 

     super.draw(batch, parentAlpha); 
    } 
} 

SimpleUtils Klasse

public class SimpleUtils { 

    public static Environment createEnvironment() { 
     Environment environment = new Environment(); 
     environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f)); 

     DirectionalLight dLight = new DirectionalLight(); 
     Color lightColor = new Color(0.75f, 0.75f, 0.75f, 1); 
     Vector3 lightVector = new Vector3(-1.0f, -0.75f, -0.25f); 
     dLight.set(lightColor, lightVector); 
     environment.add(dLight) ; 

     return environment; 
    } 

    public static PerspectiveCamera createCamera() { 
     PerspectiveCamera camera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     camera.position.set(10f, 10f, 10f); 
     camera.lookAt(0,0,0); 
     camera.near = 1f; 
     camera.far = 300f; 
     camera.update(); 

     return camera; 
    } 

    public static ModelInstance createModelInstance(Color color) { 
     ModelBuilder modelBuilder = new ModelBuilder(); 

     Material boxMaterial = new Material(); 
     boxMaterial.set(ColorAttribute.createDiffuse(color)); 

     int usageCode = VertexAttributes.Usage.Position + VertexAttributes.Usage.ColorPacked + VertexAttributes.Usage.Normal; 

     Model boxModel = modelBuilder.createBox(5f, 5f, 5f, boxMaterial, usageCode); 

     return new ModelInstance(boxModel); 
    } 
} 

Was würde Ich mag:

What I would like

Was ich stattdessen:

What I have instead

Ich habe versucht, das Modell Charge direkt in der ApplicationAdapterrender() Methode Rendering und es funktioniert perfekt, so liegen die Probleme müssen irgendwo mit dem Stage aber ich kann nicht finde wie.

+0

In der Draw-Methode des Actors, setzen Sie batch.end() am Anfang und batch.begin() am Ende vor dem Super-Aufruf. Aber wenn Sie viele dieser 3D-Darsteller haben, wird die Leistung schlecht sein, da alle Batch-Typen hin- und hergeschaltet werden. – Tenfour04

+0

Danke das hat funktioniert! Ich dachte nicht, dass ich die Charge beenden musste, da ich sie nicht verwendete, um etwas zu zeichnen. –

Antwort

0

Ich hatte das gleiche Problem, aber ich musste 3D-Objekt nur einmal rendern, so kam ich mit einer Idee, 3D-Modell als Sprite zu rendern. Um das zu tun, habe ich mein Modell über modelBatch zum Frame-Buffer-Objekt anstatt zum Standard-Bildschirmpuffer gerendert und dann ein Sprite aus dem FBO-Farbpuffer erzeugt.

Beispielcode unten:

FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.getBackBufferWidth(), Gdx.graphics.getBackBufferHeight(), true); 

Sprite renderModel(ModelInstance modelInstance) { 
    frameBuffer.begin(); //Capture rendering to frame buffer. 

    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT | (Gdx.graphics.getBufferFormat().coverageSampling ? GL20.GL_COVERAGE_BUFFER_BIT_NV : 0)) 
    modelBatch.begin(camera); 
    modelBatch.render(modelInstance); 
    modelBatch.end(); 

    frameBuffer.end(); 

    return new Sprite(frameBuffer.getColorBufferTexture()); 
} 

Sie können jederzeit Ihre Sprit Textur in einer Render-Schleife mit der Verwendung von sprite.setTexture(); Verfahren aktualisieren. Sie können auch ein Bild aus einer Textur erstellen ->new Image(frameBuffer.getColorBufferTexture()); und in Scene2d verwenden.

Verwandte Themen