2015-12-13 6 views
0

Я создаю 3D-сцену в настоящее время коробку и прямоугольник и пытаясь включить освещение.Libgdx 3D - Point Light показывает черный ящик & rect (PointLight не работает)

Когда я создаю PointLight и добавляю его в среду, все превращается в черный цвет?

все, что я хочу сделать, это создать сцену в 3D и включить точечный свет, как солнце или лучи, исходящие из точки и затеняющие объекты.

Код:

environment = new Environment(); 
environment.add(new PointLight().set(1f, 1f, 1f, 0, 0, 20f, 100f)); 

modelBatch=new ModelBatch(); 

..

square=new ModelBuilder().createBox(300,300,300,new Material(ColorAttribute.createDiffuse(Color.GREEN)), 
       VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal); 
squareinst=new ModelInstance(square); 
squareinst.transform.setTranslation(-500,0,0); 

-

sprites.get(0).setRotationY(sprites.get(0).getRotationY() + 1f); 
sprites.get(1).setRotationY(sprites.get(1).getRotationY() - 1f); 
squareinst.transform.rotate(1,0,0,1); 

modelBatch.begin(camera); 
for(Sprite3D sp:sprites)// has 3d rect models 
    sp.draw(modelBatch,environment); 
modelBatch.render(squareinst,environment); 
modelBatch.end(); 

PointLight поворачивая все черное enter image description here

W ез использование окружающей среды или огней enter image description here

согласно моему исследованию, вот если PointLight не работает, то все должно быть черным, как в настоящее время, потому что окружающая среда нуждается в свете, он отлично работает с направленным светом (только противоположная сторона из прямоугольника черная даже после поворотов, я не знаю, почему)

libgdx версии 1.6.1 - Android студия я проверил это на оба андроида устройства и рабочего столе

пожалуйста, мне действительно нужно, чтобы получить эту работу PointLight, я не» t знать, если он примет пользовательский шейдер, если это так, пожалуйста, направляйте меня на некоторые ссылки, потому что я не испытываю в шейдерах. Я также читал о том, что PointLight не работает на каком-либо устройстве или не работает в opengl 2.0, но я не уверен.

Я пробовал много вещей и ценностей. Я знаю об Ambient Light, но это бесполезно для моего дела. Направленный свет также имеет ограниченное использование (может использоваться как резерв, если это не работает).


Edit:

Сво работает в настоящее время, проверьте ответ ниже:

  • если вы используете большой размер камеры или большой размер модели, пожалуйста, попробуйте добавляя больше нулей интенсивности PointLight до свет виден. enter image description here
+0

Ваши устройства слишком велики для этой интенсивности света. Используйте единицы измерения вокруг 1 вместо 300 и 500. – Xoppa

+0

Здравствуйте, @Xoppa, я тоже пробовал все эти значения и светлые позиции, я начал использовать диапазон 0-1f, тогда я использовал 100f, потому что он был написан в тестах libgdx, и даже попытался изменить эти значения перед публикацией этого комментария, но все тот же результат. – Diljeet

+1

Пожалуйста, обратитесь к тесту, который предполагает, что он может быть исправлен. Возможно, начните с чего-то, что действительно работает и изменит его для ваших нужд. https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/g3d/LightsTest.java. – Xoppa

ответ

2

Вот очень простой пример, который показывает точку света вращается вокруг сферы:

public class PointLightTest extends ApplicationAdapter { 
    ModelBatch modelBatch; 
    Environment environment; 
    PerspectiveCamera camera; 
    CameraInputController camController; 
    PointLight pointLight; 
    Model model; 
    ModelInstance instance; 

    @Override 
    public void create() { 
     modelBatch = new ModelBatch(); 
     camera = new PerspectiveCamera(); 
     camera.position.set(5f, 5f, 5f); 
     camera.lookAt(0f, 0f, 0f); 
     camController = new CameraInputController(camera); 
     environment = new Environment(); 
     environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1.0f)); 
     environment.add(pointLight = new PointLight().set(0.8f, 0.8f, 0.8f, 2f, 0f, 0f, 10f)); 

     ModelBuilder mb = new ModelBuilder(); 
     model = mb.createSphere(1f, 1f, 1f, 20, 10, new Material(ColorAttribute.createDiffuse(Color.GREEN)), Usage.Position | Usage.Normal); 
     instance = new ModelInstance(model); 

     Gdx.input.setInputProcessor(camController); 
    } 

    @Override 
    public void resize (int width, int height) { 
     camera.viewportWidth = width; 
     camera.viewportHeight = height; 
     camera.update(); 
    } 

    @Override 
    public void render() { 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 
     camController.update(); 
     pointLight.position.rotate(Vector3.Z, Gdx.graphics.getDeltaTime() * 90f); 
     modelBatch.begin(camera); 
     modelBatch.render(instance, environment); 
     modelBatch.end(); 
    } 

    @Override 
    public void dispose() { 
     model.dispose(); 
     modelBatch.dispose(); 
    } 
} 

Обратите внимание, что свет должен быть вне модели и в пределах диапазона для него света модель. Попробуйте, что происходит, когда вы постепенно перемещаете свет от модели или модели. Renderable в этом другом примере использовался для визуализации этого местоположения света.

+0

Спасибо, ты сделал это очень просто. Раньше я делал то же самое, но значения положения, интенсивности и размера модели света были не совсем подходящими. Размер моей камеры был 2845x1600, а размер модели был 300x300, поэтому интенсивность света была слишком мала, я изменил интенсивность света до 30000, а затем он был виден. Спасибо еще раз и у вас хороший день. – Diljeet

+0

Вы действительно должны использовать значения вокруг одного ('1f'). Использование этих больших значений может (будет) вызывать проблемы позже, например. ошибки точности с плавающей запятой могут очень быстро накапливаться в матричной математике (что и используется за кулисами). – Xoppa

+0

Вы правы, в случае размера камеры 1: 1 любого отношения, такого как 1.x: 1.x от размера экрана, ваш свет виден, но когда я создаю холст размером 2560x1440 или 2845x1600 для размера камеры в играх, свет не виден на больших объектах, он виден только с большими значениями интенсивности. – Diljeet

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

  • Нет связанных вопросов^_^