Sansar: Wie nahe ist das Ende?
Auf dem Maddy'
Blogbetrag von 18. Juli 2015 steht eine interessante Antwort:
Wie groß wird eine Standard-Region in Sansar sein?
Antwort Ebbe:
Stell dir ein paar Kilometer vor.
Antwort Danger:
Das Land in Sansar ist nicht in irgendwelche Größen eingeteilt. Es kann beliebig groß sein, nur begrenzt durch die eigene Arbeitsleistung beim Erstellen einer Experience. Allerdings gibt es irgendwo eine theorethische Grenze, bis zu der der Physiksimulator noch klar kommt.
Das ist eine Sache, die ich recht interessant am Sansar finde. Das halte ich für Konsequenz daraus, dass man die Sims nicht miteinander verbinden kann. Diese Bedingung ist m.E. der einzige Grund warum Sims in SL alle dieselbe Größe haben müssen. Weil man so die Sims austauschen kann, auf eine andere Stelle bewegen, oder eine Lücke schließen, ohne die vorhandene Sims herumschieben zu müssen. Entfällt diese Bedingung, ist die Region in der Ausdehnung nicht mehr beschränkt, das heißt man kann beliebig weit von den anderen Objekten bauen.
Anstatt in die Höhe zu bauen, wenn man privat sein möchte, baut man die eigene Insel irgendwo 10km weit von der Hauptinsel und der Besucher entfernt, und schon hat man nicht nur Ruhe (10 km kann bestimmt keiner weit sehen) sondern auch das echte Wasser um die private Insel. Eine Möglichkeit, sich mit den anderen zusammenzuschließen oder ein Teil der Region bei einem Landbaron zu mieten, wird es vermuttlich auch geben, aber so kleine Grundstücke von 64m (1/16 Sim) wird es vermuttlich nicht geben, Platz ist ja genug, man wird zu Flächen von 128 oder 256m Kantenlänge greifen. Die kann man noch schön überblicken und alles darauf bauen was man so möchte. Dazwischen breite Flüsse und Seen und schon hat man eine große Insel, wenn nicht ein kleines Stück Mainland, die man auch weit herum umsegeln kann.
Die maximale "Größe" einer Region wird vermuttlich durch die Anzahl von Prims bestimmt, die auf der Region maximal aufgebaut wurden. Ein Server in SL kann 4 Regionen betreiben, mit 15.000 Prims pro region maximal. Wenn in Sansar ännliche Hardware verwendet wird mit ännlicher Software, dann müsste die Sansar Region so in etwa 60.000 Prims maximal aufnehmen. Und damit kann man schon einiges anstellen.
Aber zurück zur Ausdehnung. In einer idealen Welt müsste diese unendlich sein können. Weil es für die Physikengine egal ist, ob das Boot nur 10m vom Steg entfernt treibt, oder 10 Kilometer. In der realen welt haben Fließkommazahlen aber eine Genauigkeit. Aus diesen Zahlen sind Vektoren und Rotationen aufgebaut, und diese sind Grundlage für die Physikengine, die das Boot simuliert. Dummerweise sinkt die Genauigkeit je größer die Zahl ist.
Das heißt, entfernt man sich mit dem Boot weit genug vom Ursprung, werden die Berechnungen der Physikengine ungenau und sie kann Fehler machen. Das Boot könnte sinken oder abheben, Objekte würden komisch voneinander abprallen. Vielleicht kann die Physikengine wegen Rechenfehler eine 0 berechnen, durch die sie teilen muss. Dann ist das Boot nicht mehr zu steuern. Ich würde die Zone wo die Dinge merkwürdig werden eine "Gefahrzone" bezeichnen. Es kann sein, dass LL da eine harte grenze davor setzt, dass man gar nicht in die Zone gelangt.
Deshalb habe ich mich im Sinne des Threadtitel gefragt,
"Wie nahe ist das Ende der Sansar Region?".
Oder anders gesagt, wie weit müsste man hinausfahren, um in die Gefahrzone zu kommen, falls Sansar dieselbe Physikengine zu Grunde gelegt wird. Die Antwort ist also noch spekulativ, aber der Thread selbst ist auch spekulativ, also warum nicht.
Fließkommazahlen im LSL werden
hier erklärt, und es verweist auf
die Spezifikation, aber ich hatte die Seiten lange hoch und runger gelesen, ich weiß es nicht, wie man es berechnet. Deshalb habe ich ein Experiment gemacht.
Die Idee ist einfach. Ich nehme ein Testvektor, z.B.
<1, 1, 1>. Dieser kann z.b. die Position zweier Punkte angeben. Nun berechne ich die Länge des Vektors am Ursprung, wenn also ein Punkt am Ursprung liegt und der andere 1m in x, y, z. Dann verschiebe ich den Vektor bzw. beide Punkte immer weiter. Die Relativposition beider Punkte bleibt dieselbe. Die Grenze zur Gefahrzone ist überschritten, wenn die Längeberechnung des Testvektors in der Ferne einen anderen Ergebnis liefert, als die Berechnung am Ursprung. Der Skript ist etwas länger, weil wegen schnelleren Berechnung die Verschiebung erst in großen Schritten gemacht wird und dann die metergenauer Abstand in immer kleineren Schritten nachgesucht wird.
Code:
[COLOR="#FF8C00"]// Testvector, seine Länge wird entlang der Testweiten gemessen[/COLOR]
vector PROBE = <1.0, 1.0, 1.0>;
[COLOR="#FF8C00"]// Initiale Schrittweite in Meter.[/COLOR]
float STEP = 1024.1024;
[COLOR="#FF8C00"]// Abbruchdistanz in Meter, falls wir diese Überschreiten, dann ist
// die Gefahrdistanz so nicht messbar.[/COLOR]
float MAX_DIST = 100000000.0; // 100 000 Kilometer!
[COLOR="#FF8C00"]// ---------------------------------------------------------------------------[/COLOR]
default {
state_entry() {
[COLOR="#FF8C00"]// (Später verschobene) Basisvektor[/COLOR]
vector vBase = <0.0, 0.0, 0.0>;
[COLOR="#FF8C00"]// Diese Länge müssen wir immer genau messen[/COLOR]
float fLength = llVecDist(vBase, vBase+PROBE);
[COLOR="#FF8C00"]// Wir fangen im Ursprung an[/COLOR]
float vDZDist = 0.0;
llOwnerSay("Test 0 to "+(string)MAX_DIST+", step: "+(string)STEP+" meters");
[COLOR="#FF8C00"]// Hauptschleife der Messung[/COLOR]
while (TRUE) {
[COLOR="#FF8C00"]// Von vDZDist anfangend wird der Vektor schrittweise
// solange verschoben, bis wir Messfehler finden oder
// Über MAX_DIST hinaus sind - Abbruchskriterium 1.[/COLOR]
float offset = vDZDist;
while (TRUE) {
float next = offset+STEP;
if (next > MAX_DIST) jump notFound;
vBase = <next, 0.0, 0.0>;
float plen = llVecDist(vBase, vBase+PROBE);
[COLOR="#FF8C00"]// Messfehler gefunden? Gefahrgrenze überschritten.[/COLOR]
if (plen != fLength) {
jump nextRun;
}
else {
offset = next;
}
}
[COLOR="#FF8C00"]// Nächster Lauf erfolgt vom letzten "sicheren" Abstand aus,
// mit 8 mal kleineren Schritten, der Suchlauf wird so verfeinert.[/COLOR]
@nextRun;
vDZDist = offset;
STEP = STEP / 8.0;
[COLOR="#FF8C00"]// Gefahrzone berührt oder gefunden. Wenn nur berührt,
// wird die Messung solange wiederholt wie die Schrittweite
// mindestens 1 Meter ist: Abbruchskriterium 2.[/COLOR]
if (STEP < 1.0) {
llOwnerSay("Danger Zone Found at "+(string)vDZDist+" meters");
return;
}
else {
llOwnerSay("Danger Zone Hit at "+(string)vDZDist+" meters");
}
}
@notFound;
llOwnerSay("Danger Zone Not Found");
return;
}
}
Die Messung habe ich mehrfach mit verschiedenen Schrittlängen gemacht
[12:06] Object: Test 0 to 100000000.000000, step: 262144.000000 meters
...
[12:06] Object: Danger Zone Found at 16777220.000000 meters
[12:07] Object: Test 0 to 100000000.000000, step: 2500000.000000 meters
...
[12:07] Object: Danger Zone Found at 16777220.000000 meters
[12:11] Object: Test 0 to 100000000.000000, step: 22222.220000 meters
...
[12:11] Object: Danger Zone Found at 16777210.000000 meters
[12:12] Object: Test 0 to 100000000.000000, step: 1000.102000 meters
...
[12:12] Object: Danger Zone Found at 16777210.000000 meters
Interessant ist auch, dass erst als ich die Schrittlänge auf 1000.1024 reduziert habe, diese mir mit 1000.102000 angegeben wurde. Die Stringausgabe schneidet also ganz schön ab. Dennoch liegt die Grenze zur gefahrenzone erst ungefähr bei 16777200 Meter, das ist über 16 Kilometer in jede Richtung vom Ursprung! Die Region in Sansar müsste also so um die 32 Kilometer breit sein, maximal, und keine 256 Meter.
Wenn es auch so herauskommt, viel, viel Spass beim Segeln