Kolonieansicht

Thor's picture

Dieser Thread sollte von nun an für die Diskussion der neuen Kolonieansicht dienen.
Bisher wurde dies hier: http://www.conquer-space.net/de/node/608 besprochen.
Leider ist dieser Eintrag inzwischen so lang geworden, dass man bei schlechter Verbindung eine Weile auf das Fertigladen warten muss.

Thor's picture

Antwort auf http://www.conquer-space.net/de/node/608#comment-760

Klingt gut.
Dann gib mal bitte diese lib damit ich mal schauen kann ob ich das dort ablegen kann. Es wäre mir sehr lieb wenn diese in Java oder C wäre da ich in Python performance Probleme schlecht analysieren / aus dem Weg gehen kann. Ich hätte auch kein Problem damit eine eigene Ablagestruktur zu konstruieren...

Bei ner extra lib wäre für mich auch noch wichtig zu wissen wie / ob man dort Texturen ablegen kann. Weil das hat bisher mit dem Python-Blender-Ding nicht so richtig funktioniert wie ich das wollte..

Wir müssen aber nicht zwangsläufig das .blend Format unterstützen. Blender kommt auch mit VRML etc zurrecht.
Ich kenne mich aber derzeit mit VRML etc zu wenig aus. Kann man dort auch die Position und den Winkel der Kamera ablegen? Weil die muss sich ja von der Kologröße abhängig skalieren beim rendern..

PS: @scorp, mein Script hat schon jetzt quasi nix mehr mit Blender zu tun und benutzt diesen nur als Datenablage und Renderer. Anstelle die Daten dort Blenderspezifisch abzulegen wäre es durchaus Sinnvoll von der Blender-API unabhängig zu werden. Das hätte unter anderem den Scharm dass ich beim nächsten Blender-release nicht meinen kompletten Code umschreiben muss bloß weil sich da was in der Blender-API geändert hat. So etwas wäre nun wirklich doppelte Arbeit für die ich tatsächlich keine Zeit oder Lust hätte...

UlfJack's picture

Geometrie Bibliothek

http://code.google.com/p/geomlib/

Die Bibliothek hat Unterstueztung fuer Texturen etc, aber ich kann Dir gerade nicht sagen, wie leicht das zu benutzen ist.

Thor's picture

re

Danke ich werds mir demnächst angucken.

Ich hab mich zwischenzeitlich mal bei Wikipedia umgeschaut. Wie es aussieht wird Java3D nun doch weiter entwickelt (vor einiger Zeit hatte Sun mal gesagt das sie das einstampfen und durch JavaFX ersetzen wollten). Es hat sogar eine Reihe Neuerungen und Verbesserungen gegeben bis zum aktuellen Release 1.5.2. (so z.B. auch eine JOGL Einbindung).

Wie wäre es wenn ich das Ganze gleich in einer Java3D-Szene umsetze. Du grundlegende Struktur von Java3D ist dem ersten Anschein nach sehr ausgereift und mächtig. Ebenfalls sind bereits VRML-Loader und Exporter vorhanden mit denen man das ganze durch externe Renderer (z.B. durch Blender) rendern lassen könnte. Natürlich könnte man das auch gleich direkt mit Java3D rendern jedoch müssten man erstmal prüfen wie performant dies wäre (ich traue den Aussagen nicht nachdem es nur sehr wenig langsamer ist als die direkte C-Implementierung)

Den Vorteil der Java3D bringt:
Laut Aussagen von Sun ist Java3D nun in alle aktuellen JRE's enthalten. Deshalb könnte man in CQS ein OPTIONALES JavaFX oder Applet anbieten wo man sich die Kolonie direkt anschauen kann.

Vorteile:
- Der Server bleibt vom gewaltigen Render-aufwand verschohnt (die Clients rendern ihre Kolo selber in "Echtzeit")
- Weniger Traffic als bei Bildern etc.
- In diesem Plugin könnte der Betrachter die Kolo drehen/bewegen und zoomen etc

Was hältst du davon?

UlfJack's picture

Java3D?

