Java libgdx mover la cámara de perspectiva
Hola comunidad Stackoverflow 🙂 He buscado mucho, pero no pude encontrar una solución hasta ahora, tal vez alguien aquí me puede ayudar 🙂
Estoy creando un juego en 3D, pero no sé cómo traducir la cámara de acuerdo a mis dedos. Estoy creando un mapa (x = -30 a +30; y = -30 a 30; z = -1 a 1) donde cada coordenada se utiliza para un modelo utilizando archivos .g3db de mis activos y se implementa usando el modelo traducción. Esto funciona hasta ahora, el mapa se ve bien y se ve en un ángulo del 67%. El mapa es tan grande que no se puede ver en la cámara a la vez (no, no quiero alejar). Cada vez que estoy tocando la pantalla de mi teléfono Android es simplemente girar alrededor del centro, pero en su lugar quiero que el gamemap para permanecer en el lugar desde mi punto de vista y en su lugar cambiar la posición de la cámara en perspectiva en el eje xyy. No hay ningún objeto de juego que se puede utilizar para el seguimiento de posición, todo debe estar en función de mis acciones dedo. De esta forma quiero pasar a la pantalla visible a cada dirección xey (piense en ella visualmente como una cámara 2D moviéndose hacia arriba, hacia abajo y hacia los lados delante de una imagen). ¿Me puedes ayudar?
- Libgdx lanzando una excepción en la aplicación helloworld cuando se ejecuta en el emulador
- Cómo cambiar la posición de un cuerpo en movimiento - Box2D
- LibGDX pausa en funcionamiento durante unos segundos
- LIBGDX: agregue un enlace de texto que se puede hacer clic
- ¿Cómo mostrar el texto con un fondo de dos colores?
Este es mi código hasta ahora:
public class MyGdxGame extends ApplicationAdapter implements ApplicationListener{ //define variables ... @Override public void create() { 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)); modelBatch = new ModelBatch(); cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); cam.position.set(10f, 10f, 10f); cam.lookAt(0,0,0); cam.near = 1f; cam.far = 300f; cam.update(); assets = new AssetManager(); //load assets ... loading = true; camController = new CameraInputController(cam); camController.forwardTarget = true; Gdx.input.setInputProcessor(camController); } private void doneLoading() { //load models and add them to instances loading = false } @Override public void render() { if (loading && assets.update()) doneLoading(); camController.update(); Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); modelBatch.begin(cam); modelBatch.render(instances, environment); modelBatch.end(); }
Estoy usando la suite de herramientas Spring 3.5.1 como IDE y libgdx 1.0.1
Saludos cordiales Christian
- Proyecto LibGDX escrito en Scala, en Android, con IntelliJ
- LibGDX: ¿Cómo determinar si el contexto opengl se perdió?
- LibGDX RTL fuente de representación?
- Android Emulator no inicia el proyecto LibGDX?
- Libgdx Android en la aplicación sencilla tutorial
- Eclipse se bloquea con límite de gastos generales de GC superado después de enlazar servicios de Google Play
- Cambiar el tamaño de la fuente en la piel
- Cómo cargar correctamente las texturas con libgdx assetmanager
No use CameraInputController
, sino que implementa InputProcessor y utiliza esa clase en la llamada a Gdx.input.setInputProcessor
.
Por ejemplo:
public class MyGdxGame extends ApplicationAdapter implements InputProcessor {
Y en el método create:
Gdx.input.setInputProcessor(this);
Tendrás que implementar todos los métodos mostrados en este enlace , excepto el método touchDown
y touchDragged
que requiere código adicional:
private int dragX, dragY; @Override public boolean touchDown (int x, int y, int pointer, int button) { dragX = x; dragY = y; return true; } @Override public boolean touchDragged (int x, int y, int pointer) { float dX = (float)(x-dragX)/(float)Gdx.graphics.getWidth(); float dY = (float)(dragY-y)/(float)Gdx.graphics.getHeight(); dragX = x; dragY = y; cam.position.add(dX * 10f, dY * 10f, 0f); cam.update(); return true; }
Aquí los valores dX
y dY
son la cantidad que el usuario ha arrastrado en la pantalla dentro del rango entre -1f
y +1f
. Por ejemplo, para dX
un valor de 0.5f
significa que el usuario arrastró la mitad del tamaño de la pantalla a la derecha. Tenga en cuenta que estos son valores delta desde la última vez que se llamó al método. Es probable que el método se llame muchas veces por operación de arrastre. Por lo tanto, los dX
y dY
serán valores pequeños.
La llamada a cam.position.add(...)
moverá realmente la cámara y la llamada a cam.update();
Volverá a calcular los valores necesarios para la representación. He utilizado un multiplicador de 10f
para la traducción X e Y de la cámara. Esto significa que si el usuario arrastra completamente desde el borde izquierdo hasta el borde derecho de la pantalla, la cámara moverá un total de 10 unidades hacia la derecha. Puede ajustar el valor según sea necesario.
Tenga en cuenta que esto mueve la cámara en el plano XY. Si necesita desplazarse por ejemplo en el plano XZ, debe ajustar la llamada cam.position.add(...)
consecuencia. Además, esto no cambia la dirección de la cámara. Si desea mover la cámara, mientras mira a la misma ubicación, tendrá que agregar cam.lookAt(0,0,0);
Justo antes de cam.update();
.
- Private String o public static String?
- ¿Está bien si anulamos el método OnDestroy () en cada actividad de la aplicación Android?