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:
Was ich stattdessen:
Ich habe versucht, das Modell Charge direkt in der ApplicationAdapter
render()
Methode Rendering und es funktioniert perfekt, so liegen die Probleme müssen irgendwo mit dem Stage
aber ich kann nicht finde wie.
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
Danke das hat funktioniert! Ich dachte nicht, dass ich die Charge beenden musste, da ich sie nicht verwendete, um etwas zu zeichnen. –