Hallo, Gast
Sie müssen sich registrieren bevor Sie auf unserer Seite Beiträge schreiben können.

Benutzername
  

Passwort
  





Durchsuche Foren

(Erweiterte Suche)

Foren-Statistiken
» Mitglieder: 148
» Neuestes Mitglied: Pinomar
» Foren-Themen: 671
» Foren-Beiträge: 3.831

Komplettstatistiken

Benutzer Online
Momentan sind 39 Benutzer online
» 0 Mitglieder
» 39 Gäste

Aktive Themen
Blue Wave Club
Forum: Events
Letzter Beitrag: DJ Dereos
Vor 1 Stunde
» Antworten: 83
» Ansichten: 28.946
Mode in Nextlife - free &...
Forum: Free Bie Ecke
Letzter Beitrag: Otto vonOtter
Vor 8 Stunden
» Antworten: 4
» Ansichten: 447
Immer wieder Sonntags... ...
Forum: Events
Letzter Beitrag: Marina Baer
Gestern, 20:46
» Antworten: 0
» Ansichten: 26
Projekt: Rätsel-Sims
Forum: The Public World
Letzter Beitrag: Marina Baer
Gestern, 20:25
» Antworten: 0
» Ansichten: 31
Lag-Test für Speedboot-Re...
Forum: NextLife-World 3 Jahre
Letzter Beitrag: Sylvia Koeln
18.06.2018, 21:42
» Antworten: 0
» Ansichten: 55
Eröffnungs-Party am 21.06...
Forum: NextLife-World 3 Jahre
Letzter Beitrag: Sylvia Koeln
18.06.2018, 21:26
» Antworten: 0
» Ansichten: 39
Red River Ranch
Forum: NextLife-World
Letzter Beitrag: Sylvia Koeln
18.06.2018, 21:21
» Antworten: 4
» Ansichten: 102
Dienstag-Party bei Amanda
Forum: Events
Letzter Beitrag: Sylvia Koeln
18.06.2018, 14:34
» Antworten: 8
» Ansichten: 3.438
Partytime im TPW - FoxClu...
Forum: Events
Letzter Beitrag: Sylvia Koeln
18.06.2018, 00:46
» Antworten: 3
» Ansichten: 108
Tiger's Revier*Fanta Ama^...
Forum: Dereos
Letzter Beitrag: Smaragd
17.06.2018, 14:26
» Antworten: 3
» Ansichten: 159

 
  Mesh Import in Open Simulator
Geschrieben von: Tron Mcp - 12.07.2016, 12:06 - Forum: Blender - Antworten (2)

Mesh Import in Opensimulator


(beschrieben für Firestorm Version 4.6.9 – 4.7.7). Als Grundlage dient ein in Blender erstelltes Objekt.
 
Allgemeines: Dieses Dokument beruht auf eigenen Tests. Es erhebt weder den Anspruch auf Vollständigkeit sowie Unfehlbarkeit. Ich habe es dennoch veröffentlicht, da derartige Infos nur schwer erhältlich sind, und jeder der schon mal Mesh hochgeladen hat, die Komplexität der Materie zu spüren bekam.
 
 
Allgemeines zu Mesh und 3D Speicherformaten
 
3-D Formate entspringen überwiegend proprietären Produkten führender Hersteller von  3D-Software.
 
Funktionsumfang und Komplexität jener Softwareprodukte ist jedoch stark unterschiedlich.
Entsprechend ihrer Herkunft und Entstehungszeitraum enthalten sie jeweils nur die Funktionen die jene Softwareprodukte auch bieten.
 
Auch ist nicht abgegrenzt was tatsächlich zum Umfang einer 3D Bearbeitung gehört.

 
Folgende Funktionsbereiche sind mehr oder weniger in 3D Software vorhanden:
 
- Erstellung von Koordinaten in Fläche oder Raum
- Erstellung von Gittermodellen (Meshes) = Verbinden der Koordinaten
- Füllen der Gitter mit Flächen (Surfaces, Faces). Diese können aus Dreiecken, Vierecken oder Polygonen bestehen
- Texturien von Flächen. Diese kann in beliebiger Komplexität mittels Texturen, Bemalen oder belegen mit Materialien erfolgen.
- Erstellen von Skelettmodellen und Beweglichkeitsdefinitionen (Bones)
- Animieren von Skelettmodellen anhand Zeitachsenmodellen (Timeline)
- Anpassen von Meshes an Bewegungsachsen, Drehpunkte, Skelettmodelle etc. (Bones, Rigged Mesh,..)
- Partikelsysteme (Haare, Wasser, etc. )
- Ausleuchtung von Szenen
- Animation von Szenen anhand Timeline
….
 

Dieser Funktionsumfang interessiert uns in der Folge nicht, da wir uns nur auf echtzeitfähige 3D Grafik beschränken wollen, die sich n Open Simulator importieren lässt.
 
Er ist aber für viele Problematik im Umgang mit 3D Dateien verantwortlich.
Viele Formate enthalten Teile die wir nicht benötigen,
 
Umgekehrt fehlen in manchen Formaten für uns wichtige Teile, die wir benötigen, oder sind in für uns unbrauchbarer Weise enthalten.
 
Hier eine beschränkte Auswahl von 3D Dateiformaten die uns häufig begegnen:
 
.MAX  Neues Format der Firma Autodesk. Profisoftware, inkompatibel zu allen anderen Softwaretiteln. In verschiedenen inkompatiblen Versionen verbreitet. Mächtigstes Format das auch extrem große Meshes beherrscht. Keine kostenlose Export oder Konvertiermöglichkeit in freie Formate als verfügbar bekannt. Software selbst ist hoch komplex und schwer zu bedienen. Lizenzmodelle verhindern Hobby Anwendung. Das .dae Exportmodul der Software konnte im Test nicht überzeugen. Es stürzte häufig ab. Exporte waren oft korrupt und nicht import fähig.
Da das Format in Firmen oft zur Entwicklung eingesetzt wird, finden sich viele hochwertige Modelle aus Firmenprodukt Katalogen im Internet zum freien Download.
 
.3DS  Ursprünglich altes Format von 3DS-MAX der Firma Autodesk. Weit verbreitet, auch in vielen anderen Software Titeln als Import und Export Format vorhanden. Mittlerer Komplexität. Häufige Probleme beim Import in Blender wenn Skalierung nicht stimmt, oder sich Bezugspunkte durch die Konvertierung verändern. Sehr viel freies (meist älteres, oder aus max konvertiertes) OpenSource Material im Netz ist in diesem Format verfügbar.
 
.OBJ  Eignung für weniger Komplexe Mesh Größen, aber mehr als ausreichend für Simulator Importe. Sehr gut konvertierbares Format zum Import in Blender. OBJ Dateien eignen sich auch sehr gut zur Ausgabe Konvertierung in .dae.  Wenn nicht .dae oder .blend direkt verfügbar sind, dann ist .OBJ das Vorzugsformat. OBJ Import und Export Module hat jede brauchbare 3D Software.
 
.LWO  Format von Lightwave. Wenig verbreitet in Opensimulator Kreisen. Import meist unproblematisch. Import und Export Module sind in andern Softwaretiteln gelegentlich vorhanden.
 
.BLEND Natives Format von Blender, ähnlich .OBJ. Vorzugsformat zum Abspeichern von Archiven für Opensimulator. Format wird aber nur von Blender verwendet. Import und Exportmodule in andern Titeln sind mir nicht bekannt.
 
.DAE Standardisiertes freies Format. Nur Teile des Funktionsumfanges werden vom Simulator unterstützt. Daher funktionieren Uploads im Viewer manchmal nicht. Fazit: es muss in einem bestimmten .dae Derivat abgespeichert werden damit der Import in den Simulator klappt.
 
 
 
Grundlagen zu importfähigen .dae Meshes:
 
das im Simulator zu importierende Mesh muss im .dae Format vorliegen.
 
Da der Begriff Mesh in verschiedenen Kontext in Verwendung ist, lege ich für diesen Artikel folgende Bedeutung zum Verständnis fest: Ich halte mich an die Verwendung des Begriffs in Blender.

Das bedeutet folgendes: Ein Meshobjekt ist die kleinste in Blender unabhängig zu bearbeitende Einheit. Der gesamte Inhalt einer DAE Datei kann aus mehreren gleichzeitig zu ladenden Meshobjekten bestehen. Jedes Meshobjekt wird beim Import in Opensimulator zu einem eigenen (verknüpften) Prim gewandelt.
 
 
Geltende Einchränkungen innerhalb des .dae Formates bei Import in OpenSimulator:
 
     Das zu importierende Mesh darf nur aus Dreiecken bestehen ( Also beim Export in . dae die Umwandlung alles Flächen (Faces) von N-Poligonen und Vierecken in Dreiecken anwählen)
 
     Die Anzahl der Dreiecke sollte möglichst unter 30000 liegen. Höhere Dreieckzahl kann zu zerstörten Flächen führen. Diese erkennt man an weissen untexturierten Dreiecken innerhalb texturierter Flächen.
