memorymorph memorymorph

generator przestrzeni wirtualnej

Przestrzeń wirtualna powstaje na podstawie wprowadzonych do generatora rozpoznawalnych przez niego słów. Ciąg słów jest pobierany z komunikatów tworzonych przez chatboty. Słowa, które zostaną w wypowiedzi rozpoznane przez generator, są przypisywane do stworzonego w nim zbioru parametrów określających własności przestrzeni. W generatorze zostały przeze mnie zaimplementowane zasady, mające na celu przetransponowanie słów na stworzony zbiór parametrów określających charakter generowanej przestrzeni.

Lista parametrów, na podstawie których generowana jest przestrzeń wirtualna (podana kolejność jest taka sama, jak w kodzie generatora):

// 0. materiał terenu
terrains_(eatrh, grass, rocks, stone, brick, sand, asphalt, glow, metal)
// 1. stan przestrzeni, stan człowieka, nastrój sceny
romantic, mysterious, joyful, happy, cheerful, pleasant, charming, exciting, open, fear, anxiety, saddness, regret, depressing, shame,
// 2. wyłączone światła punktowe – słowo „wyłącz”
blink, illuminated, enlightenment, brightening, fuddle, blackout, darkening, lights_on, lights_off, lamps_on, lamps_off, streetlights_on, streetlights_off
// 3. zmiana materiałów generowanych obiektów
material_everywhere, material_is_everywhere, material_is_somewere material
// 4. tag do terenu
flat, lowland, platform, valley, cirque, quarry, slope, slanted, landslide, piramid, mastaba, earthwork, embankment, rampart, dyke, bank(river_bank), coast, island, archipelago, ridge
// 5. tag budynków i obiektów 1
// 6. tag budynków i obiektów 2
// 7. tag budynków i obiektów 3
// 8. tag budynków i obiektów 4
// 9. tag budynków i obiektów 5
// 10. gęstość terenów
terrains_(empty, dense, desert, bumpy, rough, smooth, hills, plain, flat)
// 11. ilość iteracji generowania terenów
terrains_(dense, more, less, empty)
// 12. gęstość budynków
square, street, plaza, promenade desert
buildings_(wide, spacious, open, empty, rarely, hollow, dense, thick, often, normal, average)
// 13. gęstość obiektów
tidy, neat, messy, cluttered, bunged, empty,
// 14. materiał budynków i obiektów
buildings_(cloth, red_concrete, felt, rattan, bricks, sand, sheet_metal, rust, white_brick)
// 15. pozycja, ułożenie terenów
city, island, terrains_(symmetric, asymmetric, regular, order)
// 16. pozycja, ułożenie budynków
street tunnel corridor strait, buildings_(symmetric, asymmetric, regular, order)
// 17. pozycja, ułożenie obiektów
neat, tidy, straight, chaos, messy, objects_(symmetric, asymmetric, regular, order)
// 18. rodzaj obrotu budynków
buildings_perpendicular, buildings_no_rotation, buildings_small_rotation, buildings_centered
// 19. rodzaj obrotu obiektów
objects_perpendicular, objects_no_rotation, objects_small_rotation, objects_centered

Przykład przypisania do parametru „nastrój sceny” (mood) poszczególnych słów, wraz z przypisanymi do nich wartościami dotyczącymi generowanej przestrzeni (fragment kodu będącego częścią pracy):

