szybkie mapowanie punktów w przestrzeni 3d/pomocy 13522 31

O temacie

Autor

Zaczęty 22.07.2012 roku

Wyświetleń 13522

Odpowiedzi 31

kazzmir
  • Gość
chodzi mi o stworzenie jakiegoś prostego systemu np unity, albo udk który pozwoli mapować punkty w przestrzeni 3d, jednocześnie nadając im różne wartości, jak np wielkości, nazwa, odległość od punktu odniesienia, jasność i kilka innych czysto opisowych. zagadnienie czysto naukowe i poznawcze, dlatego proszę o pomoc doraźną i/lub aktywne uczestnictwo

więcej na priv
 

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Unity zaskakująco dobrze radziło sobie z pierdyliardami tris (kiedy jeszcze każda gwiazda była kulą kilkusettrisową), ale zmieniłem na sześciany, bo jest znacząco więcej fps, a z daleka nie widać różnicy. Gorzej za to z ładowaniem na mapę kilkuset tysięcy niezależnych oskryptowanych obiektów, musiałem zrobić żeby ładowało tylko określoną część w zależności od możliwości sprzętu :D



inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
http://speedy.sh/56xKq/Stars.7z
Jakby ktoś chciał pooglądać, wersja bez edytora, za to w kilka sekund ładuje setki tysięcy gwiazd, po prostu zasysa na raz całą bazę danych nic nie pomijając. Aha, baza danych: http://speedy.sh/fbwEt/hygxyz.csv.gz . Trzeba ją wrzucić do stars_Data/data (po wypakowaniu). Można wymienić ją też na dowolny inny plik który ma taką samą strukturę. Dla mnie te kolory wyglądają paskudnie nierealistycznie, ale Kazzmir twierdzi że właśnie takie powinny być :D
Punkt startowy to słońce. Sterowanie WASD, shift przyspiesza, R resetuje pozycję kamery. Q doładowuje niezaładowane gwiazdy z danego rejonu... ale w tej wersji nie robi nic :lol:
Aha, jest też jedna ukryta funkcja której używałem do debugowania, ciekawe czy ktoś ją zauważy :D


Ciekawostka: w trakcie prac Unity raz wywaliło mi błąd http://jira.codehaus.org/browse/BOO-1267?page=com.atlassian.jira.plugin.system.issuetabpanels:changehistory-tabpanel (żadnego kwaczenia nie kodowałem):
'quack' is not a generic definitionKtoś już zgłosił tą sprawę pod tytułem "Support generic method calls on ducks".

kazzmir
  • Gość
trzeba dodać że baza danych zawiera około 120k obiektów, które stanowią jedynie najbliższe otoczenie naszego słońca. docelowo będzie to cała droga mleczna, oczywiście bez 400 mld gwiazd, raczej będzie to model teoretyczny, poza znanymi i posiadającymi współrzędne gwiazdami, mgławicami i całą resztą kosmicznego burdelu
 

Wowoz

Wowoz

Użytkownicy
Wowoźny
posty3699
Propsy4862
NagrodyVV
Profesjabrak
  • Użytkownicy
  • Wowoźny
A po co to? Av, wlacz blooma jakiegos :D
 


Wowoz

Wowoz

Użytkownicy
Wowoźny
posty3699
Propsy4862
NagrodyVV
Profesjabrak
  • Użytkownicy
  • Wowoźny
Kazz wybierasz sie gdzies i mapy potrzebujesz?  :lol:
 

kazzmir
  • Gość
Kazz wybierasz sie gdzies i mapy potrzebujesz?  :lol:

mam taką tylko niedoskonałą w telefonie, dzięki avallachowi ta będzie doskonała
 

kazzmir
  • Gość
rozkminiam właśnie skurwionie systemy cząsteczkowe, bardzo bym chciał żeby każda klasa widmowa była reprezentowana przez oryginalnie z wizualizowane słonce.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
kazz? czy ty mówisz po prostu o stworzeniu klasy z różnymi parametrami z czego trzy są pozycją w przestrzeni? Początkujący programista po pierwszych czy drugich zajęciach z obiektowości ci to napisze w 5-10 minut. Nawet systemu nie trzeba robić. Trochę więcej roboty ze stworzeniem systemu, który będzie te statystyki wyświetlał bo to troszkę kodu będzie tym bardziej, że trzeba się wpasować w strukturę klas silnika jaki się używa, ale to i tak pewnie robota na dwie godziny.
 