Abhilfe: Nur vor dem Export möglich durch Reduktion der Auflösung oder Aufteilung des Meshes in mehrere separate Importschritte.
Ab so ca. 60000 Dreiecken geht es meist schief, und der Viewer hängt sich nach langer Rechenzeit auf. (Die Zahlen stellen nur Richtwerte dar!)

 
     Skalierung und Ursprungspunkt: Je nach Erstellung werden verschiedene Masstäbe für das Gitternetz verwendet: mm, cm, m oder aussereuropäische Massysteme.
Die Viewer erwarten Meshes ungefähr in der benötigten Größenordnung, die ein importiertes Mesh zwischen 0.01 und 256 Metern ergeben.
Die Größe ergibt sich aus Meshgröße * Erstellungs Massstab * Viewer Skalierung.
Als Fallstrick kann sich auch ein weit entfernter Mesh Mittelpunkt (=Drehpunkt) erweisen, da nicht die Kantenlänge sondern die Verteilung der Punkte im Raum ausschlaggebend ist, und der MeshUrsprung zählt da als Punkt dazu.

 
     Skalieren geht nur zwischen 0,01 und 100 gut. Ausserhalb dieses Bereichs stürzt der Viewer meist ab.
 
     Das Ergebnis der Skalierung darf folgende OberGrenzen nicht überschreiten:
     ◦     Kantenlänge der Sim
     ◦     in Simulator (Region .ini Datei) eingestellte maximale Meshgröße/Primgröße (meist 64, 128m, selten 256m)
     ◦     in Simulator (Region .ini Datei)  eingestellte maximale Meshgröße/Primgröße für physikalische Objekte, falls das Mesh per Physik mobil sein soll (meist 32m oder 64m, selten 128m).
     ◦     TIP: Keine zu großflächigen Meshes am Stück bauen (z.Bsp: gesamte Simfläche). Wenn möglich teilen. Hintergrund: Die Berechnung der darzustellenden Objekte im Viewer erfolgt Abstands Abhängig. Ist das Mesh zu groß muss der Viewer mehr laden als für die Anzeige notwendig wäre.
 
     ein Import darf mehrere (sub) Meshes enthalten, die wiederum mehrere verschiedene Oberflächen enthalten. Jedoch sollte man folgendes bedenken:
     ◦     Je Mesh wird 1 Prim berechnet. Je Mesh wird ein unabhängiges Element (Verknüpft wenn es mehrere Meshes sind) hochgeladen.
        Jedes dieser Elemente kann im Simulator unabhängig verändert werden. Vernünftige Anzahl wird ca. 20 nicht überschreiten

     ◦     Je Mesh und Oberfläche ist genau eine Textur erlaubt. Ab ca. 6-8 Texturen gibt es Import Fehler.
        Der Zugriff auf importierte Oberflächen ist analog zu den Flächen eines Primwürfels.
        Jede Fläche kann eigene Textur, Ausrichtung, Skalierung, NormalMap, Glowmap, Transparenzwert, Färbung und Leuchten haben.
        Ansonsten ist die Oberfläche nicht separat editierbar. Die Anwahl erfolgt über Bearbeiten Menü – Fläche auswählen im Viewer.
        Die Oberflächen Nutzung reduziert die Primzahl, und die nachträgliche Editierbarkeit.
        Sie hat KEINE Auswirkung auf die Simulator und Serverlast!
        Für Fahrzeuge ist die 1Prim Lösung besser, da es nicht zum Verlust der Zuordnung durch Aufbruch des Verbundes kommen kann.
        Nachteilig wirkt sich der Verlust der Objekt Teilbarkeit auf die Client Performance aus,
        wenn einige Meshes nicht wie sonst auf Phantom gesetzt  werden können, und unsinnigerweise Physik dafür gerechnet wird.
        Dazu aber später im Kapitel Physik mehr Details , und bessere Lösungen

    ◦     TIP: UNBEDINGT die Blend Datei mit getrennten Meshes separat abspeichern um in Blender die Editierbarkeit des Projektes sicherzustellen.
       Auch hat es sich bewährt zunächst die Entwürfe nicht „verbunden“ zu einem Mesh zu importieren.
       Erst wenn alles passt eine Kopie der Blend datei zur Verknüpfung der Meshes erstellen, diese Verbinden, und als 1Prim dae exportieren.

 
Fazit: Glück ist wenn es funktioniert, nicht abbricht, und sogar noch das erhoffte Ergebnis rauskommt.
 
 

Grundlagen zu importfähigen Texturen für .dae Meshes:
 

Texturen für Meshes können im 24bit oder 32Bit Farbtiefe als PNG, Tiff oder JPEG vorliegen.
Ist vorgesehen ein Mesh mit der Bodentextur zur Deckung zu bringen (Beispiel Mesh Schneewehe auf Schnee Simboden),
so sollten nur 24Bit Texturen zur Anwendung kommen da es sonst sichtbare Farbunterschiede gibt.
Andere Formate habe auch andere Farbräume!


 
Vorzuziehen ist PNG weil es keine Datenreduktion enthält, und mit Transparenz Kanälen umgehen kann.
Tiff kann noch zusätzlich Tiefen Informationen mitführen, jedoch ist die Anwendbarkeit/Steuerbarkeit im Simulator kritisch.
Besser externe PNG Dateien mit Tiefeninfo (NormalMap) und Glanz (Glow) verwenden.
JPEG verschwendet sinnlos Textur Schärfe durch mehrfach Datenreduktion.
Die Texturen werden intern eh wieder (in andern Codec!) komprimiert abgespeichert. JPEG ist also die schlechteste Wahl.
Da Windows Rechner standardmäßig Tiffs nicht anzeigen, ist der Umgang damit unerfreulich.

 
Die Auflösung der Texturen ist aktuell auf 1024x1024 beschränkt.
Es gilt der Grundsatz: so viel Auflösung wie nötig – aber sinnlose Speicherverwendung vermeiden.
Für mich hat es sich bewährt im Vorfeld zu überlegen wie groß die zu texturierende Fläche auf dem Monitor später dargestellt werden wird, davon die Monitor Pixel des Ausschnitts grob zu berechnen, dann durch die Anzahl der Textur Wiederholungen zu teilen. So erhält man ein Richtmaß für die benötigte Textur Auflösung. Gut ist es dann diese Textur in dieser – und einer höheren Auflösung hochzuladen, und zu testen ob der Unterschied sichtbar ist.
 

Dabei soll die Summe der gesamten Textur Last des Sichtradius nicht den Grafikspeicher der ClientPCs übersteigt.
Ich setzte mindestens 1GB dedizierten Grafikspeicher bei OpenSim geeigneten einfachen Rechnern voraus.
Wer diese Grafikspeicher nicht hat (Intel!) der wird eh an anderer Stelle mit Ruckelgrafik scheitern.


Aus Performance Gründen der Grafikkarten Speicherverwaltung soll eine 2^n Kantenlänge gewählt werden. Vorzugsgrößen sind hiermit: 1024, 768, 512, 384, 256, 192, 128, 96, 64, 32.

Wobei X und Y unterschiedlich sein dürfen. Es hat sich in der Regel bewährt die Textur mit gleicher DPI zu skalieren und das Länge/Breite Verhältnis zu bewahren.

Bei manchen Importen skaliert der Viewer automatisch auf 256 / 512 oder 1024, das sollte durch gute Vorgabe vermieden werden, da die Skalierung durch den Simulator schlechtere Ergebnisse bringt.
 
Exporte von texturierten Mesh aus andern 3D Programmen, die diese Regeln nicht einhalten werden nicht texturiert geladen, oder führen zu Fehlern.
 
 



Nach all der Theorie nun zum Schrittweisen Import von Mesh 
(in OpenSimulator mittels Firestorm)
 
 
Unsere Fallstudie setzt ein einfaches Objekt aus 2 Elementen voraus.
 
In Blender waren dies vor dem Export folgendermassen dargstellt:
 
- Die Triangel Rakete und Schweif beschreiben je ein Objekt.
     Dabei ist das Objekt Schweif von dem Objekt Cylinder in der Positionierung abhängig.
     Manipuliert man Rakete im 3D Raum, dann gilt das für Schweif mit.
- die Triangel Cylinder und Cylinder.002 sind die eigentlichen Meshes
- die runden BMW Kreise stellen zugeordnete Materials dar
- die Bild Symbole stellen dem Materal zugeordnete Texturen da
 

   
 
 
Wichtig ist die Selektions Reihenfolge der Objekte Schweif und Rakete vor dem .dae Export.
Sie legt fest welches MeshObjekt das root Prim wird. Dies hat nach dem Import im Simulator Auswirkungen, beispielsweise für den gemeinsamen Dreh- und Schwerpunkt.


Beide Objekte wäre auch im Simulator gleichermaßen verbunden wenn sie nicht in der Baumstruktur in der Hierarchie stünden.
Die Baumstruktur hat also nur in Blender für die Bearbeitung Auswirkung.
Vorsicht: Mehr als 2 verschachtelte Triangel Ebenen führen zu einem Import Fehler! Liegt eine derartige Blender Struktur vor, so muss die zunächst umgebaut werden.
 
 
Erklärung der Struktur im Detail:
 
