在libGDX中可以看到3D对象

时间:2013-12-09 16:59:17

标签: java opengl 3d libgdx

我正在研究穿越空间的3D模拟,其中有物体。 渲染的3D对象似乎是“透明的”: image

球体大小相同。大的一个在前面。 模型颜色未设置为透明。 我假设渲染的顺序可能会导致它(如在2D中),并使对象可比较并在渲染之前对它们进行排序。这并没有解决问题。

以下是代码:

 public void render(float delta) {
        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
        //We clear the screen
        camera.update();
        this._game_.modelBatch.begin(camera);
        ModelInstance inst;
        Orb closestOrb = null;
        float minDistance = Float.MAX_VALUE;
        for ( Orb orb : this._game_.orbsList)
        {
            if (orb.getZ()< _game_.player.getPosition().z)
            {
            inst = new ModelInstance(this._game_.orbModel);
                inst.transform.setToTranslation(orb.getX(),orb.getY(),orb.getZ());
            this._game_.modelBatch.render(inst, this._game_.environment);
            if (minDistance > Physics.getDistacne(_game_.player.getPosition(),orb.getPosition()))
                {
                    minDistance = Physics.getDistacne(_game_.player.getPosition(), orb.getPosition());
                    closestOrb = orb;
                }
            }
        }
        this._game_.modelBatch.end();

这是游戏中的模型代码

        modelBatch = new ModelBatch();//the screen uses this
        modelBuilder  = new ModelBuilder();
        Material orbMaterial = new Material(ColorAttribute.createDiffuse(0.5f, 0.5f, 1f,1f));
        //createDiffuse(Color.MAGENTA));
        long orbAttributes =  Usage.Position | Usage.Normal;
        orbModel = modelBuilder.createSphere(Orb.STANDARD_ORB_SIZE,Orb.STANDARD_ORB_SIZE, Orb.STANDARD_ORB_SIZE,30,30, orbMaterial, orbAttributes);
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));

            orbsList = new ArrayList<Orb>(); 
            for (int i = 0; i < SimGame.NUM_OF_ORBS; i++)
            {
                Orb orb = Orb.generateOrb(-SimGame.WORLD_SIZE,SimGame.WORLD_SIZE, Orb.STANDARD_ORB_SIZE);
                orbsList.add(orb);

            }
            Collections.sort(orbsList);

2 个答案:

答案 0 :(得分:1)

我不太了解libGDX,虽然我很了解LWJGL和openGL。

你遇到的问题是对象的深度没有被测试,这意味着可以在更近的对象上渲染更远的对象。我猜测在程序开始时你需要调用GL11.glEnable(GL11.GL_DEPTH_TEST)。它在libGDX中可能有所不同。如果你找不到我会建议搜索'libGDX深度测试'或类似的东西谷歌。

答案 1 :(得分:0)

Depth-Buffering就是这里的问题。

根据this source,您在调用glClear时启用它(请注意第二个参数):

Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

所以它的外观,它应该正确渲染。我建议删除你的obejcts的顺序,因为它们应该根据它们相对于相机的位置自动计算。