Also, wenn Du besagte Bibliothek benutzt, dann koennen wir das relativ einfach mit lwjgl rendern (eine OpenGL-API fuer Java). Java3D ist eine Scene-graph API. lwjgl funktioniert auch in Applets, und ich hab da auch schon Code fuer da...

Von der Geschwindigkeit her ist lwjgl etwa so schnell wie reiner C code - das liegt aber daran, dass beim 3d rendern mit ner Grafikkarte dieselbige die Geschwindigkeit bestimmt, nicht die Anwendungssoftware (sofern es halbwegs ordentlich programmiert ist).

Geraytracte Bilder werden vorraussichtlich eine bessere Qualitaet haben, aber wir koennen es auch erstmal so ausprobieren...

Thor's picture

re

Najo in j3d ist nun auch jogl (also openGL) enthalten aber mir ist es eigentlich egal wo es gemacht wird (muss mich so oder so in das jew. einarbeiten). Hauptsache wir verbauen uns für später keine Möglichkeiten die wir durch ein anderes Vorgehen gehabt hätten. Werd mir am WE mal deine lib im Detail anschauen und sehen ob ich damit zurrecht komme. Ich habe gesehen das da auch Testbeispiele enthalten sind (bei denen ich auf den ersten Blick nicht durchgeblickt habe).
Deshalb mal 2 Fragen vorweg:

- Wüsstest du auf anhieb ein Beispiel an dem ich sehen kann wie mittels Vertices und Faces ein Objekt erstellt wird?
Ich hab folgenden Code gefunden:

Vector3 a = new Vector3(0, 0, 0);
Vector3 b = new Vector3(0, 0, 5);
Vector3 c = new Vector3(1, 0, 0);
PolygonClipper3D clipper = new PolygonClipper3D(a, b, c);
clipper.clip(new XYPlane(false, 5));

Aber ich fürchte das es sich da um etwas ganz Anderes handelt (dass sich da irgendwo bei einer Ebene z=5 abspielt^^).

Ich bräuchte etwas wie:
Object3 o = new Object3();
Point3 a = new Point3(0, 0, 0);
Point3 b = new Point3(1, 0, 0);
Point3 c = new Point3(1, 1, 0);
Point3 d = new Point3(0, 1, 0);
Polygon p = new Polygon(a,b,c,d);
o.add(p);

Also ein Zusammenbauen eines mesh anhand von 4-Punkt Polygonen/Faces.

- Wie kann ich mir das Ergebnis ausgeben lassen?
oder wie bekomme ich die erstellte Struktur z.B. in eine Datei bestimmten formates raus? (hab dazu kein Beispiel gefunden)

>>Geraytracte Bilder werden vorraussichtlich eine bessere Qualitaet haben, aber wir koennen es auch erstmal so ausprobieren...

Diese Option (raytracing) würde uns für später ja dann noch offenstehen indem wir den Umweg über ein export-Format und externen Renderer gehen würden richtig?

Thor's picture

Ich werd erstmal meine

Ich werd erstmal meine Generierung eines float[] -Vertex -Arrays in Java fertig umsetzen. Dieses Erzeugen des Mesh ist ja erstmal unabhängig von dem Zielformat. In Java3d könnte ich diesen Array z.B. einfach mit setGeometrie einem shape3d zuordnen und fertig wäre das Objekt..

Bei meiner Suche einer optimalen Anbindung an den Browser habe ich folgende seeehr interessante Sache gefunden:
(offenbar plant Google einen lange überfälligen "Web3d Standard")

http://code.google.com/intl/de-DE/apis/o3d/

Mein K.O.-Kriterium für die 3D-Darstellung im Web via Plugin oder ähnlichen ist für die Darstellmöglichkeit in Linux. Bei quasi allen Plugins die ich gefunden habe wird nur Windoof unterstützt. Ich werd O3D von Google mal ausprobieren und wenn's unter Linux läuft (was angeblich der Fall sein soll) mal prüfen was man tun müsste um diese Präsentationsmöglichkeit anzubieten...

Thor's picture

re

Um mich nicht zu Verzetteln habe ich im WE nun folgendes gemacht:

