M. Bender: Suche Leute die mir etwas bei VRML oder X3D helfen können

Beitrag lesen

Hallo,

ich hoffe ich finde hier jemanden der mir helfen kann. Ich habe schon Stunden in Tutorial Seiten verbracht, einmal zu VRML und zu X3D, leider habe ich bisher kein Forum gefunden wo ich mein Problem schildern kann. Ihr seid also hier meine letzte Hoffnung. Da X3D in die XML Schieene passt poste ich mal in diesem Bereich.

Also zum Project:
Ich spiele nur ein wenig rum und versuche mich an einer 3D Sternenkarte für ein Spiel.

Ich habe zunächst manuell mit notepad++ rumgespielt um die Grundlagen zu verstehen.

Ich benutze im moment 2 Obejkte:

1. eine sphere mit denen ich sonnensysteme darstellen will
2. ein Linienset mit dem ich die Sterne zu Konstallationen verbinde

Soweit klappte alles gut.

Nun habe ich einen Weg gefunden mit innerhalb eines vorgegebenen Bereiches per Zufallsgenerator x,y,z Koordinaten zu erstellen damit ich mit massenhaft systeme generieren kann. AstroSys generiert mir diese und speichert die in XML ab. Ich lese dann diese XML Datei aus.

<?php

// Datei von AstroSynthesis öffnen
$document = domxml_open_file('michael2.xml');

// Ausgabe der VRML Datei:
print "#VRML V2.0 utf8"."<br>"."<br>";

print "DEF objectA Transform {"."<br>";
print "   children ["."<br>";
print "      Shape {"."<br>";
print "         appearance Appearance {"."<br>";
print "            material Material { }"."<br>";
print "         }"."<br>";
print "         geometry Sphere { radius 0.1 } # Kugel"."<br>";
print "      }"."<br>";
print "   ]"."<br>";
//print "   translation 0.0 0.0 0.0"."<br>";
print "}"."<br>"."<br>";

// koordinaten aus der XML Datei ermitteln
$x_e  = $document->get_elements_by_tagname('X');
$y_e  = $document->get_elements_by_tagname('Y');
$z_e  = $document->get_elements_by_tagname('Z');

// Einzelne Planeten
$i=0; // Zähler resetten
foreach ($x_e as $x) {
 print "Transform {"."<br>";
 print "translation ";
 print $x_e[$i]->get_content()." ";
 print $y_e[$i]->get_content()." ";
 print $z_e[$i]->get_content()."<br>";
 print "children USE objectA"."<br>";
 print "} "."<br>"."<br>";
 $i++;
}

//Verbindungen
$waypoints  = $document->get_elements_by_tagname('Waypoints');
//$test = $document->get_attribute('');
$j=0;
$k=0;
$l=1;
$coords = "";
$index = "";
$color = "";

foreach ($waypoints as $waypoint) {
 $wp1 = $waypoints[$j]->first_child();
 $x1 = $wp1->get_attribute('X') ;
 $y1 = $wp1->get_attribute('Y') ;
 $z1 = $wp1->get_attribute('Z') ;
 $wp2 = $waypoints[$j]->last_child();
 $x2 = $wp2->get_attribute('X') ;
 $y2 = $wp2->get_attribute('Y') ;
 $z2 = $wp2->get_attribute('Z') ;

$coords .= $x1 ." ". $y1 ." ". $z1 .","."#$k<br>";
 $coords .= $x2 ." ". $y2 ." ". $z2 .","."#$l<br>";

$index .= $k .",". $l .",-1,"."<br>";
 $k = $k+2;
 $l = $l+2;

$color .= "0,";

$j++;
}

//enden abschneiden um das , und das <br> loszuwerden
$coords = substr($coords,0,-4);
$index = substr($index,0,-8);
$color = substr($color,0,-1);

print "Transform {"."<br>";
 print "   children ["."<br>";
 print "      Shape {"."<br>";
 print "         appearance Appearance {"."<br>";
 print "            material Material { }"."<br>";
 print "         }"."<br>";
 print "         geometry IndexedLineSet {"."<br>";
 print "            coord Coordinate {"."<br>";
 print "               point ["."<br>";
 print "                  $coords"."<br>";
 print "               ]"."<br>";
 print "            }"."<br>";
 print "         coordIndex ["."<br>";
 print "               $index"."<br>";
 print "         ]"."<br>";
 print "   color Color {"."<br>";
 print "      color ["."<br>";
 print "         0.0 0.0 1.0 "."<br>";
 print "      ]"."<br>";
 print "   }"."<br>";
 print "   colorIndex ["."<br>";
 print "      $color"."<br>";
 print "   ]"."<br>";
 print "         }"."<br>";
 print "      }"."<br>";
 print "   ]"."<br>";
 print "}"."<br>"."<br>";

?>

Das ganze Generiert also nun eine Datei die im kleinen wie folgt aussieht:

#VRML V2.0 utf8

DEF objectA Transform {
   children [
      Shape {
         appearance Appearance {
            material Material {
               emissiveColor 1.0 1.0 1.0 # weis, leuchtend
            }
         }
         geometry Sphere {
      radius 0.05
      }
      }
   ]
translation 0.0 0.0 0.0
}

ganz viele Instancen dieser Kugel

Transform {
translation -10.832823 -8.223687 18.417574
children USE objectA
}
............
Transform {
   children [
      Shape {
         appearance Appearance {
            material Material { }
         }
         geometry IndexedLineSet {
            coord Coordinate {
               point [
                  -19.247534 -2.065323 10.083113, #0
                  -16.740423 -0.497346 11.393204 #1
               ]
            }
         coordIndex [
               0, 1
         ]
   color Color {
      color [
         0.0 0.0 1.0
      ]
   }
   colorIndex [
      0, 0
   ]
         }
      }
   ]
}

Ich habe nun das ganze nun mit ~700 Sternen und ~1700 Verbindungen generiert.

Hier die Links zu den Tests:

1.) Wenn ich es so mache wie oben beschrieben und "ALLE" Koordinaten und Linien in "EINEN" Linienset packen will dann funktioniert es nicht richtig:

Beispiel VRML: http://clanlod.de/test6.wrl (es werden plötzlich keine Linien angezeigt)

Das gleiche Beispiel im X3D Plugin: http://clanlod.de/test.x3d
Hier nu das verblüffende ~50% der Linien sind blau wie von mir definiert. Die anderen 50% weis bzw. wohl undefiniert. Ich schliese mal ich habe irgendwo einen Fehler oder laufe gegen eine Obergrenze.

2.) Das andere Beispiel ist weniger schön geht aber. Ich habe hier nun jede Verbindung zwischen 2 Sternen in ein "EIGENES" Linienset gepackt. Das bläht die Datei immens auf, dann geht das Beispiel aber komischerweise.

Beispiel VRML: http://clanlod.de/test5.wrl

Ich suche also nach einer Möglichkeit die Platz- und Ressourcensparende Varient zum Laufen zu bekommen finde aber meinen Fehler nicht.

Wenn sich damit wer auskennt bitte ich um ein paar Tipps.

Grüße, Michael