Element1 (Raketen) vereint 3 Blender Materials (Zuendkammer, Spitze, Brennkammer), wovon nur 2 Texturen tragen.
 
Die 3 Materials in Cylinder sind durch die vorherige Vereinigung („join“) von 3 Meshes mit unterschiedlichen Material entstanden.
 
Merke: Bei Join Vereinigung von Meshes entstehen soviele Materials, wie vorher unterschiedliche Materials vorhanden waren. Die Anzahl der Meshes hingegen spielt keine Rolle. Nachträgliche Texturierung im Simulator von Objekten mit Materials, aber ohne Textur scheitert in der Regel wegen Fehlpositionierung.
 
Nach dem Import im Simulator wird daraus ein 1 Prim Objekt mit 3 Oberflächen „Faces“, wovon 2 texturiert sind, und eines nur gefärbt.
 
Daran angehängt ist ein weiteres Element2 (Schweif) bestehend aus einem einzelnen Mesh mit einem einzelnen texturierten Material. Nach dem Import im Simulator wird daraus ein 1 Prim Objekt mit 1 texturierten Oberfläche „Face“. Dies ist der Normalfall wenn nicht Prim Optimiert wie bei Element 1 gearbeitet wird.
 
Details zum Export erfolgen später in der Export Lektion zu Blender. Hier nur die Anmerkung, das die .dae mit der Option Texture Export erzeugt wurde. Die Texturen werden dabei im gleichen Verzeichnis wie die .dae zusätzlich abgelegt. Beim Import müssen diese auch zusammen im gleichen Verzeichnis liegen.
 
 
Import in Firestorm:
 
 
Das Mesh Import Fenster wird über „Bauen – Hochladen - Modell“ gestartet. Nach Auswahl der Demodatei: RaketenV01.dae erscheint dieses Fenster:
 
Das Fenster ist in 2 Blöcke unterteilt:
 
Rechts das Vorschau Fenster das beim Suchen nach den richtigen Parametern unterstützen soll, und links die 3 Reiter der Parameter Eingabe.
 

   

 
Zunächst sehen wir uns das Vorschau Fenster an:
 
Im Vorschaufenster sind durch Scrolen und Drehen manchmal schon fehlerhafte Exporte zu erkennen.
Außerdem kann die Wirkung der Dreiecksreduktion grob begutachtet werden. Dazu später mehr.
 
 
Bedienung:
 
Mit Mausklick in den Bildbereich lässt sich das Bild per Mausrad rein/raus Zoomen.
Ebenso wirken Mausbewegungen Vorwärts / Rückwärts mit gedrückter linker Taste.
Bewegungen Links/Rechts seitwärts mit gedrückter Taste drehen das Objekt.
 
Mittels der Checkboxen „Texturen, Kanten und Physik“ kann das zu importierende Objekt begutachtet werden.
Physik und Vorschaudehnung gehen dabei erst nachdem unter dem Reiter Physik „Analysieren“ gewählt wurde.
Die Vorschaudehnung zerlegt Physikflächen als Explosionsmodell, um die Kollisionsflächen des Objektes anzuzeigen.
In Opensimulator ist aus Lizenzgründen nicht die Funktionalität der SL Havoc Physik hier enthalten.
Daher arbeitet der Mesh Physik Import nicht zuverlässig. Zu Behelf und Optimierung später.
 
Skingewichte und Gelenke gehen nur wenn entsprechende Daten in der .dae Datei enthalten sind.
Wer in der Liga spielt, braucht meine Erläuterung hier nicht mehr.

     
 
 
Wichtigste Schaltfläche des Vorschau Bereichs ist die Auswahl „Hoch, Mittel, Niedrig, Niedrigst“.
Damit wird die Ansicht auf eine der 4 erzeugten Mesh Auflösungen umgestellt.
 
Dazu muss man wissen das der Simulator, zur Reduktion von Client Aufwand, 4 verschiedene Meshes für verschiedene Betrachtungsabstände erzeugt.
 
Dabei entspricht Hoch der detaillierten Nahbetrachtung, Mittel wird für einen etwas weiteren Betachtungsabstand gewählt, usw.
Niedrigst ist dann der am weitesten weg liegende Abstand, aus dem das Objekt noch dargestellt wird.
Diese Weite ist im Simulator in den Grafikdetails einstellbar.
 
Bei Umschalten dieser Schaltfläche sieht man die Darstellungsfehler bei entfernter Betrachtung.
Die Einstellung der Fehlerrate erfolgt links in gleichnamiger Schaltfläche, die ich anschließend gleich erkläre.

Wichtig hier: immer die Ansicht einstellen, die links gerade bearbeitet wird.
 
 
 
Der Einstellungs- Bereich:
 

   
 
Dies sind die Startwerte der angewählten Importdatei.
 
Mesh Auflösung „Hoch“:

Unter „HOCH“ sieht man die Anzahl der tatsächlich in der Datei vorhandenen Dreiecke, und der dazugehörigen Scheitelpunkte zur Normalen Berechnung. Die Zahl der Dreiecke unter hoch ist also nicht veränderbar. Die Ansicht entspricht einer Nahbetrachtung in Makro Modus durch den Avatar.
 
Nun kommt die Schaltfläche „Normalen Generieren“ ins Spiel. Sie Bestimmt ob die Oberfläche aus der Datei 1:1 importiert wird, oder beim Import eine Glättung der Flächen erfolgen soll. Dies hat folgende Auswirkungen:
 
Ohne „Normalen Generieren“ bleibt unsere Rakete ein 12eckiger Zylinder. Den habe ich absichtlich so grob angelegt um massiv Dreiecke zu sparen. Manche Designer hätten da 128 Zylinderflächen genommen damit alles rund erscheint...  aber das wäre uneffizient gewesen.
Schalte ich „Normalen Generieren“ an so wird der Zylinder auch mit 12 Flächen rund.
Nachteil wären dann beispielsweise bei Möbeln oder Häuserecken fehlende Ecken und Kanten.
 
Also hier bitte einschalten da es nicht auf rechteckige Formen und Kanten ankommt.
Nun wird das Feld Knitterwinkel freigegeben.
Damit kann man die Glättung grober Flächen noch anpassen, jedoch habe ich selten davon sinnvoll Gebrauch gemacht.


Dennoch mal eine Stufe rauf und wieder runter auf 75.000 Schalten. Nun erst wird die Ansicht im Vorschaufenster richtig berechnet! Bei diesem Objekt schlecht sichtbar, aber generell ist die Glättung um Vorschaufenster gut zu erkennen.
 
Gleichzeitig verändert sich dadurch meist der Wert Scheitelpunkte.
Bei manchen Meshes zum Beispiel mit gekrümmten Blättern beträgt die Reduktion und damit der Gewinn bis 50%.
Hier springt er von 321 auf 216. Keinen Gewinn gibt es nur bei Bauten mit lauter rechten Winkeln.
 
Kurzer Blick in Vorschau „Hoch“ bestätigt das Ergebnis.
 
Damit ist das Mesh „Hoch fertig“.
 

 
Mesh Auflösung „Mittel“:
 
Zunächst die Vorschau auf „Mittel“ stellen. Kurzer Blick bestätigt desaströse Zerstörung des Mesh. Also was tun?
 
- Möglichkeit 1: „Quelle - Mittel“ unter „Generieren“ „Dreieckslimit“ belassen und die Dreieckszahl hochstellen bis die Störungen akzeptabel sind.
 
Danach auch für Mittel wieder „Normalen generieren“ wie vorhin.
 
-Möglichkeit 2: eine andere Datei mit weniger Details in  Blender erstellen, exportieren und hier mit „Mittel“ - „Aus Datei laden“ hochladen.
 
Dies ist sicher bei komplexen Meshes mit vielen Dreiecken die absolut beste Lösung.
 
Der Aufwand für die Erstellung vervierfacht sich in Blender dadurch wenn das für alle 4 MeshStufen so durchgeführt wird.
 
In anderer 3D Software kann man hochwertige automatische Poligon Reduktion nutzen.
 
-Möglichkeit 3: „Mittel“ - „Detailstufe oben verwenden“. Diese würde auf die zusätzliche Erstellung von Meshes für diese Ebene verzichten.
 Vorteil : Schnell für Test und Entwicklung

 
Bei der geringen Dreieckzahl unseres Objektes wäre das meine erste Wahl, für alle 4 Mesh Ebenen.
 
Bei effizienter Mesh Erstellung ist der Import problemlos und einfach. Fehler bei der Mesh Erstellung können hier nicht mehr ausgebügelt werden, bestenfalls vertuscht.
 
 
Nachdem nun alle Meshes die normalisierte Originaldatei verwenden, müssen wir Art des Modells auswählen und den Namen ggf. Korrigieren
 
Was genau das Feld „Dieses Modell repräsentiert“ bewirkt habe ich nirgends gesehen, aber es scheint eine Schnellumschaltung verschiedener Betriebsmodis zu sein, die folgende unter anderen Funktionen beeinflusst: Physikerstellung/ Phantom, Überprüfung von in der ini Datei gesetzten Limits (maximaler Primzahl, Größen,...), Freischaltung von Zusatz Funktionen.
 