Ich habe die Kolonieerzeugung nun in Java programmiert. Die Geometriedaten werden in selbsterstellten primitiven Objekten "Mesh", "Point", "Face" und "Szene" gehalten.

- Die "Szene" enthält "Mesh"-Objekte.
- "Mesh"-Objekte enthalten Point- und Face-Objektlisten.
- "Face" besitzen Point-Objektlisten (nur Referenzen)
- "Colony" ist von "Szene" abgeleitet und erzeugt die
benötigten Objekte bei Aufruf der Methode "build"

Zudem habe ich eine weitere JavaKlasse mit dem Namen YafarayExporter implementiert. Diese ist im Stande anhand eines "Szene"-Objektes eine XML-Datei zu erzeugen anhand der Yafaray das ganze rendert. Meine Beispielhafte Main-Klasse erzeugt eine "Colony", exportiert diese in eine Yafaray-Datei und ruft anschließend yafaray auf umd die Datei zu rendern.
Das alles klappt bis hierhin auch ganz gut.
Was mich allerdings etwas beunruhigt ist die Datei (bzw. deren Größe) die dem Yafaray übergeben wird. Diese ist bei 15000 Gebäuden (2 mio Polygone) etwa 100MB groß. Da diese aber blitzschnell erzeugt wird, ist dies hoffentlich kein Showstopper.
Ich muss noch ein paar Feinheiten implementieren die ich aus Zeitgründen noch nicht geschafft habe (z.B. höhere Gebäudehöhe im Kerngebiet).
Ebenfalls noch fehlend ist eine level-of-Detail Abstufung. Also dass bei wenigen Gebäuden und naher Kameraführung die Gebäude komplexer und höher qualitativ gerendert werden (Schatten, Spiegelungen, Texturen, Polygone) als wenn es sich um viele Gebäude dreht die man aus größerer Entfernung betrachtet.

@Ulf was hältst du von diesem Vorgehen, wäre dies erstmal so eine gangbare Lösung? Was mich auch interessieren würde wäre wie CQS das rendern anstoßen würde. Derzeit wird beim Start eine "HashMap<String,Integer>" erzeugt und als Vorlage für die Kolonie verwendet. Der String steht für die Gebäudeartbezeichnung und der Integer für die Anzahl der Gebäude die für diese Gebäudeart gebaut werden sollen.

UlfJack's picture

Ok

Hoert sich ok an. Kannst Du vielleicht auf Launchpad oder Google Code ein Projekt anlegen, wo Du den Source Code eincheckst? Ich wuerd mir die Sachen auch ganz gern ab und zu ansehen...

-- Ulf

Thor's picture

re

Ich will am WE weiter machen und dann werd ich das Ganze bei Google Code ablegen. Ist ja echt Klasse, dass man damit dann gleich subversion nutzen kann. Weil auf Arbeit nehm ich auch immer subclipse in meinem Eclipse und will es nicht mehr missen.

PS: ich habe nun auch mal testweise Texturen und Spiegelungen eingebaut. Sieht echt prima aus. Werd am WE wenn ich dazu komme ein Preview-Bild hier rein stellen..

chenlo's picture

ich kann da nirgenswo

ich kann da nirgenswo lesen,
das dieser google-web-3d-standart so neu und free sein soll.

google hat seit über einem jahr einen eigenen internen 3d-editor mit dem man im webstandartisierte modelle erstellen kann.
leider kostet das teil geld und hat sich bisher nicht durchgesetzt,
abgesehen von der unterirdischen modelierungsqualität.

http://sketchup.google.com/intl/de/

http://sketchup.google.com/3dwarehouse/swivel?mid=4bd00ee186e78b823bc692c4810b6ea7&width=350&height=300&tb=always&logo=false

ich hoffe sehr das das mit dem webstandart nicht darauf abziehlt,
die eigenen produkte zu pushen und damit andere ausen vor zu lassen,
es seidenn sie bezahlen dafür,
was bei opensource ja ein prob ist (blender)...

UlfJack's picture

O3D