switch (inputList[1])
{

case „fearful”:
MoodReset();
RenderSettings.fog = false;
directLight.intensity = 0.3f;
directLight.color = new Color(0.9f, 1f, 1f, 1f);
RenderSettings.ambientIntensity = 0.3f;
//name = „PointLightFearful”;
//pointLightHolder = GameObject.Find(„PointLightFearful”);
if (inputList[2] != „blackout” || inputList[2] != „darkenening” || inputList[2] != „lights10ff” || inputList[2] != „lamps1off” || inputList[2] != „streetlights1off”)
{
pointLightsFearful.SetActive(true);
}
Material mat_fearful = Resources.Load(„Materials/skybox_fearful”, typeof(Material)) as Material;
RenderSettings.skybox = mat_fearful;
break;

case „pensive”:
MoodReset();
directLight.intensity = 0.1f;
RenderSettings.fog = true;
RenderSettings.fogDensity = 0.05f;
RenderSettings.fogColor = new Color(0.6f, 0.6f, 0.6f, 1f);
for (int i = 0; i < 5; i++)
{
name = „Point Light ” + num.ToString();
pointLight = GameObject.Find(name).GetComponent<Light>();
if (inputList[2] != „blackout” || inputList[2] != „darkenening” || inputList[2] != „lights10ff” || inputList[2] != „lamps1off” || inputList[2] !=”streetlights1off”)
{
pointLight.enabled = true;
lightEnabled = true;
}
pointLight.color = Color.yellow;
pointLight.range = 20;
pointLight.intensity = 2.0f;
num++;
}
Material mat_pensive = Resources.Load(„Materials/skybox_pensive”, typeof(Material)) as Material;
RenderSettings.skybox = mat_pensive;
break;

case „aggressive”:
MoodReset();
RenderSettings.fog = false;
directLight.intensity = 1f;
directLight.color = new Color(1f, 0f, 0f);
for (int i = 0; i < 20; i++)
{
name = „Point Light ” + num.ToString(); //profikuję nazwy pointlights do odpowiedniego nastroju, dzięki temu mogę mieć wiele zestawów, lub inne numery, lub zmieniam kolr, intens
pointLight = GameObject.Find(name).GetComponent<Light>();
if (inputList[2] != „blackout” || inputList[2] != „darkenening” || inputList[2] != „lights10ff” || inputList[2] != „lamps1off” || inputList[2] != „streetlights1off”)
{
pointLight.enabled = true;
lightEnabled = true;

}
pointLight.color = new Color(0f, 0.56f, 1f);
pointLight.range = 15;
pointLight.intensity = 5f;

num++;
}
Material mat_aggressive = Resources.Load(„Materials/skybox_aggressive”, typeof(Material)) as Material;
RenderSettings.skybox = mat_aggressive;
break;

case „mysterious”:
MoodReset();
RenderSettings.fog = false;
directLight.intensity = 0.0f;
for (int i = 0; i < 5; i++)
{
name = „Point Light ” + num.ToString(); //profikuję nazwy pointlights do odpowiedniego nastroju, dzięki temu mogę mieć wiele zestawów, lub inne numery, lub zmieniam kolr, intens
pointLight = GameObject.Find(name).GetComponent<Light>();
if (inputList[2] != „blackout” || inputList[2] != „darkenening” || inputList[2] != „lights10ff” || inputList[2] != „lamps1off” || inputList[2] != „streetlights1off”)
{
pointLight.enabled = true;
lightEnabled = true;
}
pointLight.color = Color.yellow;
pointLight.range = 10;
pointLight.intensity = 3.0f;
num++;
}
Material mat_noc = Resources.Load(„Materials/skybox_mysterious”, typeof(Material)) as Material;
RenderSettings.skybox = mat_noc;
break;
case „romantic”:
MoodReset();
directLight.intensity = 0.3f;
directLight.color = new Color(1f, 0.91f, 0.52f);
for (int i = 0; i < 20; i++)
{
name = „Point Light ” + num.ToString();
pointLight = GameObject.Find(name).GetComponent<Light>();
if (inputList[2] != „blackout” || inputList[2] != „darkenening” || inputList[2] != „lights10ff” || inputList[2] != „lamps1off” || inputList[2] != „streetlights1off”)
{
pointLight.enabled = true;
lightEnabled = true;
}
pointLight.color = new Color(1f, 0.88f, 0.14f);
pointLight.range = 11.5f;
pointLight.intensity = 2.0f;
num++;
}
Material mat_romantic = Resources.Load(„Materials/skybox_romantic”, typeof(Material)) as Material;
RenderSettings.skybox = mat_romantic;
break;
case „calm”:
MoodReset();
RenderSettings.fog = false;
directLight.intensity = 1.7f;
directLight.color = new Color (1f, 0.84f, 0.4f);
RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Flat;
RenderSettings.ambientLight = new Color(0.95f, 0.85f, 1f);
RenderSettings.ambientIntensity = 1.2f;
for (int i = 0; i < 20; i++)
{
name = „Point Light ” + num.ToString();
pointLight = GameObject.Find(name).GetComponent<Light>();
if (inputList[2] != „blackout” || inputList[2] != „darkenening” || inputList[2] != „lights10ff” || inputList[2] != „lamps1off” || inputList[2] != „streetlights1off”)
{
pointLight.enabled = true;
lightEnabled = true;
}
pointLight.color = new Color(1f, 0.82f, 0.9f);
pointLight.intensity = 1f;
pointLight.range = 23f;
num++;
}
Material mat_zachod = Resources.Load(„Materials/skybox_zachod”, typeof(Material)) as Material;
RenderSettings.skybox = mat_zachod;
break;
case „sad”:
MoodReset();
directLight.intensity = 0.5f;
directLight.transform.eulerAngles = new Vector3(6.4f, -160.6f, -35.1f);
RenderSettings.fog = true;
RenderSettings.fogDensity = 0.05f;
RenderSettings.fogColor = new Color(0.2f, 0.2f, 0.2f, 1f);
Material mat_sad = Resources.Load(„Materials/skybox_sad”, typeof(Material)) as Material;
RenderSettings.skybox = mat_sad;
break;
case „hopeful”:
MoodReset();
directLight.intensity = 2f;
directLight.transform.eulerAngles = new Vector3(3.69f, -178.239f, 0.113f);
directLight.color = new Color(1f, 1f, 0.75f);
Material mat_hopeful = Resources.Load(„Materials/skybox_hopeful”, typeof(Material)) as Material;
RenderSettings.skybox = mat_hopeful;
break;
case „happy”:
MoodReset();
Material mat_happy = Resources.Load(„Materials/skybox_happy”, typeof(Material)) as Material;
RenderSettings.skybox = mat_happy;
directLight.intensity = 1.15f;
directLight.transform.eulerAngles = new Vector3(33.507f, -95.659f, 30.969f);
directLight.color = new Color(1f, 0.986f, 0.655f);
RenderSettings.ambientIntensity = 1.1f;
break;
case „horrible”:
MoodReset();
Material mat_horrible = Resources.Load(„Materials/skybox_horrible”, typeof(Material)) as Material;
RenderSettings.skybox = mat_horrible;
directLight.intensity = 0.6f;
directLight.transform.eulerAngles = new Vector3(85f, 90f, 0f);
directLight.color = new Color(0.646f, 0.731f, 1f);
RenderSettings.ambientIntensity = 0.3f;
RenderSettings.fog = true;
RenderSettings.fogDensity = 0.03f;
RenderSettings.fogColor = new Color(0.169f, 0.169f, 0.169f, 1f);
break;

default:
RenderSettings.fog = false;
RenderSettings.ambientIntensity = 0.7f;
pointLightsFearful.SetActive(false);
directLight.intensity = 1.0f;
directLight.transform.eulerAngles = new Vector3(62f, -135f, 3f);
directLight.color = new Color(1f, 1f, 1f);
directLight.intensity = 1f;
RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Skybox;
RenderSettings.ambientIntensity = 1f;
RenderSettings.skybox = originalMatSkybox;
break;
}
}