Popisuje się ciągle menda jedna...

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Fartuess, nie chodziło po prostu o stworzenie klasy z ustalonymi parametrami. Bazy danych mogą mieć dowolną strukturę, kod który napisałem zaimportuje obiekty z dowolnymi parametrami i dowolną ich ilością, w runtime odwzorowując w pamięci to, co zostało przedstawione w bazie danych. Przykładowo, zaimportuje prawidłowo bazę zarówno z nagłówkami
nazwa   x   y   zjak i
id   x   z   y   kolor   jasność   wielkość   nazwa   zapachI wszystkie te parametry będzie można zmieniać w edytorze po wybraniu gwiazdy. Najwięcej kodu zajęło odczytanie pliku csv, tak aby mógł mieć zapisane dowolne atrybuty obiektów (nie ma sztywnej listy kolumn które musi posiadać). Dodatkowo okazało się że nie mogę ładować wszystkiego w jednej pętli bo Unity się zawieszało, musiałem wykombinować żeby ładowało "krokami", w kolejnych pętlach pracy całego silnika. Napisanie edytora dla tych obiektów których własności ani ich ilość nie jest znana było najprostszą częścią kodu. Musiałem tylko machnąć jeszcze nakładkę na system UnityGUI, bo jest strasznie niewygodny w obsłudze dla mnie (w sumie mogę ją udostępnić, ale w obecnej formie jest zrobiona trochę "niedbale").
Uwierz mi, całośc nie zajęła 5-10 minut, zwłaszcza że po drodze okazało się że pierwsze rozwiązania które stworzyłem nie dawały rady przy imporcie na raz powyżej kilkunastu tysięcy obiektów, obecnie da się ładować setki tysięcy.

Dodatkowo kod uwzględnia możliwość równoczesnego wyświetlania kilku baz danych i ich niezależnej edycji, rozszerzania i zapisu. Baza danych jest zapisywana do dokładnie takiej postaci z jakiej została odczytana.

kazzmir
  • Gość
kazz?

trochę to się pokomplikowało z czasem, av udostępnił prototyp, zobacz sobie jak wygląda baza, ile ma rekordów i tak dalej.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Avallach, włączyłem twój program i ciemność widzę. Czy trzeba coś jeszcze zrobić? Ile czasu potrzebuje, aby się załadować?

http://s6.ifotos.pl/img/starsjpg_rqnxeas.jpg

Output_log:
GfxDevice: creating device client; threaded=1
Direct3D:
    Version:  Direct3D 9.0c [nvd3dum.dll 8.17.13.142]
    Renderer: NVIDIA GeForce 9300M GS
    Vendor:   NVIDIA
    VRAM:     243 MB (via DXGI)
    Caps:     Shader=30 DepthRT=1 NativeDepth=1 NativeShadow=1 DF16=0 DF24=0 INTZ=1 RAWZ=0 NULL=1 RESZ=0 SlowINTZ=0
desktop: 1280x800 60Hz; virtual: 1280x800 at 0,0
<RI> Initializing input.

<RI> Input initialized.

Initialize engine version: 3.5.3f3
Begin MonoManager ReloadAssembly
Platform assembly: C:\Users\Grzegorz\Desktop\Stars\Stars\stars_Data\Managed\UnityEngine.dll (this message is harmless)
Loading C:\Users\Grzegorz\Desktop\Stars\Stars\stars_Data\Managed\UnityEngine.dll into Unity Child Domain
Platform assembly: C:\Users\Grzegorz\Desktop\Stars\Stars\stars_Data\Managed\Assembly-UnityScript.dll (this message is harmless)
Loading C:\Users\Grzegorz\Desktop\Stars\Stars\stars_Data\Managed\Assembly-UnityScript.dll into Unity Child Domain
- Completed reload, in  0.114 seconds
Platform assembly: C:\Users\Grzegorz\Desktop\Stars\Stars\stars_Data\Managed\UnityScript.dll (this message is harmless)
Platform assembly: C:\Users\Grzegorz\Desktop\Stars\Stars\stars_Data\Managed\UnityScript.Lang.dll (this message is harmless)
Platform assembly: C:\Users\Grzegorz\Desktop\Stars\Stars\stars_Data\Managed\Boo.Lang.dll (this message is harmless)
Creating Lucifer
UnityEngine.Debug:Internal_Log(Int32, String, Object)
UnityEngine.Debug:Log(Object)
LUCIFER:Instance() (at C:\Users\Adam\Documents\Unity Projects\stars\Assets\LUCIFER.js:12)
THE_CREATOR:CreateStars(DATABASE) (at C:\Users\Adam\Documents\Unity Projects\stars\Assets\THE_CREATOR.js:48)
CONSOLE:Startup() (at C:\Users\Adam\Documents\Unity Projects\stars\Assets\CONSOLE.js:33)
CONSOLE:Start() (at C:\Users\Adam\Documents\Unity Projects\stars\Assets\CONSOLE.js:21)
 