O3D ist ein Browser-Plugin von Google, mit dem man 3D-Sachen machen kann (im Grunde OpenGL fuer JavaScript). Ich glaube aber, dass Google langfristig mehr auf WebGL setzt (auch OpenGL fuer JavaScript). Es gibt jetzt ne experimentelle Version von Chrome mit WebGL Unterstuetzung. Aber das ist eigentlich auch ganz egal - wenn wir die Daten in einem einfachen Format haben, dann kriegen wir die auch gerendert - O3D, WebGL, Java-Plugin, oder JavaScript.

chenlo's picture

wa was ganz anderes... die

wa was ganz anderes...

die kolonieansicht, kommt ja am ende als 2dimensionelles bild heraus,
sonst bräuchte man sich ja net über renderer unterhalten...

wieso kann man dann zb. nicht SVG nehmen?
es gibt da einen im-/exporter für blender, das die fertigen modelle in svg ausgibt...

programmiertechnisch in der bearbeitung wäre es einfach das es nur xml ist.
man spart sich den renderer komplet, da man die modelle direkt in xml an die brower ausgibt.
und für die zukunft hat man noch potential (SVG-A "Animated").
jeder browser kann mitlerweile svg darstellen, selbst der internet explorer...

http://www.blendernation.com/wp-content/uploads/2008/01/cube_array.png

http://www.blendernation.com/vectex-svg-vector-texture-plugin-for-blender/

http://blenderartists.org/forum/showthread.php?t=117889

UlfJack's picture

SVG?

Erstens ist es ziemlich schwierig, aus einer 3D-Datei zuverlaessig eine 2D-Grafik zu berechnen - ich wuerde darauf tippen, dass Blender nur die Linien ausgibt. Zweitens werden die XML-Dateien laut Thor ziemlich gross, und so ca. 100 MB SVG-Dateien sind dann doch etwas viel, oder?

UlfJack's picture

SVG?

Thor's picture

re

Ich habe mal den aktuellen Stand was berechnungsdauer angeht erstellt:
https://spreadsheets.google.com/ccc?key=0Ag5PK6g45RFydGxFaURNRWxJMFo3TmRTcEFmdFpCN3c&hl=de

Daran lässt sich natürlich noch hier und da was drehen.
Wo ist denn die Schmerzgrenze bzw. was sollten die Werte denn nicht übersteigen?

chenlo's picture

ne frage so allgemein

du verwendest ja jetzt den yafaray renderer...
kann man mit den zb. auch animationen erstellen?
also zb. den drehenden planeten oder so?

ich weis nicht wie das blender macht,
er rendert einzelne bilder und fügt die in einem videofile zusammen.
ich weis net ob sowas der renderer macht oder ne andere logik im progi...

also konkret...
könnte man auch später zb. qualitativ hochwertige planeten animationen mit yafray erstellen?
oder zb. die einheiten rendering geschichten outsourcen von blender?

Thor's picture

re

@chenlo, natürlich. Einfach Einzelbilder rendern und am Ende mit mencoder zum Video machen. (kann ja mal nen Koloaufbau/Gebäudebau animieren. Wäre vll ganz Schick)

@ulf, ich habs mal mit den aktuellen Werten grob überschlagen:
Für die letzte/aktuelle Gamma hätte man zum Rendern aller Kolos zum Ende der Runde 1,9h benötigt.
(Vorrausgesetzt der Server hat dieselbe Rechenleistung wie mein Laptop.)

Anmerkung:
Es wäre sinnvoll einen "klugen" Algorythmus zur Auswahl der zu rendernden Kolos zu verwenden. Beispiel/Ansatz:

- Je kleiner die Kolo ist, desto häufiger sollte sie gerendert werden.
Grund:
=> bei extrem großen Kolos kann man eh nicht mehr genau nachvollziehen wo/ob jetzt was dazu gekommen ist, während man in der Aufbauphase gerne beim Aufbau zuschaut.
=> eine sehr große Kolo zu Rendern benötigt genauso viel Zeit wie 50 kleine.

