Java 如何在3D Libgdx中旋转透视摄影机

Java 如何在3D Libgdx中旋转透视摄影机,java,android,libgdx,perspectivecamera,Java,Android,Libgdx,Perspectivecamera,我正在用libgdx创建3d游戏,但我有问题,我想在触摸屏上旋转相机,所以我从libgdx wiki添加了这个 @Override public boolean touchDragged (int screenX, int screenY, int pointer) { float deltaX = -Gdx.input.getDeltaX() * degreesPerPixel; float deltaY = -Gdx.input.getDeltaY() * degreesPe

我正在用libgdx创建3d游戏,但我有问题,我想在触摸屏上旋转相机,所以我从libgdx wiki添加了这个

@Override
public boolean touchDragged (int screenX, int screenY, int pointer) {
    float deltaX = -Gdx.input.getDeltaX() * degreesPerPixel;
    float deltaY = -Gdx.input.getDeltaY() * degreesPerPixel;

    camera.rotate(Vector3.Y,deltaX*0.9f);
    camera.rotate(Vector3.X,360-deltaY*0.9f);
    camera.update();


    return true;
}
它可以工作,但当我触摸屏幕旋转并向后看时,问题就出现了,相机像这样旋转

土地和世界必须旋转,而不是相机,我以前用过开放式相机,在那里我们旋转世界

Gl.Glrotatef(0.0.0)
但在libgdx中,我无法使它正常旋转

我的代码中有什么问题

    @Override
        public void create () {

            camera = new PerspectiveCamera(75,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
            camera.position.set(0f, 5f, 0f);
            camera.lookAt(0f,0f,0f);
            camera.near =0.1f;
            camera.far = 300f;
            modelInstance=new Array<ModelInstance>();
            texture = new Texture(Gdx.files.internal("gtass4.jpg"),false);

            modelBatch = new ModelBatch();
            modelBuilder = new ModelBuilder();
            modelBuilder.begin();

            modelBuilder.node().id="Block";
            modelBuilder.part("Block",GL30.GL_TRIANGLES,VertexAttributes.Usage.Position|VertexAttributes.Usage.TextureCoordinates,
                              new Material(TextureAttribute.createDiffuse(texture)))
                .box(1000,5,1000);

            box=modelBuilder.end();

            modelInstance.add(block=new ModelInstance(box,"Block"));



            texture.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);
            texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);

            Matrix3 mat = new Matrix3();

            mat.scl(new Vector2(80.0f, 80.0f));
            box.meshes.get(0).transformUV(mat);


            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));

            camController = new CameraInputController(camera);
            Gdx.input.setInputProcessor(this);

        }

        Vector3 position = new Vector3();
        private void movement() {
            block.transform.getTranslation(position);
            position.x = x;
            position.z = z;
            position.y = y;
            block.transform.setTranslation(position);

        }


        @Override
        public void render () {
            Gdx.gl.glClearColor(.0f, .0f, .0f, 1);
            Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT|GL30.GL_DEPTH_BUFFER_BIT);

            movement();
            k=Gdx.graphics.getFramesPerSecond();
            modelBatch.begin(camera);
            modelBatch.render(modelInstance,environment);

            modelBatch.end();
            camera.update();

        }

        @Override
        public boolean keyDown(int keycode) {

            if(keycode == Input.Keys.LEFT)
                camera.rotateAround(new Vector3(0f, 0f, 0f), new Vector3(1f, 1f, 0f), 1f);
            if(keycode == Input.Keys.RIGHT)
                camera.rotateAround(new Vector3(0f,0f,0f),new Vector3(0f,1f,0f), -1f);
            return true;
        }

        @Override
        public boolean keyUp(int keycode) {
            return false;
        }

        @Override
        public boolean keyTyped(char character) {
            return false;
        }

        @Override
        public boolean touchDown(int screenX, int screenY, int pointer, int button) {



            return false;
        }

        @Override
        public boolean touchUp(int screenX, int screenY, int pointer, int button) {
            return false;
        }


   @Override
    public boolean touchDragged (int screenX, int screenY, int pointer) {
        float deltaX = -Gdx.input.getDeltaX() * degreesPerPixel;
        float deltaY = -Gdx.input.getDeltaY() * degreesPerPixel;

        camera.rotate(Vector3.Y,deltaX*0.9f);
        camera.rotate(Vector3.X,360-deltaY*0.9f);
        camera.update();


        return true;
    }