Avatarform: → Das Mesh enthält Bones und Gelenke, die Funktionen werden freigeschalten. Das Objekte wird sich später als Avatar bewegen, was auf die Physik Einfluss hat.
 
Avatar Anhang: → das Objekt wird eh Phantom, vergiss die Physik. Der Montage Punkt wird wichtig.
 
Mobile Objekte: → es gelten die Regeln für physische Objekte: Maximale Größe 32/64 etc. Außerdem muss eine Masse und ein Massenmittelpunkt bestimmt werden.
 
Baukomponenten: statisches Element mit Kollision
 
der Rest:  ist fraglich wie sich das auswirkt.
 

   


 
Einstellung der Physik
 
 
Grundlagen:
 
Die Physik regelt die Kollisionsberechnug mit anderne Objekten. Ausserdem werden Massen und Massenmittelpunkte ermittelt.
 
In Opensimulator ist diese Funktion nicht wirklich gut implementiert, da wie schon oben geschrieben das Original Modul Lizenzpflichtig wäre. Daher hat mich die Funktionsweise dieser Funktion oft an den Rande des Abgrundes gebracht. Heute bin ich einen Schritt weiter.
 
Abhilfe: Objekt „irgendwie“ importieren und auf Phantom setzten
dann mit Hilfe einfacher Prims Kollisionsobjekte erzeugen, platzieren und testen. Geht alles wie gewünscht, diese Physik Prims auf transparent setzen.
 
Generell läßt sich zu Mesh sagen das Physik kritisch ist. Es kommt immer wieder vor das Objekte oder AVAS durch das Mesh fallen. Dies passiert wenn der Mittelpunkt des gegen das Mesh bewegten Objektes die Oberfläche durchstösst, und sich dann hinter dem Mittelpunkt der kollidierenden Fläche des Meshes befindet. Daraufhin fliegt es ungehindert weiter, kann aber oft nicht zurück. AVAS bleibt da meist nur ein Teleport.
 
Auch hier gilt als Abhilfe auf Simulator Standards zurückzugehen. Also die Verwendung von Sim Boden möglichst direkt unter dem Boden Mesh, oder den Einsatz großer Quader Prims als Bodenfläche. Letzteres ist unbedingt bei TP Zonen unter Mesh Boden zu empfehlen.
 
Physik Optimierung ist ein so hoch komplexes Thema dass ich das gesondert behandeln werde.
Wichtig zu wissen ist: die Physik muss mit der sichtbaren Form des Objektes nichts gemein haben.
Es zählt einzig allein das Ergebnis der Bewegungs - Einschränkung das man erzielen will.
So reicht es für eine Wand im 1. Stock eines Gebäudes nur eine Plane (Fläche) als Physik zu nehmen.
Diese nahe der Innenwand platziert gibt den gleichen Effekt wir ein Würfel der die Wand nachbildet.
Auch Ebene wirken in alle Richtungen als Hindernis, unabhängig von der Sichtbarkeit der Flächen.
 

     

 
 
Zur Bedienung der Maske:
 
unter Schritt1 wird das 8 (von den vorigen 4) Meshes ausgewählt das zur Physik Berechnung herangezogen wird.
Das Schlechteste kann Löcher aufweisen, die zu höheren Zahl von Kollisionsflächen (=Scheitelpunkt Hüllen) führt.

Eine weiter Option ist „externe Datei für Physik hochladen“.
Das habe ich manchmal gemacht, wenn ich die Physik nutzen will, aber das Mesh zu komplex ist.
Eigentlich sollte das immer genutzt werden – wenn es denn funktionieren würde.
Anwendungsfall wäre beispielsweise ein Blumenkasten mit vielen Blumen drin. Aber Kollision soll nur der Rechteckige Kasten erzeugen.
Das wären dann 6 Flächen anstelle bis zu hunderter durch die Blumenblätter.
Natürlich berechnet die Physik Hüllen zur Optimierung, aber je nach Objekt kann die Automatik völlig daneben liegen.


Zum Verständnis: Die Physik ist eine völlig unabhängige zweite Welt im Simulator. Die siehst du nicht, aber sie wird ständig mitberechnet. Dein Avatar hat Hüllen die ihn umgeben, ebenso wie jedes nicht „Phantom“ Element. Bewegt sich etwas , so kann es mit anderen Hüllen kollidieren. Diese berechnet die Physik Engine. Dafür gehen nicht wenig Rechenleistung drauf.

Zum Schritt2, analysieren
Nur 2 Bedienelemente haben Funktion: Löcher schließen und analysieren.
Löcher schließen verbindet Öffnungen in der Physik des Meshes. Beispiel Bootshülle: Du kannst nachher nicht mehr durch die offene Tür in die Kombüse. Aber du fällst auch nicht durch den Gulli im Boden.
 
Danach analysieren drücken. Dieses berechnet die Anzahl notwendiger Kollisionshüllen/Flächen.
 
Das Ergebnis wird unten (Ergebnis Dreiecke/ Scheitelhüllen) angezeigt.
 
Was ist gut? Das kommt auf das Objekt und die Komplexität an.
Ein Baum mit Stamm und Ästen ist schlecht, je nach Struktur kommen hunderte Kollisions-Flächen zusammen.

Eine Näherung mit nur einen rechteckigen Stamm (Würfel) mit 6 Scheitelhüllen ist schon besser, aber immer noch nicht optimal.
4 wäre erzielbar wenn die obere und unter Fläche des Würfels offen wären.


Noch besser ist es nur 2 Flächen(Planes) im Kreuz zu stellen und damit den Würfel zu ersetzten.
Und optimal ist es nur mehr eine Ebene (Plane) als Stamm Physik hinzusetzen.
Ein dagegen fahrendes Auto würde dadurch genauso zuverlässig gestoppt.
Wo dies nicht notwendig ist, lasse ich Grünzeug auf Phantom, und habe eine schnelle Sim
 
Was ist schlecht:
Kleines Objekt > 10
begehbares Haus > 100
 
 
 
Skalierung
 
zu gültiger Skalierung habe ich schon etliches geschrieben.
Idealerweise sollte hier etwas zwischen 0,1 und 10 drin stehen, und die richtige Meshgröße rauskommen.
Ansonsten: Gehe zurück nach Blender, und mache dort die Hausaufgaben.
 
Die Option „Texturen Einschliessen“ lädt die in der .dae referenzierten Texturen aus dem gleichen Verzeichnis wie die *.dae Datei.
 
Diese werden in dem Texture Ordner unter dem Meshnamen abgelegt, und zudem im Mesh gleich geladen. Klappt das erspart es viel Arbeit.
ABER: Der Grafikspeicher Verbrauch der Sim ist viel effizienter wenn jede Texture dedupliziert in der Sim verwendet wird.
Daher Texturen im Testsimulator hochladen, und checken bis alles passt.
Dann in den Produktiv Simulator nur mit dem einem Original alles neu texturieren. Dieses ist einfach da ja die Textursettings bleiben.

Eine Möglichkeit Sims auf doppelt vorliegende gleiche Texturen zu untersuchen bietet ein Textur Cache Reader. Sollte die gleiche Textur da mit mehr als einer UUID drin liegen, gibt es Optimierungs Potential. (Dies gilt nicht für gebackene AVA Texturen!!!!!)


Nun muss das Objekt „Gewichte und Gebühren“ berechnen.
Anschießend steht an gleicher Stelle „Hochladen“.
 
Danach befindet sich das Mesh im Inventar.
 


   
 
 
Die einzelnen Materialien des Objektes „Rakete“ sind nun zu Seiten der Meshes geworden.
Der Zugriff erfolgt nun über Teile Bearbeiten – Fläche auswählen.
 
Nun Mesh in der Sim platzieren und nachbearbeiten.
Meist sind das noch Textur Nachbesserungen, hinzufügen von Normal Maps, Glow Maps, Glanz- oder Leuchtoptionen für Materials.
 
Sofern man einen separaten Physik Layer mit importiert hat, so trennt man diesen nach erfolgter Platzierung des Objektes in der Sim nun ab,
und wählt für diesen: Textur: Transparent.
Der Rest des Objektes wird anschließend auf Phantom gesetzt.

Drucke diesen Beitrag

  Samstag Partytime im Pinacolada
Geschrieben von: Marina Baer - 11.07.2016, 20:05 - Forum: Events - Antworten (2)

Samstag , 16.07.2016, ist Partytime im Pinacolada ab 20:00 Uhr. DJ Tommi will uns mit Musik aus dem Bereich best of deutsch pop und rock verwöhnen. Wir treffen uns im Partyclub Pinacolada auf Blackland. Wir freuen uns auf Euch.
[Bild: pinacolada1607.jpg]
Hypergrid: thepublicworld.de:8002:BlackLand

Drucke diesen Beitrag

  GLOEBIT