- Kolos bei denen sich bei der Gebäudeanzahl zum letzten Rendering nichts getan hat, sollten nicht nocheinmal gerendert werden. Das sind bei den vielen Leuten die im Laufe einer Runde inaktiv werden ne ganze Menge. Zudem umgehen wir damit unötige Renderings (weil z.B. der Job zu oft läuft etc)

- Wenn noch ein Renderingprozess im Gange ist sollte kein neuer ausgelöst werden

Thor's picture

PS

PS:
Ich habe jetzt mal wie von Ulf vorgeschlagen ein separates Google-Projekt hierfür erstellt:
http://code.google.com/p/hyperversum

Bitte stört euch nicht am Namen. Dieser hat einfach den praktischen Hintergrund, dass ich Besitzer einer entsprechenden Domain hyperversum.de bin auf der man später evtl. dann tierfergehenderes ablegen könnte.

PS: Die Sourcen werd ich die Tage noch einchecken..

@Ulf ich hätte da noch ne konzeptionelle Frage:
Wäre es OK, wenn ich jede Etage als ein Gebäude ansehe?
Es kann ja nicht sein, dass ein Wolkenkratzer im Kerngebiet genauso kostenintensiv ist wie ein Flachbau in der Randzone.
So wie ich das sehe ist die gerenderte Stadt lediglich die Hauptstadt des jeweiligen Kolonialgebietes also nur ein Ausschnitt. Wenn man in CQS 1 Gebäude baut, baut man in "Wirklichkeit" ja eh 1000 oder mehr. Schließlich passen ja keine 50.000 Menschen in einen kleinen Flachbau.
Ebenfalls ist es unglaubhaft dass ein riesiger überbauter Gasgig nur aus einer Stadt besteht. Vielmehr gibt es viele Städte die dann mehr und mehr zusammenwachsen.
Wir sehen also nur einen Ausschnitt aus der Hauptstadt die repräsentativ für die Planetenumschließende Kolonie dargestellt wird. Würdest bei dieser Sichtweise mitgehen oder wie siehst du das?

Der Auslöser für mein Gefrage ist nämlich, dass mir auffiel, dass es quasi keinen Sinn macht 15000 Gebäude komplett darzustellen. Das sieht dann eher wie eine weit entfernte graue (mittlerweile blau- verspiegelte) Wiese aus und nicht nach einer Stadt. Man könnte also auch gleich dazu übergehen, nur das Kerngebiet zu zeigen und wie es sich im Laufe des Weiterausbaus entwickelt (aus Flachbauten werden Wolkenkratzer mit Andockbuchten und Querverbindungen etc..).
Ich glaube wir können den Betrachter so viel Fantasie zutrauen, dass er sich vorstellen kann, dass die Kolonie noch viel größer ist als der gezeigt Ausschnitt.
(Das Vorgehen hätte neben der Glaubwürdigkeit wahrscheinlich auch positive Auswirkungen auf die Renderzeit)

chenlo's picture

referenzen

ok, nächste frage von mir ma in die runde geworfen.
du hast mir mit einem satz sehr viel angst gemacht:
"Wenn man in CQS 1 Gebäude baut, baut man in "Wirklichkeit" ja eh 1000 oder mehr."

Deine kolonieübersicht unterscheidet sich grundlegend zu den gebäudegrafiken.
kann man da nicht irgendwelche wechselwirkungen erzeugen?

also zb. das man am anfang nur ein kleines genereirtes gebäude bild hat und bei großen kolonien einen wolkenkratzer als gebäude hat um diesen dann zu bauen?

das bringt mich wieder an den anfag meiner grundüberlegungen ganz am anfang,
wie ist das bei industriellen gebäuden?
macht es denn wirklich keinen sinn zb. 6 verscheidene höhen zu entwerfen und dein koloniealgorythmus setzt nur das entsprechende ein?

die 2. idee von mir ist:

es gäbe auch alternativen.
die größe einer kolonie wird nicht nur durch die oberfläche die der planet (kugel) aufgespannt A=4*pi*r² bestimmt sondern auch durch den radius.
d.h. jeh größer ein planet ist, um so tiefer kann man auch in die erde gehen.
um zb. unterirdische stahllager oder öllager u.s.w. anzulegen.
die bauplatzkosten begründen sich im aufwand der stabilisierung vor dem magma...

