Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Статьи
        Местность
            SkyBox

SkyBox

Опубликованно: 29.08.2015, 10:56
Последняя редакция, AdiDOS: 05.05.2016 8:28

В процессе создания игр или каких нибудь локаций мы всегда стараемся чтобы наш мир выглядел красивей а если в нашей игре есть допустим ландшафт , лес и прочее то куда мы денемся без неба , так вот в JME есть два способа создания неба это SkySphere и SkyBox  по поводу SkySphere мы поговорим в отдельной статье ну а в текущей естественно про SkyBox.

SkyBox — (Небесная коробка) Суть этой технологии очень прост мы берем 3х мерную коробку натягиваем на нее текстуры неба и увеличиваем ее до очень больших размеров , если стать в центре этой коробки то  мы будем видеть реальное небо да и чтоб не было видно углов нашей коробки нам надо позаботится чтоб наш источник света не обрабатывал ее , самый легкий способ это удалить нормали.

Да по моем описанию процесс тоже не прост но JME это все упрощает единственное что нам нужно это подготовить текстуры и все ну а далее перейдем к коду.

package test;

import com.jme3.app.SimpleApplication;
import com.jme3.asset.plugins.FileLocator;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box;
import com.jme3.texture.Texture;
import com.jme3.texture.Texture.WrapMode;
import com.jme3.util.SkyFactory;

public class SkyBoxTest extends SimpleApplication {

 public static void main(String[] args) {
   new SkyBoxTest().start();
 }

 @Override
 public void simpleInitApp() {
   flyCam.setMoveSpeed(10);
   createAmbienLight();
   createDirectionLight();
   createSkyBox();
   createScene();
   //createSkyBoxDds();
 }
 //Создание сцены
 private void createScene() {
   Material matGrass = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");
   Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");
   grass.setWrap(WrapMode.Repeat);
   matGrass.setTexture("DiffuseMap", grass);

   Box box1 = new Box(20, 1, 20);
   Geometry geomBox1 = new Geometry("box1", box1); 

   geomBox1.setMaterial(matGrass);
   rootNode.attachChild(geomBox1);

   Material matPond = assetManager.loadMaterial("Textures/Terrain/Pond/Pond.j3m");
   matPond.getTextureParam("DiffuseMap").getTextureValue().setWrap(WrapMode.Repeat);
   matPond.getTextureParam("NormalMap").getTextureValue().setWrap(WrapMode.Repeat);
   matPond.setBoolean("UseMaterialColors", true);
   matPond.setColor("Diffuse", ColorRGBA.White.clone());
   matPond.setColor("Ambient", ColorRGBA.White.clone());
   matPond.setFloat("Shininess", 0);

   Box box2 = new Box(5, 5, 5);
   Geometry geomBox2 = new Geometry("box2", box2);
   geomBox2.setLocalTranslation(5, 5, 5);

   geomBox2.setMaterial(matPond);
   rootNode.attachChild(geomBox2);
 }
 //Создание неба с загрузкой текстур
 private void createSkyBox(){
   flyCam.setMoveSpeed(100);
   assetManager.registerLocator("E:/AssetsTest/Textures/SkyBox/violentdays/", FileLocator.class);
   Texture west = assetManager.loadTexture("ft.jpg");//Передняя(front)
   Texture east = assetManager.loadTexture("bk.jpg");//Задняя(back)
   Texture north = assetManager.loadTexture("lf.jpg");//Левая(Left)
   Texture south = assetManager.loadTexture("rt.jpg");//Правая(Right)
   Texture up = assetManager.loadTexture("up.jpg");//Верх(up)
   Texture down = assetManager.loadTexture("dn.jpg");//Низ(down)

   Spatial sky = SkyFactory.createSky(assetManager, west, east, north, south, up, down, new Vector3f(300f,300f,300f));
   rootNode.attachChild(sky);
 }

 // Рассеянный свет
 private void createAmbienLight() {
   AmbientLight al = new AmbientLight();
   al.setColor(ColorRGBA.White.mult(0.2f));
   rootNode.addLight(al);
 }

 // Направленный свет
 private void createDirectionLight() {
   DirectionalLight sun = new DirectionalLight();
   sun.setColor(ColorRGBA.White);
   sun.setDirection(new Vector3f(-100f, -100f, -100f).normalizeLocal());
   rootNode.addLight(sun);
 }
 //Создание неба с загрузкой dds файла
 private void createSkyBoxDds(){
   Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false);
   sky.setLocalScale(350);
   rootNode.attachChild(sky);
 }
}

Данный код демонстрирует создание нашего скайбокса , так как в коробке 6 сторон мы и подгружаем 6 текстур ну впрочем перейдем к описанию функций создания неба.

createSky(assetManager, west, east, north, south, up, down, new Vector3f(300f,300f,300f));

Эта функция и создает наш скайбокс в качестве первого входящего параметра assetManager он нужен для загрузки текстур а последний собственно масштабирование (размер коробки) ну а остальные наши текстуры.

 west  //Передняя(front)
 east  //Задняя(back)
 north //Левая(Left)
 south //Правая(Right)
 up    //Верх(up)
 down  //Низ(down)

JME поддерживает еще одну структуру файлов с расширением .dds этот файл удобен лишь в одном случае в него можно запихнуть эти 6 текстур  и использовать один файл для создания неба.

В скриншотах я специально написал текст на каждой текстуре и нарисовал грани черным цветом чтоб видно было наш   SkyBox.

А далее скриншоты нашего примера.

1\

2

3

4

Ну я думаю все ясно текстуры можете скачать по этой ссылке.

Спасибо за внимание!!

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.