(Filename: C Line: 0)

Platform assembly: C:\Users\Grzegorz\Desktop\Stars\Stars\stars_Data\Managed\Boo.Lang.Compiler.dll (this message is harmless)
CreateStars_loop: Stworzone gwiazdy: 0 / 0
UnityEngine.Debug:Internal_Log(Int32, String, Object)
UnityEngine.Debug:Log(Object)
THE_CREATOR:CreateStars_LuciferLoop() (at C:\Users\Adam\Documents\Unity Projects\stars\Assets\THE_CREATOR.js:63)
System.Reflection.MonoMethod:InternalInvoke(Object, Object[], Exception&)
System.Reflection.MonoMethod:Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) (at /Applications/buildAgent/work/51c26656ff47b7e8/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)
System.Reflection.MethodBase:Invoke(Object, Object[]) (at /Applications/buildAgent/work/51c26656ff47b7e8/mcs/class/corlib/System.Reflection/MethodBase.cs:115)
System.Delegate:DynamicInvokeImpl(Object[]) (at /Applications/buildAgent/work/51c26656ff47b7e8/mcs/class/corlib/System/Delegate.cs:443)
System.MulticastDelegate:DynamicInvokeImpl(Object[]) (at /Applications/buildAgent/work/51c26656ff47b7e8/mcs/class/corlib/System/MulticastDelegate.cs:71)
System.Delegate:DynamicInvoke(Object[]) (at /Applications/buildAgent/work/51c26656ff47b7e8/mcs/class/corlib/System/Delegate.cs:415)
LUCIFER:Update() (at C:\Users\Adam\Documents\Unity Projects\stars\Assets\LUCIFER.js:18)
 
(Filename: C Line: 0)


inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Czy tak jak pisałem pobrałeś bazę danych i wypakowałeś do stars_data/data ?

//edit: Baza z linku miała znaki nowej linii w formie "\n" zamiast "\r\n". Zaktualizowałem link do działającej (http://speedy.sh/fbwEt/hygxyz.csv.gz). "\r\n\" to konwencja przyjęta m.in. przez aplikacje Windowsowe, a że pierwsze testowe bazy danych pisałem w notatniku, to ją zastosowałem do odczytywania. Baza danych z linku który był wcześniej najprawdopodobniej została zapisania pod Linuxem.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Av. Łączysz się z SQLową bazą danych z Unity?
 