3. punkt wäre dann...

eine kolonie sollte auch dann neu gerendert werden, wenn zuvor ein landungskampf stattgefunden hat, bei dem begäude verloren gingen...

Thor's picture

re

- Natürlich werden erst kleine Gebäude gebaut die dann immer größer werden. Die aktuellen Bilder sind nur ein Zwischenstand der mir zum Testen der Gebäudegenerierung hilft.

- Die Gebäudeunterscheidung ist ebenfalls vorgesehen/geplant (siehe alter Thread). Die aktuellen Preview-Bilder zeigen jedoch für Testzwecke immer nur eine Gebäudeart. Um die Implementierung der anderen Gebäudearten kümmere ich mich später (das jetzige ist ein HZ). Natürlich würde ich dann auch gerne auf vorgefertigte Modelle zurückgreifen jedoch musst du dann sehr auf die Polygonzahl achten. Ein Gebäude hat derzeit zwischen 12 und 300 Polygone. Zudem sind die Gebäude in Etagen eingeteilt. Auf der Projektseite liegt die glaube so zwischen 8-40 Etagen. Es müsste dann also auch geklärt sein wie man aus einen 10-Etagen-Model ein 14-Etagen-Model erzeugt. (z.B. zerren oder best. Abschnitt mehrfach einfügen..)

- Wenn ich deinen Punkt 3 richtig interpretiere hast du den letzten Thread nicht mehr korrekt in Erinnerung: Wir hatten gesagt, dass die Kolonie bei jedem Renderprozess vorher neu erstellt wird. also auch wenn ein Gebäude dazu kommt, sehen alle Gebäude dann unterschiedlich aus. Natürlich wäre es erstrebenswert, dass nur das zu ändernde Gebäude verändert wird und dann neu zu Rendern jedoch sind vor diesem Schritt noch einige Dinge zu klären. An erster Stelle, wieviel Daten müsste man dann ablegen und wie tut man das...
Jedoch ist das alles Stoff für Phase II.
Ich möchte so schnell wie möglich eine stabile, in CQS- einsetzbare Anwendung haben bevor ich in die Tiefe gehe.

Schließlich muss dort auch noch was getan werden um das Rendering anzustoßen und die Kolobilder einzubinden.

Thor's picture

re

Um dieses Forum nicht so zuzuspammen hab ich mal ne Wikipage zum Thema Gebäudeartein erstellt. Dort kann man Kommentare ablegen aus der dann gleich auch eine Dokumentation entstehen kann...

http://code.google.com/p/hyperversum/w/list

Thor's picture

re

Auf der Projektseite hab i mal ein Video reingestellt an dem man den Verlauf eines Koloaufbaus sieht. Das ist in miesester quali damit mein Laptop nicht so lange rechnen braucht..

http://www.youtube.com/watch?v=9PUjT0BSsk0

chenlo's picture

hach... immer wieder schön

hach...
immer wieder schön "mathematik" sehen zu können...

sieht aber auf grund deinee komischen konischen gebäude im mom mehr wie das wachsen eines kristalles aus...
also eher zu zufällig...

UlfJack's picture

Etage

Ja klar. Wie Du Gebaeudezahl in Etagen umrechnest ist voellig Dir ueberlassen.

chenlo's picture

ich hätte da mal eine weitere

ich hätte da mal eine weitere frage...

is es möglich bzw. erstrebenswert die kolonieansicht,
planetenabhänig zu gestallten?

also das sie bei jedem untergrund anders aussieht.
nicht nur so wie in deinem beispiel was für eine terra welt zuträfe,
sondern auch vll mit einer gigantischen ökosphäre auf einem gasplaneten und einer kleinen bergbaukolonie bei asteroiden.

http://images3.wikia.nocookie.net/starwars/images/thumb/3/3a/Hutt_Asteroid_Station.jpg/800px-Hutt_Asteroid_Station.jpg

http://www.star-fox.com/image/ecosphere.jpg