@覆盖
公共void创建(){
camera=new PerspectiveCamera(75,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
摄像机位置设置(0f,5f,0f);
摄像机。注视(0f,0f,0f);
摄像机近距离=0.1f;
照相机。远=300f;
modelInstance=新数组();
纹理=新纹理(Gdx.files.internal(“gtass4.jpg”),false);
modelBatch=新modelBatch();
modelBuilder=新的modelBuilder();
begin();
modelBuilder.node().id=“Block”;
modelBuilder.part(“块”,GL30.GL_三角形,顶点属性。用法。位置|顶点属性。用法。纹理坐标,
新材质(TextureAttribute.createDiffuse(纹理)))
.箱(1000,51000);
box=modelBuilder.end();
add(block=newmodelInstance(框“block”);
texture.setWrap(texture.TextureWrap.Repeat,texture.TextureWrap.Repeat);
texture.setFilter(texture.TextureFilter.Linear,texture.TextureFilter.Linear);
Matrix3 mat=新Matrix3();
材料scl(新向量2(80.0f,80.0f));
box.mesh.get(0).transformUV(mat);
环境=新环境();
set(新的ColorAttribute(ColorAttribute.AmbientLight,0.4f,0.4f,0.4f,1f));
添加(新的DirectionalLight().set(0.8f,0.8f,0.8f,-1f,-0.8f,-0.2f));
camController=新的CameraInputController(摄像头);
Gdx.input.setInputProcessor(此);
}
Vector3位置=新Vector3();
私人空虚运动(){
block.transform.getTranslation(位置);
位置x=x;
位置z=z;
位置y=y;
block.transform.setTranslation(位置);
}
@凌驾
公共无效渲染(){
Gdx.gl.glClearColor(.0f、.0f、.0f、1);
Gdx.gl.glClear(GL30.gl_颜色_缓冲_位| GL30.gl_深度_缓冲_位);
运动();
k=Gdx.graphics.getFramesPerSecond();
modelBatch.begin(摄像机);
render(modelInstance,environment);
modelBatch.end();
camera.update();
}
@凌驾
公共布尔键关闭(int-keycode){
if(keycode==Input.Keys.LEFT)
摄像机。旋转(新矢量3(0f,0f,0f),新矢量3(1f,1f,0f),1f);
if(keycode==Input.Keys.RIGHT)
摄像机。旋转环绕(新矢量3(0f,0f,0f),新矢量3(0f,1f,0f),-1f);
返回true;
}
@凌驾
公共布尔键控(int-keycode){
返回false;
}
@凌驾
公共布尔键类型(字符字符){
返回false;
}
@凌驾
公共布尔接地(整数屏幕X、整数屏幕Y、整数指针、整数按钮){
返回false;
}
@凌驾
公共布尔补色(整数屏幕X、整数屏幕Y、整数指针、整数按钮){
返回false;
}
@凌驾
公共布尔值(int-screenX、int-screenY、int-pointer){
float deltaX=-Gdx.input.getDeltaX()*degreesPerPixel;
float deltaY=-Gdx.input.getDeltaY()*degreesPerPixel;
摄像机。旋转(矢量3.Y,deltaX*0.9f);
摄像机。旋转(矢量3.X,360度三角*0.9f);
camera.update();
返回true;
}

你的意思还不完全清楚。我想你应该使用欧拉角(偏航,俯仰,滚动)而不是乘以旋转。请注意,您还可以直接修改视图、投影和组合矩阵,这在某种程度上类似于调用
Glrotatef
,如果这是您想要完成的。如果您不想旋转相机,而是想旋转您的modelinstance,那么您当然可以这样做。@Xoppa我想创建一个第一人称相机,如minecraf和其他游戏,但我不知道如何做,我搜索了,但没有找到任何东西,当我想移动时,请向右或向左看。在这种情况下,您可以使用内置的
FirstPersonCameraController
类。如果需要,您可以随意修改。@Xoppa我没有找到任何关于如何使用它的toturial,您站点的toturial也没有包含任何关于这方面的内容,您能给我举个例子吗?用法与
CameraInputController
相同,只需替换类名即可。如果您愿意,这里有一个示例: