2013-12-09 3 views
2

Я работаю над 3D-моделированием путешествий по пространству с объектами в нем. 3D-объекты, которые визуализируются, кажутся «прозрачными»: image3D-объекты видны друг другу в libGDX

Шары одинакового размера. большой впереди. Цвет модели НЕ установлен в прозрачный. Я предположил, что порядок рендеринга может привести к его (как в 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); 
+0

В каком направлении вы их отсортировали? Ближе всего? Вы пытались изменить порядок и попробовать сделать так? – Paddyd

+0

yes Я пробовал в обоих направлениях –

ответ

1

Я не знаю libGDX, что хорошо, хотя я знаю LWJGL и OPENGL довольно хорошо ,

Проблема, с которой вы сталкиваетесь, заключается в том, что глубина объектов не проверяется, что означает, что дальнейшие объекты могут быть отображены поверх более близких. Я предполагаю, что в начале программы вам нужно позвонить GL11.glEnable(GL11.GL_DEPTH_TEST). В libGDX может быть иначе. Если вы не можете найти, что я бы рекомендовал искать «тестирование глубины libGDX» или что-то подобное в google.

+0

, что не работал –

0

Глубина буферизации - вот в чем проблема.

Согласно this source, Вы включаете его в вызове glClear (обратите внимание на второй параметр):

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

Так как она выглядит, она должна быть правильно рендеринга. Я бы предложил удалить порядок ваших obejcts, так как они должны быть рассчитаны автоматически с их положением относительно камеры.

+0

Заказ объектов не повлияет на это – Ryxuma

3

Проблема заключалась в том, что коэффициент zNear был установлен в 0. Это вызвало ненормальную работу буферизации глубины. Вы можете прочитать о нем здесь: http://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm Благодарю всех, кто указал мне в правильном направлении.

+1

Работал для меня тоже, спасибо! – AAverin

Смежные вопросы