Geschrieben von: Hillie Dyrssen - 11.07.2016, 14:59 - Forum: Bezahlsysteme - Antworten (9)

Hallo zusammen,

vielleicht weiß einer wie das zu machen ist?! Ich habe mich zur Beta Gloebit angemeldet und bescheid bekommen..was zu mache ist. Das ist alles gut und schön.....bloß wenn ich es dann umgesetzt habe sprich opensim.ini dann läuft die Konsole nicht richtig hoch Blush

Habe es zwar an die Herren von Gloebit weitergeleitet, aber vielleicht weiß ja jemand von euch was es sein könnte, dankööö


Grüße
Hillie

Drucke diesen Beitrag

  Terrain Vorschau
Geschrieben von: Manni - 11.07.2016, 01:26 - Forum: Regionen - Antworten (1)

Eine einfache und schnelle Terrain Vorschau
   

Dies ist eine Terrain Vorschau und ist mit der Babylonjs erstellt worden.
Es ist ein einfaches HTML Script kann also auf fast allem angezeigt werden.
Dies speichert ihr als Text auf euren Rechner oder sonst wo ein WebGL fähiger Browser läuft.
Ihr könnt das auch gut zum texturieren gebrauchen.
Ihr dürft auch ungefragt am Source herumdoktern und weiter geben.
Das Terrain kann selbstverständlich im Browser mit der Maus gedreht werden.


Script index.html

Code:
<!DOCTYPE html>
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

   <title>Babylon.js sample code</title>
   <!-- Babylon.js -->
   <script src="http://www.babylonjs.com/hand.minified-1.2.js"></script>
   <script src="http://www.babylonjs.com/babylon.js"></script>
   <style>
       html, body {
           overflow: hidden;
           width: 100%;
           height: 100%;
           margin: 0;
           padding: 0;
       }

       #renderCanvas {
           width: 100%;
           height: 100%;
           touch-action: none;
       }
   </style>
</head>
<body>
   <canvas id="renderCanvas"></canvas>
   <script>
       if (BABYLON.Engine.isSupported()) {
           var canvas = document.getElementById("renderCanvas");
           var engine = new BABYLON.Engine(canvas, true);

           var createScene = function() {
               var scene = new BABYLON.Scene(engine);
               var meshes = [];
               var camera = new BABYLON.ArcRotateCamera("Camera", 0, Math.PI / 2, 12, BABYLON.Vector3.Zero(), scene);

               camera.attachControl(canvas, false);
               camera.lowerRadiusLimit = 1;
               camera.minZ = 1.0;

               function selectMesh(index) {
                   switch (index) {
                       case 0:
                           // Creating sphere
                           meshes.push(BABYLON.Mesh.CreateSphere("mesh", 16, 5, scene));
                           break;
                       case 1:
                           // Creating Torus
                           meshes.push(BABYLON.Mesh.CreateTorus("mesh", 5, 1, 32, scene));
                           break;
                       case 2:
                           // Creating Torus knot
                           meshes.push(BABYLON.Mesh.CreateTorusKnot("mesh", 2, 0.5, 128, 64, 2, 3, scene));
                           break;
                       case 3:
                           meshes.push(BABYLON.Mesh.CreateGroundFromHeightMap("mesh", "HeightMap.png", 8, 8, 100, 0, 3, scene, false));
                           break;
                   }
               };

               BABYLON.Effect.ShadersStore["customVertexShader"]=                "precision highp float;\r\n"+

               "// Attributes\r\n"+
               "attribute vec3 position;\r\n"+
               "attribute vec3 normal;\r\n"+
               "attribute vec2 uv;\r\n"+

               "// Uniforms\r\n"+
               "uniform mat4 world;\r\n"+
               "uniform mat4 worldViewProjection;\r\n"+

               "// Varying\r\n"+
               "varying vec3 vPositionW;\r\n"+
               "varying vec3 vNormalW;\r\n"+
               "varying vec2 vUV;\r\n"+

               "void main(void) {\r\n"+
               "    vec4 outPosition = worldViewProjection * vec4(position, 1.0);\r\n"+
               "    gl_Position = outPosition;\r\n"+
               "    \r\n"+
               "    vPositionW = vec3(world * vec4(position, 1.0));\r\n"+
               "    vNormalW = normalize(vec3(world * vec4(normal, 0.0)));\r\n"+
               "    \r\n"+
               "    vUV = uv;\r\n"+
               "}\r\n";

               BABYLON.Effect.ShadersStore["customFragmentShader"]=                "precision highp float;\r\n"+

               "// Lights\r\n"+
               "varying vec3 vPositionW;\r\n"+
               "varying vec3 vNormalW;\r\n"+
               "varying vec2 vUV;\r\n"+

               "// Refs\r\n"+
               "uniform sampler2D textureSampler;\r\n"+

               "void main(void) {\r\n"+
               "    float ToonThresholds[4];\r\n"+
               "    ToonThresholds[0] = 0.95;\r\n"+
               "    ToonThresholds[1] = 0.5;\r\n"+
               "    ToonThresholds[2] = 0.2;\r\n"+
               "    ToonThresholds[3] = 0.03;\r\n"+
               "    \r\n"+
               "    float ToonBrightnessLevels[5];\r\n"+
               "    ToonBrightnessLevels[0] = 1.0;\r\n"+
               "    ToonBrightnessLevels[1] = 0.8;\r\n"+
               "    ToonBrightnessLevels[2] = 0.6;\r\n"+
               "    ToonBrightnessLevels[3] = 0.35;\r\n"+
               "    ToonBrightnessLevels[4] = 0.2;\r\n"+
               "    \r\n"+
               "    vec3 vLightPosition = vec3(0,20,10);\r\n"+
               "    \r\n"+
               "    // Light\r\n"+
               "    vec3 lightVectorW = normalize(vLightPosition - vPositionW);\r\n"+
               "    \r\n"+
               "    // diffuse\r\n"+
               "    float ndl = max(0., dot(vNormalW, lightVectorW));\r\n"+
               "    \r\n"+
               "    vec3 color = texture2D(textureSampler, vUV).rgb;\r\n"+
               "    \r\n"+
               "    if (ndl > ToonThresholds[0])\r\n"+
               "    {\r\n"+
               "        color *= ToonBrightnessLevels[0];\r\n"+
               "    }\r\n"+
               "    else if (ndl > ToonThresholds[1])\r\n"+
               "    {\r\n"+
               "        color *= ToonBrightnessLevels[1];\r\n"+
               "    }\r\n"+
               "    else if (ndl > ToonThresholds[2])\r\n"+
               "    {\r\n"+
               "        color *= ToonBrightnessLevels[2];\r\n"+
               "    }\r\n"+
               "    else if (ndl > ToonThresholds[3])\r\n"+
               "    {\r\n"+
               "        color *= ToonBrightnessLevels[3];\r\n"+
               "    }\r\n"+
               "    else\r\n"+
               "    {\r\n"+
               "        color *= ToonBrightnessLevels[4];\r\n"+
               "    }\r\n"+
               "    \r\n"+
               "    gl_FragColor = vec4(color, 1.);\r\n"+
               "}\r\n";

               selectMesh(3);

               // Compile
               var shaderMaterial = new BABYLON.ShaderMaterial("shader", scene, {
                   vertex: "custom",
                   fragment: "custom",
               },
                   {
                       attributes: ["position", "normal", "uv"],
                       uniforms: ["world", "worldView", "worldViewProjection", "view", "projection"]
                   });

               var refTexture = new BABYLON.Texture("ref.jpg", scene);
               refTexture.wrapU = BABYLON.Texture.CLAMP_ADDRESSMODE;
               refTexture.wrapV = BABYLON.Texture.CLAMP_ADDRESSMODE;

               var mainTexture = new BABYLON.Texture("textur.jpg", scene);

               shaderMaterial.setTexture("textureSampler", mainTexture);
               shaderMaterial.setTexture("refSampler", refTexture);
               shaderMaterial.setFloat("time", 0);
               shaderMaterial.setVector3("cameraPosition", BABYLON.Vector3.Zero());
               shaderMaterial.backFaceCulling = false;

               for (var index = 0; index < meshes.length; index++) {
                   var mesh = meshes[index];
                   mesh.material = shaderMaterial;
               }

               return scene;
           }

           var scene = createScene();
           var time = 0;
           engine.runRenderLoop(function () {
               var shaderMaterial = scene.getMaterialByName("shader");
               shaderMaterial.setFloat("time", time);
               time += 0.02;

               shaderMaterial.setVector3("cameraPosition", scene.activeCamera.position);

               scene.render();
           });

           window.addEventListener("resize", function () {
               engine.resize();
           });
       }
   </script>
</body>
</html>

Eure Mesh Hightmap (Das ist ein ganz normales Terrain im PNG Format) muss heightMap.png heissen Beispiel:

Bild Beispiel: heightMap.png
   

Die Terrain Textur muss textur.jpg heissen.
Ich habe absichtlich das Wasser weg gelassen, so ist die Textur Multifunktional.

Bild  Beispiel: textur.jpg
   

So eine HightMap läst sich nicht nur in OpenSim/SecondLife hochladen,
sondern es kann mit dem SketchUp Plugin Bitmap to Mesh,
in ein Mesh Terrain umgewandelt werden.

Wenn ihr alle 3 Sachen auf eurem Gerät oder Computer habt,
könnt ihr die index.html Datei mit eurem Browser öffnen.

Maustaste und bewegen: dreht die Region.
Mausrad: Zoomt.

Drucke diesen Beitrag

  Ubuntu 18.04 Server Installation für OpenSim
Geschrieben von: Manni - 09.07.2016, 21:30 - Forum: Simulatoren - Keine Antworten

Ubuntu 18.04 Server Installation für OpenSim und Web3D Anwendungen/Welten.


    Download:http://releases.ubuntu.com/18.04/
    Ich nutze unter Windows den Bitvise SSH Client dieser basiert auf Putty: https://www.bitvise.com/ssh-client-download
    Bitvise bietet alles was man zur steuerung eines Servers benötigt.


    Ubuntu 18 hat Eigenheiten, die nicht mit vorigen Versionen kompatibel sind.
    Deswegen mache ich mal eine neue Kurzanleitung zum installieren eines Test Servers mit root.
    Solltet ihr ein Produktives Ubuntu wünschen lasst einfach alles mit root aktivieren weg.

    Als Benutzer root bitte sudo weg lassen.

    Passwort ändern falls gewünscht.

Code:
passwd

    Root aktivieren dies muss man nicht machen.
Code:
sudo passwd
    Jetzt Passwort eingeben 3 mal.
Code:
sudo sed -i 's/prohibit-password/yes/' /etc/ssh/sshd_config


    Wenn das nicht geht Manuell bearbeiten.
    Die Datei /etc/ssh/sshd_config bearbeiten.
Code:
sudo nano /etc/ssh/sshd_config
    sucht nach der Zeile "PermitRootLogin prohibit-password"(STRG + W ist Suchen).
    ändern in:
Code:
PermitRootLogin yes
    Speichert die Datei und startet den ssh Dienst neu:
    Speichern STRG + O dann Enter drücken.
    Editor beenden STRG + X dann Enter drücken.

    Genauso kann man den root zugang auch wieder aufheben,
    denn es ist nicht ratsam ein Produktives System so laufen zu lassen.

    SSH neu starten.
Code:
sudo service ssh restart

    Root aktivieren Ende

    Wenn das nicht geht, oder ihr möchtet nicht ständig root sein, kann man den Benutzer wechseln mit su.
    Mit sudo passwd setzt ihr ein root Passwort und mit su wechselt ihr für diese Sitzung den Benutzer auf root.
Code:
sudo passwd
su
    jetzt erscheint eine Passwortabfrage

Hier geht es Richtig los

    Updaten
Code:
sudo apt-get update

    Apache2 und Erweiterung.
Code:
sudo apt-get install apache2 libapache2-mod-php

    PHP, MySQL und Erweiterungen
Code:
sudo apt-get install php mysql-server php-mysql php-common php-gd php-mcrypt php-pear php-mail php-xmlrpc php-curl

    PHPMyAdmin Benutzeroberfläche für MySQL (Zugang im Browser mit http://IP/phpmyadmin/)
Code:
sudo apt-get install phpmyadmin

    Mono Installieren um OpenSim ausführen zu können.
Code:
sudo apt-get install mono-complete

    Hilfsprogramme zum entpacken, Hintergrunddienst, Git und NAnt
Code:
sudo apt-get install zip screen git nant

    Nachfolgendes ist für Web3D etc.
Code:
sudo apt-get install nodejs npm

    Die einfachste Art und Weise die Threads zu erhöhen ist ein Eintrag in die Datei /etc/environment.
    Der Wert sollte zwischen 300 (Metro Empfehlung)und 2000 (Mono Empfehlung)gewählt werden.
    Diese Datei sollte den folgenden Eintrag angehängt bekommen:
Code:
MONO_THREADS_PER_CPU=500

    Als letzte Maßnahmen noch Updaten und Upgraden.
Code:
sudo apt-get update
sudo apt-get upgrade

Drucke diesen Beitrag

  Fundsache Server selber Bauen
Geschrieben von: Manni - 09.07.2016, 05:34 - Forum: Programmierung - Keine Antworten

jMonkeyEngine Multiplayer & Netzwerk Tutorial Deutsch





















Ach ja Infos für die Game Engine gibt es hier LINK

Das ist das richtige für Leute die gerne etwas ausprobieren.



Drucke diesen Beitrag

  JanusVR Allgemein
Geschrieben von: Manni - 30.06.2016, 19:00 - Forum: Simulatoren - Keine Antworten

Allgemein
Feature - Beschreibung
Default Listening Port - 5566
Protocol - Ordinairy socket, UTF-8 encoded
Encoding - UTF-8
Message Format - JSON objects formatted onto a single line
Message Structure -
Every packet must contain a "Methode" field
Every packet can also optionally contain a "data" field

Beispiel
Sie können testen, ob der Server über Telnet oben ist.
telnet babylon.vrsites.com 5566
Kopieren und die Beispiele unten ein, um zu sehen, wie es funktioniert

1. Client -> Server Methodes:


1.1 "logon" Methode
Sie müssen dies vor allem anderen tun.

Definiert in config.js - authMode
Hat drei mögliche Optionen (defaults to 'optional'):
   'none'     - wird nicht versuchen, um Benutzer zu authentifizieren,

                jeder kann sich mit beliebigen freien userId verbinden.

   'optional' - Jeder kann eine Verbindung, aber wenn userId registriert wurde

                ein Passwort muss zur Verfügung gestellt werden.

   'required' - Nur Benutzer mit userId und Passwörter sind erlaubt.

Client -> Server Message Example:

Dies ist ein Beispiel für eine Nachricht mit sich anzumelden, wenn die Benutzer-ID "LL" nicht registriert wurde:
{"Methode":"logon","data":{"userId":"LL", "version":"23.4","roomId":"345678354764987457"}}
Client -> Server Message Example
{"Methode":"logon","data":{"userId":"LL", "version":"23.4","roomId":"345678354764987457"}}

Real example from JanusVR 40.3
{"Methode":"logon","data":{"userId":"ProudMinna333","version":"40.3","roomId":"e562b2e1339fc08d635d28481121857c"}}
Dies ist ein Beispiel für eine Nachricht mit sich anzumelden, wenn die Benutzer-ID "LL" registriert wurde, und erfordert daher ein Passwort (empfohlen, diese nicht verwendet wird, bis die Sicherheit in Release verschärft):

{"Methode":"logon","data":{"userId":"LL", "version":"23.4","roomId":"345678354764987457","password":"MyPassword"}}

version = Die client version


roomId = MD5 hash of the room's URL

password = Passwort mit userId assoziiert

Server -> Client Response Example:

Wenn alles in Ordnung ist und Sie angemeldet dann erhalten Sie:
{"Methode":"okay"}

Wenn kein roomId in der Anmeldeanforderung gefunden wurde:
{"Methode":"error", "data":{"message":"Missing roomId in data packet"}}

Wenn kein userId in der Anmeldeanforderung gefunden wurde:
{"Methode":"okay"} if everything was okay or a {"Methode":"error", "data":{"message": "Some error string"}}

{"Methode":"error", "data":{"message": "Missing userId in data packet"}}

Wenn die Benutzer-ID bereits im Einsatz ist:
{"Methode":"error", "data":{"message": "User name is already in use"}}

TODO: Reject incompatable clients

1.2 "enter_room" Methode

Wenn Sie ein Portal durch:
{"Methode":"enter_room", "data": { "roomId": "345678354764987457" }}
Reales Beispiel aus JanusVR 40,3:
{"Methode":"enter_room", "data": {"roomId":"e562b2e1339fc08d635d28481121857c"}}

1.3 "move" Methodee

Wenn der Benutzer Position bewegt hat:
{"Methode":"move", "data": [0,0,0,0,0,0,0] }
Die Daten können alles sein, die Sie mögen, wird es ohne Validierung Beobachter übergeben werden

Reales Beispiel aus JanusVR 40,3:

JanusVR legt zusätzliche Informationen in ersten Schritt Anruf und jeder so oft nach dem ersten Aufruf. Dies ist ein Beispiel für einen Umzug Anruf mit zusätzlichen Informationen:
{"Methode":"move", "data":{"pos":"8.38889 -0.267704 -5.83333","dir":"-1 -1.33e-06 9.42e-07","view_dir":"-1 -1.33e-06 9.42e-07","up_dir":"-1.33e-06 1 1.25e-12","head_pos":"0 0 0","avatar":"<FireBoxRoom><Assets><AssetObject id=^head^ src=^http://avatars.vrsites.com/chibii/head_male.obj^ mtl=^http://avatars.vrsites.com/chibii/mtls/head_male3.mtl^ /><AssetObject id=^body^ src=^http://avatars.vrsites.com/chibii/body_male.obj^ mtl=^http://avatars.vrsites.com/chibii/mtls/body_male3.mtl^ /></Assets><Room><Ghost id=^ProudMinna333^ js_id=^3^ scale=^1.700000 1.700000 1.700000^ head_id=^head^ head_pos=^0.000000 0.750000 0.000000^ body_id=^body^ /></Room></FireBoxRoom>"}}
Die meisten JanusVR Anrufe bieten nur eine begrenzte Datenmenge:
{"Methode":"move", "data":{"pos":"8.38889 -0.267704 -5.83333","dir":"-1 -1.33e-06 9.42e-07","view_dir":"-1 -1.33e-06 9.42e-07","up_dir":"-1.33e-06 1 1.25e-12","head_pos":"0 0 0"}}

1.4 "chat" Methodee

Wenn der Benutzer eine Textnachricht sendet:
{"Methode":"chat", "data": "The message"}
Sie können alles über das Datenfeld übergeben, und es wird für alle auf den aktuellen Raum abonniert Kunden gesendet werden.

Reales Beispiel aus JanusVR 40,3:
{"Methode":"chat", "data": "hello!"}

1.5 "subscribe"  Methodee

Wenn Sie möchten Ereignisse über einen Raum zu beginnen Empfangen (Sie sind in diesem Raum oder auf der Suche durch ein Portal)
{"Methode":"subscribe", "data": { "roomId": "345678354764987457" }}
Reales Beispiel aus JanusVR 40,3:
The first "subscribe" call provides extra information:
{"Methode":"subscribe", "data":{"userId":"ProudMinna333","version":"40.3","roomId":"e562b2e1339fc08d635d28481121857c"}}
Nachfolgende "subscribe" Anrufe bieten weniger Informationen:
{"Methode":"subscribe", "data":{"roomId":"69de79e1077103cb59d1a890e96c7ef2"}}
Erhalten folgende Leistungen, wenn alles in Ordnung ist.
{"Methode":"okay"}

1.6 "unsubscribe" Methode

Wenn Sie nicht mehr wünschen, Nachrichten von diesem Raum zu erhalten, weil keines seiner Portale sichtbar sind
{"Methode":"unsubscribe", "data": { "roomId": "345678354764987457" }}
Reales Beispiel aus JanusVR 40,3:
TODO: Grab real example
Erhalten folgende Leistungen, wenn alles in Ordnung ist.
{"Methode":"okay"}

1.7 "portal" Methode

Wenn ein Benutzer ein neues Portal erstellt:
{"Methode":"portal", "data":{"url":"http://...", "pos":[1,2,4], "fwd":[0,1,0]}}
Reales Beispiel aus JanusVR 40,3:
{"Methode":"portal", "data":{"url":"http://www.vrsites.com","pos":"-7.16883 -0.267702 -6.57243","fwd":"0.967686 0 -0.234104"}}
Erhalten folgende Leistungen, wenn alles in Ordnung ist.
Will receive: {"Methode":"okay"}

1.8 "users_online" Methode

Liste holen der verbundenen Benutzer.
Definiert in config.js: config.maxUserResults = 100.
{“Methode”: “users_online”}
Liste aller Benutzer online bis config.maxUserResults.
{“Methode”: “users_online”, “data”: {“maxResults”: 50}}
Liste aller Benutzer online bis zu "maxResults 'oder config.maxUserResults, je nachdem, was kleiner ist.
{“Methode”: “users_online”, “data”: {“roomId”: “xyz”}}
Liste aller Benutzer in ‘roomId’ up to config.maxUserResults.
{“Methode”: “users_online”, “data”: {“maxResults”: 50, “roomId”: “xyz”}}
Liste aller Benutzer in 'roomId "bis zu" maxResults' oder config.maxUserResults, je nachdem, was kleiner ist.
Antwort:
{“Methode”: “users_online”, “data”: {“results”: 50, “roomId”: “xyz”, “users”: {“Arthur Dent”, “Data”, “Lore”}}


2. Server -> Client Hinweise:

2.1 "user_moved" Benachrichtigung

Wenn ein Benutzer in jedem Raum bewegt, dass Sie auch abonniert haben, erfolgt die Benachrichtigung über die eigene Bewegung erhalten speichert.

{"Methode":"user_moved","data":{"roomId":"fgdgd","userId":"LL","position":[0,0,0,0,0,0,0]}}
Reales Beispiel aus der Interaktion mit JanusVR 40,3:

Einige user_moved Benachrichtigungen werden enthalten zusätzliche Informationen:

{"Methode":"user_moved","data":{"roomId":"e562b2e1339fc08d635d28481121857c","userId":"ProudMinna333","position":{"pos":"8.38889 -0.267704 -5.83333","dir":"-1 -1.33e-06 9.42e-07","view_dir":"-1 -1.33e-06 9.42e-07","up_dir":"-1.33e-06 1 1.25e-12","head_pos":"0 0 0","avatar":"<FireBoxRoom><Assets><AssetObject id=^head^ src=^http://avatars.vrsites.com/chibii/head_male.obj^ mtl=^http://avatars.vrsites.com/chibii/mtls/head_male3.mtl^ /><AssetObject id=^body^ src=^http://avatars.vrsites.com/chibii/body_male.obj^ mtl=^http://avatars.vrsites.com/chibii/mtls/body_male3.mtl^ /></Assets><Room><Ghost id=^ProudMinna333^ js_id=^3^ scale=^1.700000 1.700000 1.700000^ head_id=^head^ head_pos=^0.000000 0.750000 0.000000^ body_id=^body^ /></Room></FireBoxRoom>"}}}
Allerdings sind die meisten nur so etwas wie die folgenden enthalten:

{"Methode":"user_moved","data":{"roomId":"e562b2e1339fc08d635d28481121857c","userId":"ProudMinna333","position":{"pos":"8.38889 -0.267704 -5.83333","dir":"-1 -1.33e-06 9.42e-07","view_dir":"-1 -1.33e-06 9.42e-07","up_dir":"-1.33e-06 1 1.25e-12","head_pos":"0 0 0"}}}

2.2 "user_chat" Benachrichtigung

Wenn ein Benutzer sagt etwas in den Text-Chat.

{"Methode":"user_chat", "data":{"message":"The message", "userId":"LL"}}
Reales Beispiel aus der Interaktion mit JanusVR 40,3:

{"Methode":"user_chat", "data":{"roomId":"69de79e1077103cb59d1a890e96c7ef2","userId":"ProudMinna333","message":"hello!"}}

2.3 "user_leave"/"user_enter" Benachrichtigung

Wenn ein Benutzer ändert Zimmer:

{"Methode":"user_leave", "data":{"userId":"LL","roomId":"oldRoomId"}}
{"Methode":"user_enter", "data":{"userId":"LL","roomId":"newRoomId"}}
Die Follow-up mit einem Umzug "user_moved" Veranstaltung

Reales Beispiel aus der Interaktion mit JanusVR 40,3:

TODO: Grab example of "user_leave"
TODO: Grab example of "user_enter"

2.4 "user_portal" Benachrichtigung

Wenn schafft ein Benutzer ein Portal:

{"Methode":"user_portal", "data":{"userId":"LL","roomId":"345678354764987457","url":"http://...", "pos":[0,0,0], "fwd":[0,1,0]}}
Reales Beispiel aus der Interaktion mit JanusVR 40,3:

{"Methode":"user_portal", "data":{"roomId":"e562b2e1339fc08d635d28481121857c","userId":"ProudMinna333","url":"http://www.vrsites.com","pos"

Drucke diesen Beitrag

  JanusVR Presence Server
Geschrieben von: Manni - 30.06.2016, 13:43 - Forum: Simulatoren - Keine Antworten

JanusVR Presence Server

Diese Version ist die eine , die VR - Seiten ausgeführt wird , die der Standard - Server ist , sofern keine andere in Ihrem angegeben ist
Code:
<Room>
Code. Lesen Sie hier , um zu erfahren wie Sie Ihr Zimmer einen anderen Server angeben können.


Einführung

Der Janus VR Presence Server ist ein Open - Source - Projekt von begann Lisa Croxford , die ein JanusVR - Client ermöglicht es mit einem anderen Client Informationen zu teilen. Es ermöglicht Multiplayer-Modus. Die Server-Software ist das, was jeder der JanusVR Kunden ermöglicht, wo andere Avatare sind geografisch und wer sonst in der gleichen virtuellen Raum. Es ist auch das, was Dinge wie Chat ermöglicht.
Wenn Sie weitere Informationen benötigen oder möchten , sich zu engagieren, werden Sie die meisten JanusVR - Enthusiasten auf dem finden JanusVR subreddit . Sie können auch die lesen
Code:
CONTRIBUTORS.md
Datei im Stamm dieses Repository.
Wenn Sie verstehen wollen , wie ein Client mit dem Janus VR Presence Server interagiert dann lesen sie die
Code:
API Documentation.md
im Hauptverzeichnis dieses Repository.


Installation

  1. Download und installation nodejs siehe unten
  2. Klonen dieses Repo oder laden Sie die neueste Version über die Releases Seite auf GitHub .
    cd
  3. in die Wurzel des Repository , in dem
    server.js
  4. befindet , und führen Sie
    npm install
  5. alle Modulabhängigkeiten in aufgelistet installieren
    package.json
  6. . Die Module werden in die platziert werden
    node_modules
  7. Ordner und benötigt für den Server zu starten.
  8. Kopieren Sie
    config-example.js
  9. zu
    config.js
  10. und ändern Sie die gewünschten Variablen , die Sie benötigen , um Ihren Server laufen zu lassen. Es ist ziemlich gut kommentiert, Sie zu führen.


SSL


SSL ist nicht erforderlich, den Server zu laufen, aber es wird empfohlen. Zumindest sollten Sie die selbstsignierten SSL-Verfahren unten beschrieben durchlaufen.


Selbst signierten SSL


Führen Sie das
Code:
Code:
./generate_key
Skript in der Wurzel des Repository ein SSL - Zertifikat für den Server zu erzeugen.
  • Auf die Frage eines Common Name für den Server zur Verfügung zu stellen geben Sie die Domain den Namen des Servers ausgeführt werden soll, auf. Dh
    yourdomain.com
  • . Wenn eine Entwicklerversion des Servers , auf OSX laufen , können Sie auch Ihre Bonjour verwenden Name dh
    yourcomputer.local
  • . Auf OSX können Sie Ihren Computer Bonjour Namen von Systemeinstellungen gehen -> Freigabe und unter dem Feld Computername suchen.
  • Auf die Frage, eine Herausforderung Passwort zu liefern, während das SSL-Zertifikat Presse zu erzeugen geben Sie ein Passwort zu überspringen Einstellung.

Certified SSL

Wenn Sie ein gültiges SSL-Zertifikat:
  1. Speichern Sie die Schlüsseldatei als cert / Server-key.pem
  2. Speichern Sie die Zertifikatsdatei als cert / Server-cert.pem
  3. Speichern Sie Ihre CA Zwischenzertifikate als cert / cabundle.pem

Das Ausführen des Server
    cd
  1. an die Wurzel des Repository , in dem
    server.js
  2. befindet.
  3. Führen Sie den folgenden Befehl , um den Server zu starten:
    node server.js
  4. . Wenn Sie diese kontinuierlich ausführen möchten, können Sie aussehen wollen in die Verwendung für
    forever
  5. oder
    pm2
  6. , die Knoten - Module speziell zum Ausführen von Anwendungen anderer Knoten Server aufgebaut sind.
  7. Starten Sie den JanusVR Client mit paramters zu Ihrem Server zu verbinden.
    • Windows - Erstellen Sie eine Verknüpfung zu JanusVR und fügen Sie die folgenden Argumente , die nach dem Weg zum JanusVR ausführbare
        -server my.server.com -port 5566
      • , wo
        my.server.com
      • die IP - Adresse des Computers ist (
        127.0.0.1
      • oder
        localhost
      • sollte auch hier arbeiten) und wo
        5566
      • ist der Port, auf dem der Server ausgeführt wird, wie in definierten
        config.js
      • .

    • OSX Sie können , indem Sie zu den Client von der Befehlszeile ausführen
      janusvr.app/Contents/MacOS/
    • und Laufen
        ./janusvr -server my.server.com -port 5566
      • für Nicht-ssl
        ./janusvr -server my.server.com -port 5567
      • für ssl

Beitragende
Wir haben einen Mitwirkenden Führung in der CONTRIBUTORS.md Datei in diesem Verzeichnis zu finden.
Fehlerbehebung
Zitat: schrieb:Ich kann andere Menschen nicht sehen, wenn JanusVR mit und ich weiß, andere haben die gleichen Server konfiguriert.
Presse
Code:

einmal JanusVR hat begonnen. JanusVR werden alle Server aufgelistet, zu dem Sie versuchen, eine Verbindung oder verbunden sind. Sie sollten Ihre Server in dieser Liste zu sehen. Wenn Ihr Server rot ist, dann bedeutet es, dass JanusVR keine Verbindung herstellen kann. Überprüfen Sie Firewall - Einstellungen auf dem Server , um sicherzustellen , dass Port
Code:
5566
und
Code:
5567
(für SSL) offen sind und in der Lage Datenverkehr empfangen. Überprüfen Sie die
Code:
server.log
Datei auf dem Server , um zu sehen , ob es irgendwelche Fehler sind.
Zitat: schrieb:Ich trat in die falschen Angaben für meinen Schlüssel nach der Ausführung
Code:
Code:
./generate_key
.
Code:
Code:
./generate_key
werden 3 Dateien auf der Grundlage Ihrer Eingabe erzeugen:
    /cert/server-key.pem /cert/server-cert.pem /cert/cabundle.pem
  • Löschen Sie einfach diese und führen Sie './generate_key' wieder.

Zitat: schrieb:Ich habe ein allgemeines Problem und müssen einige Informationen zur Fehlerbehebung über die Server-Anwendung.
Schauen Sie sich die aus
Code:
server.log
- Datei. Nur Schwanz es und Sie werden das Protokoll wird geschrieben als Aktivitäten statt finden - zB Anmeldung usw.
Lizenz
Dieses Projekt wird unter der MIT-Lizenz lizenziert. Siehe die LICENSE.txt Datei in diesem Verzeichnis für vollständigen Text.

Drucke diesen Beitrag

  JanusVR Presence Server Quellen
Geschrieben von: Manni - 30.06.2016, 13:36 - Forum: Simulatoren - Keine Antworten

Quellen:

Erste offizielle Veröffentlichung
von JanusVR Presence Server V0.1.0.
Dies führt folgendes ein:

Wenn von einer früheren Version dieses Servers ein Upgrade sicherstellen, dass Sie:
  1. Neu über npm installieren
  2. die IP-Spalte von access_statistics auf 40 Zeichen erweitern, so dass IPv6-Adressen passen
  3. ändern aller Skripte für aktive Benutzer abfragen
 SELECT `userId`, `roomId`, `ip`, `note`, `client_version` FROM `users` WHERE `updated_at` > DATE_SUB(NOW() , INTERVAL 10 SECOND)
Downloads
NodeJS


Nodejs Wikipedia: https://de.wikipedia.org/wiki/Node.js
Nodejs Download Win, Mac, Linux, Arm V6,7,8, etc.: https://nodejs.org/en/download/



Ubuntu (Debian) Installationsbeispiel



Nodejs Paketliste zum installieren:
Code:
sudo apt-get install nodejs

npm Node Package Manager:
Code:
sudo apt-get install npm

Falls bei der Paketinstallation mit npm der Fehler sh: 1: node: not found auftritt muss noch folgenden Zusatzpaket installiert werden:
Code:
sudo apt-get install nodejs-legacy

Zum Installieren einer Erweiterung dient der Befehl
Code:
npm install ERWEITERUNG
zum Deinstallieren der Befehl
Code:
npm uninstall ERWEITERUNG



ACHTUNG wer Node.js über die Paketquellen installiert hat, der muss statt node den Aufruf nodejs verwenden!
Mehr Informationen hier https://wiki.ubuntuusers.de/Node.js/

Drucke diesen Beitrag

  janus virtual reality
Geschrieben von: Manni - 30.06.2016, 10:25 - Forum: Simulatoren - Keine Antworten

Der JanusVR Viewer

Dieser JanusVR Viewer funktioniert sofort nach der Installation.
Zum testen sind keine weiteren Einstellungen nötig.
Zum testen braucht ihr nicht den Server installieren.

Herunterladen von JanusVR Version 50.9

Windows: http://downloads.janusvr.com/janusvr_windows.exe
OSX: http://downloads.janusvr.com/janusvr.dmg
Linux: http://downloads.janusvr.com/janusvr_linux.tar.gz





Was ist das Janus VR Presence Server-Projekt?

janusVR ermöglicht es Benutzern in einer virtuelle Realität auf Inhalte über das Internet zugreifen zu können . Janus VR Presence Server (das Projekt) ermöglicht mehreren Benutzern von janusVR eine Internet-basierte virtuellen Realität Welt zu erkunden ( "VR Web") . Benutzer von janusVR können sich mit einem Server verbinden die Janus VR Presence Server-Software, um mit anderen Benutzern zu verbinden , die auch im VR-Web surfen und mit dem gleichen Server angeschlossen.

   
Beispiel für Janus VR Presence Server mit 6 Clients und ermöglicht Multiplayer-Interaktionen

Die Janus VR Presence Server API
Die API , die JanusVR verwendet mit Janus VR Presence Server zu kommunizieren , wird hier beschrieben.

Janus VR Presence Server-Funktionen
Janus VR Presence Server können Clients, die auf dem Server und im selben Raum angeschlossen sind:

  • Sich sehen, sich bewegen - Austausch Positionsinformationen
  • Chat - Broadcast Chat-Nachrichten an andere, die im selben Raum sind
  • Portale Teilen - Benutzer können jedes andere Portale sehen, da diese in den Raum geschaffen
Wie ihr seht ist dieser Artikel noch im Aufbau.

Also bitte keine Beschwerden Wink

Wenn ihr dies schon getestet habt, Postet bitte eure erfahrungen.

Drucke diesen Beitrag