Do tworzenia przestrzeni wirtualnej wykorzystywana jest biblioteka skanów i modeli3D.

Każdy skan 3D jest przypisany do właściwej klasy obiektów. Istnieją cztery klasy obiektów:

Ground – podłoże, podstawa, na której „stawiane” są przez generator pozostałe obiekty. W danej przestrzeni jest zawsze jeden element typu ground.
Terrain – mniejsze elementy, które w połaczeniu z obiektem typu ground tworzą ostateczny kształt terenu powstającej przestrzeni.
Buildings (LargeBuildings) – duże elementy architektury: budynki, fasady budynków, wiadukty, tunele etc.
Objects (smallBuildings) – mniejsze elementy – ławki, drzewa, bramy, drzwi, płoty, etc.

Skany 3D są również opisane listą słów kluczowych, tzw. tagów.
Tagi funkcjonują na podobnej zasadzie co parametry. Jeżeli wśród wprowadzonych do generatora słów pojawią się słowa rozpoznawane jako słowa kluczowe, zostaną dodane do listy parametrów. Przestrzeń wirtualna będzie zostanie wygenerowana z tych elementów z biblioteki modeli 3D, które opisane są jednym z wprowadzonych słów kluczowych. Generator posiada również współczynnik definiujący stosunek takich elementów oznaczonych słowami kluczowymi, do elementów dobranych z całego zbioru biblioteki.

Zrzut ekranu projektu pracy doktorskiej stworzonego w aplikacji Unity 3D.

Biblioteka skanów 3D utworzona w aplikacji Unity 3D.