Popisuje się ciągle menda jedna...

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Nie, jest trzymana w pamięci jako zwykła tablica dwuwymiarowa + osobna tablica jednowymiarowa na nazwy atrybutów. Modyfikacje są wprowadzane do tej kopii trzymanej w pamięci, a na żądanie użytkownika jest ona eksportowana z powrotem do pliku. Nie chciałem się bawić w wyspecjalizowane zewnętrzne bazy danych, bo natywne tablice w .net są superszybkie. Że zacytuję dokumentację:
Cytuj
Builtin arrays (native .NET arrays), are extremely fast and efficient (...)
Builtin arrays are useful in performance critical code (With Unity's javascript and builtin arrays you could easily process 2 million vertices using the mesh interface in one second.)
Jak widać, wykorzystuję ledwie niezauważalny ułamek ich potęgi. Samo wczytywanie jest tak szybkie, że nawet nie próbowałem go mierzyć.

Tak naprawdę praktycznie całe obciążenie występuje w momencie dodawania obiektów na mapę, bo działa przy tym wiele wewnętrznych mechanizmów silnika, mimo że starałem się je możliwie okroić. Właściwie znacznie sztucznie wydłużyłem czas ładowania, po prostu praktyka pokazała że lepiej rozłożyć je w czasie (nawet z gigantycznym zapasem) niż dać za dużo obiektów do stworzenia na raz i pozwolić się silnikowi "zadławić" (po prostu się zamrażał i już nie ruszał).

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
ja nie pytam się o to jak trzymasz dane w pamięci programu, tylko czy poobierasz je z bazy danych. No, ale widocznie czytasz to tylko z pliku wsadowego.

A co do tego jak to trzymasz w pamięci, to nie do końca rozumiem, ale coś mi się nie podoba. Jakoś tak nie pasuje mi. Do czego ci ta tablica dwuwymiarowa?
 
Popisuje się ciągle menda jedna...

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
1. Mam na dysku plik csv.
2. Napisałem klasę która czyta go do Stringa i przetwarza, odpowiednie pola z arkusza (którym jest plik csv) odwzorowując w tablicy dwuwymiarowej. To jakbyś miał wirtualnego Excela, tylko bez wyświetlania. Np to co było w pliku w 10 wierszu a kolumnie 3, będzie w tablica[10,3]. Jako że nagłówki kolumn są w osobnej tablicy, w praktyce numer wiersza to zarazem numer obiektu, a numer kolumny to numer pola, przykładowo Gwiazda[Słońce, Kolor] = Żółty;
Albo inaczej: gwiazdy nie są u mnie obiektami, tylko wierszami w tablicy je zawierającej. To co widać na ekranie, to powiązane numerem z tymi wierszami... sześciany (model będzie do zmiany). Edytor po wybraniu gwiazdy na ekranie ładuje i zapisuje dane do tablicy (a docelowo do pliku). Innym rozwiązaniem które rozważałem oprócz tablicy dwuwymiarowej była tablica tablic (każda gwiazda byłaby tablicą, a jej komórki polami), jednak to rozwiązanie byłoby mniej wydajne.
Po prostu odwzorowywanie gwiazd w formie obiektów w runtime byłoby zbyt skomplikowane (mniej więcej tak działała pierwsza wersja którą opracowałem), bo przecież nie znam ani ilości pól w klasie do jakiej należą ładowane obiekty, ani ich typów. Dlatego zamiast robić to, oddzielnie ładuję dane do tablicy (większość jest czysto abstrakcyjna), i oddzielnie tworzę proste obiekty na mapie odwzorowując wybrane parametry wizualne.

Żadnych plików wsadowych nie używam. Aktualnie po prostu polecenie ładowania jest w tymczasowej funkcji "Startup" którą wywołuję po załadowaniu aplikacji, można też korzystać z wbudowanej konsoli (której kod udostępniłem na forum). Docelowo będzie interface wyboru pliku i opcji importu.

//edit: w zasadzie klasę obsługującą bazę danych mogę ci pokazać na pw, na wypadek gdyby to co napisałem nie było zbyt jasne/formalnie poprawne.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
i osobno trzymasz listę z nazwami pól?
 
Popisuje się ciągle menda jedna...

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Tak, mógłbym odwzorować całość w jednej dwuwymiarowej tablicy gdzie nazwy pól byłyby w zerowym wierszu, ale niepotrzebnie skomplikowałoby to kod nie dając nic w zamian. Przedstawię ci to po prostu na przykładzie.

Podajemy funkcji ładującej następującego wczytanego z pliku Stringa:
"name,x,y,z
ola,3,4,5
aga,4,4,4
kamila,1,1,0
kasia,2,0,5"
Funkcja zwraca obiekt typu "baza danych" z ustawionymi następującymi tablicami:
var attributes : String [] = ["name", "x", "y", "z"];
var objects = String [][] = [["ola", "3", "4", "5"]
["aga", "4", "4", "4"]
["kamila", "1", "1", "0"]
["kasia", "2", "0", "5"]]
Tutaj przedstawiłem je za pomocą literałów, ale w rzeczywistości tworzę je w pętli kodu. Jako że tablic dwuwymiarowych nie da się tworzyć w JScript.NET za pomocą literałów, więc tą drugą przedstawiam tak jakby była analogiczną tablicą tablic (od strony praktycznej to prawie to samo, różnią się zużyciem pamięci i elastycznością).

Ta tablica jest następnie przekazywana do funkcji która na jej podstawie tworzy obiekty na mapie (a potem korzysta z niej także wbudowany edytor). Dzięki tej separacji kod jest czytelniejszy, bardziej podatny na modyfikacje i mogę wykorzystać klasę bazy danych także do innych zastosowań. Ogólnie staram się iść w kierunku wzorca MVC, jednak obecnie po prostu brakuje mi wiedzy żeby w pełni go zrozumieć.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry