Hi,
ich starte gerade ein neues Spieleprojekt. Und es ist mein erstes Spiel, wo auch etwas 3D mit ins Spiel kommt (aber nur minimal) und natürlich habe ich gleich ein Problem.
Mein Wunsch: Eine Textur auf einer Fläche eines Würfels. Bekomme ich auch hin, aber leider ist die Textur um 90 Grad gedreht.
Jetzt gäbe es die Möglichkeit das Bild um 90 Grad zu drehen oder die Kamera rotieren und die Breite und Höhe des Würfels anzupassen, aber ich möchte verstehen was ich falsch mache bzw. einfach nicht verstanden habe bis jetzt.
Kann mir das jemand erklären bzw. einen Tipp geben, wonach ich suchen sollte?
Ich danke.
Also im Bild sieht man es sehr gut.
An den Seiten sollte das Fenster jeweils ins „nichts“ zeigen" und im Hintergrund erkennt man es schlecht, weil das Bild 1024x485 Pixel besitzt. Aber auf einem Würfel gemalt wird der auch die Skalierung hat, aber um 90 Grad gedreht und damit total verzerrt ist.
Mein aktueller Code (ich benutze libgdx):
public class Test extends InputAdapter implements ApplicationListener {
public Environment environment;
public PerspectiveCamera cam;
public ModelBatch modelBatch;
public List<ModelInstance> modelInstances;
private boolean positioning = true;
@Override
public void create() {
AssetLoader.load();
environment = new Environment();
environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
cam = new PerspectiveCamera(55, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.position.set(0f,0,-4.5f);
cam.lookAt(0f, 0f, 0f);
cam.near = 1f;
cam.far = 100f;
cam.update();
this.modelBatch = new ModelBatch();
float height = 2f * AssetLoader.background.getRegionHeight() / AssetLoader.background.getRegionWidth();
this.modelInstances = new ArrayList<>();
this.modelInstances.add(new ModelInstance(this.getBackgroundModel(AssetLoader.background, TextureAttribute.createDiffuse(AssetLoader.background)), 0, 0, 0));
this.modelInstances.add(new ModelInstance(this.getBackgroundModel(AssetLoader.background, TextureAttribute.createDiffuse(AssetLoader.backgroundLeft)), -2, 0, -2));
this.modelInstances.add(new ModelInstance(this.getBackgroundModel(AssetLoader.background, TextureAttribute.createDiffuse(AssetLoader.backgroundRight)), 2, 0, -2));
this.modelInstances.add(new ModelInstance(this.getBackgroundModel(AssetLoader.background, ColorAttribute.createDiffuse(Color.YELLOW)), 0, height, -2));
this.modelInstances.add(new ModelInstance(this.getBackgroundModel(AssetLoader.background, ColorAttribute.createDiffuse(Color.WHITE), 1), 0, -height/2, -2.2f));
this.modelInstances.add(new ModelInstance(this.getBackgroundModel(AssetLoader.bottom, TextureAttribute.createDiffuse(AssetLoader.bottom), 2, 0.96f, 2f), 0, -height, -2));
Gdx.input.setInputProcessor(this);
}
private Model getBackgroundModel(TextureRegion textureRegion, Attribute diffuse) {
float width = 2f;
return getBackgroundModel(textureRegion, diffuse, width);
}
private Model getBackgroundModel(TextureRegion textureRegion, Attribute diffuse, float width) {
float height = width * textureRegion.getRegionHeight() / textureRegion.getRegionWidth();
float depth = width;
return getBackgroundModel(textureRegion, diffuse, width, height, depth);
}
private Model getBackgroundModel(TextureRegion textureRegion, Attribute diffuse, float width, float height, float depth) {
ModelBuilder modelBuilder = new ModelBuilder();
int attr = VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates;
modelBuilder.begin();
MeshPartBuilder meshPartBuilder = modelBuilder.part("box", GL20.GL_TRIANGLES, attr, new Material(diffuse));
BoxShapeBuilder.build(meshPartBuilder, width, height, depth);
return modelBuilder.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void render() {
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
cam.update();
modelBatch.begin(cam);
for (ModelInstance instance : this.modelInstances) {
modelBatch.render(instance, environment);
}
modelBatch.end();
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
modelBatch.dispose();
AssetLoader.dispose();
}
@Override
public boolean keyUp(int keycode) {
if (keycode == Input.Keys.SPACE) {
positioning = !positioning;
}
if (positioning) {
switch (keycode) {
case Input.Keys.LEFT: cam.position.set(cam.position.x + 0.05f, cam.position.y, cam.position.z); break; //
case Input.Keys.RIGHT: cam.position.set(cam.position.x - 0.05f, cam.position.y, cam.position.z); break; //
case Input.Keys.UP: cam.position.set(cam.position.x, cam.position.y + 0.05f, cam.position.z); break; //
case Input.Keys.DOWN: cam.position.set(cam.position.x, cam.position.y - 0.05f, cam.position.z); break; //
}
} else {
switch (keycode) {
case Input.Keys.LEFT: cam.direction.add(0.05f, 0, 0); break; //
case Input.Keys.RIGHT: cam.direction.add(-0.05f, 0, 0); break; //
case Input.Keys.UP: cam.direction.add(0, 0.05f, 0); break; //
case Input.Keys.DOWN: cam.direction.add(0, -0.05f, 0); break; //
}
}
return false;
}
}