Libgdx以变形的形状渲染模型,而透视相机与设备的方向传感器同步

时间:2019-06-28 14:01:17

标签: android 3d libgdx

在Libgdx Android项目中,已使用来自指南针和加速度计传感器的定向角来设置透视相机的方向。一个简单的模型是使用 modelBuilder.createBox()方法创建的多维数据集。问题是在渲染过程中移动相机时,立方体模型会变形。

@Override
public void create() {

    float baseVerticalFov = 67;
    camera = new PerspectiveCamera(baseVerticalFov,   Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    camera.near = 0f; // z near
    camera.far = 500f;
    camera.update();
    modelBatch = new ModelBatch();
}
private Model createPointModel(Color color) {

    Model pointModel;
    ModelBuilder modelBuilder = new ModelBuilder();
    int s = 1;
    Material material = new Material(ColorAttribute.createDiffuse(color));
    long attributes = VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal;
    pointModel = modelBuilder.createBox(1f * s, 1f * s, 1f * s, material, attributes);
}

private void loadModel() {

    ModelInstance m1 = new ModelInstance(createPointModel(Color.GREEN));
    mn1.transform.setToTranslation(3, 0, 1);
    modelInstances.add(m1);
}

@Override
public void render() {

    if (!isLoaded) {
        loadModel();
        isLoaded = true;
    }
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
    int w = Gdx.graphics.getWidth();
    int h = Gdx.graphics.getHeight();
    Gdx.gl.glViewport(0, 0, w, h);

    if (locationProvider != null) {

        orientationValues = orientationSensorFusion.getOrientationValues();
        Vector3 pointing = OrientationSensorFusion.getDirection(orientationValues);

        camera.position.set(0, 0, 0);
        camera.direction.set(pointing);

        camera.update();
        modelBatch.begin(camera);
        modelBatch.render(modelInstances);
        modelBatch.end();

    }
}

这些图像从不同角度显示了红色立方体。

enter image description here enter image description here

这是呈现3D对象的gif效果,同时以0.5步增加方位角,如屏幕左上方所示。另一个问题是,相机方向无法根据方位角值平滑旋转。

enter image description here

这是向环境中添加一些光线后的结果。

enter image description here

1 个答案:

答案 0 :(得分:0)

显示的代码不足以确保确定,但是我认为最可能的原因是您的方向矢量未标准化。必须先对camera.direction进行标准化,然后再调用camera.update()