2016-04-19 3 views
1

Benutzer von New Babylon JS, der sich mit diesem fantastischen Framework vertraut machen möchte. Ich habe mit der Sandbox und dem Online-Editor gespielt, mein eigenes Codemodell von Grund auf mit den Standardkomponenten Box, Sphere usw. aufgearbeitet. Meine Frage bezieht sich darauf, wie komplexere benutzerdefinierte Geometrie geladen wird. Sehr komfortabel mit 3D-CAD - STL/OBJ-Dateien, einige Exporte gehen von Blender zu .Babylon-Format, die große in Babylons Online-Sandbox & Editoren importieren. Allerdings kann ich den SceneLoader nicht dazu bringen, eine Datei vom lokalen Laufwerk C:/zu lesen. Code-Auszug unten:Babylon JS - SceneLoader aus der lokalen Datei

// Create new Babylon Scene 
var scene = new BABYLON.Scene(engine); 

// Change scene background color 
scene.clearColor = new BABYLON.Color3(1, 1, 1); 

// Create and positions a free camera 
var camera = new BABYLON.FreeCamera("camera1", new BABYLON.Vector3(0, 10, 0), scene); 

// Target the camera to scene origin 
camera.setTarget(BABYLON.Vector3.Zero()); 

// Attach camera to the canvas 
camera.attachControl(canvas, true); 

// Define built-in 'box' shape. 
var box = BABYLON.Mesh.CreateBox("sphere1", 1, scene); 

// Define 'ground' plane 
var ground = BABYLON.Mesh.CreateGround("ground1", 100, 100, 100, scene); 
      ground.position.y = 0; 
//Load local .babylon file from root Dir 
BABYLON.SceneLoader.Load("", "Test.babylon", engine, scene); 

Mein Modell hat eine Standard-Box für Geometrie mit Grundebene. All rendert in Babylon - bis ich die SceneLoader-Zeile hinzufüge. Wenn ich das hinzufüge, bleibe ich auf dem Babylon Loading Intro Splash Screen (rotierendes Babylon Logo) hängen. Wenn ich die letzte Zeile des obigen Codes auskommentiere, rendert das Modell die Box. Ich habe mir verschiedene Foren-Seiten angesehen und mein Gehirn zerstört, zB: http://www.html5gamedevs.com/topic/20924-stlobj-file-loader/ & https://www.eternalcoding.com/?p=313 Ich glaube, dass Google Chrome lokale Dateiverknüpfungen aus Sicherheitsgründen aussperrt, versucht hat, in "Lokal" zu laufen Access-Modus, immer noch auf der Lade-Seite stecken. Brauche ich einen Webserver (ich weiß nicht, wo ich anfangen soll) oder kann ich Babylon-Szenen lokal ausführen?

+0

Erzielen Sie nützliche Ergebnisse in der Webkonsole? Ich denke, es sollte sich beschweren, wenn es damit zusammenhängt, über Herkunftsanfragen zu gehen. Von dem, was Sie beschreiben, klingt es, als ob Sie auf dem richtigen Weg sind, indem Sie Chrome mit "--allow-file-access-from-files" ausführen. Ich erinnere mich, dass ich auch damit herumgespielt habe und hoffe, dass ich später etwas Zeit habe, mich darum zu kümmern.Sie brauchen den Webserver in diesem Stadium definitiv nicht. –

+0

Ja - Chrome Dev Tools-Konsole schlägt mehrere Fehler beim Zugriff auf die lokale Datei vor. Drei oder vier rote Konsolenfehler, die sich alle auf den Zugriff auf die .babylon-Datei auf c:/path beziehen. – MarkGuk

+0

XMLHttpRequest kann Datei nicht laden: /// C: /Javascript/Test.babylon.manifest? 1461103045485. Cross-Ursprungsanforderungen werden nur für Protokollschemas unterstützt: http, data, chrome, chrome-extension, https, chrome-extension-resource. – MarkGuk

Antwort

1

Ok - porgress. Ich habe es mit SceneLoader.ImportMesh gehen, aber ich musste einen einfachen HTTP-Server mit Python (v3) einrichten. Dieser Link hat sehr geholfen: http://www.linuxjournal.com/content/tech-tip-really-simple-http-server-python So führen Sie den Python-HTTP-Server aus dem Verzeichnis, auf dem die Babylon index.html basiert, und es wird so ausgeführt, als ob HTTP lokale Dateizugriffsbeschränkungen in Chrome umgeht. Also mein Problem ist alles andere als beantwortet. Ich habe jetzt meine Mesh-Geometrie aus der Test.Baylon-Datei in meine Hauptszene. Immer noch Probleme mit SceneLoader.Load, wenn die neue Szene hereinkommt, ersetzt meine ursprüngliche Szene und die ursprüngliche Geometrie verschwindet. David - Ich denke, du hast recht, dass die Funktion benötigt wird, obwohl ich dachte, das wäre optional. Wie ich schon sagte, das Tutorial-Beispiel erstellt einen neuenScene und rendert innerhalb der Funktion, in meinem Fall weiß ich nicht, was ich in der Funktion tun soll ... vielleicht einfach 'zurückgeben'?

1

Also ich bin nicht 100% sicher über diese Antwort, aber hoffentlich wird es helfen. Ich folgte diesem tutorial (Skip bis zu dem Abschnitt, wo die Szene geladen wird). Ein Problem ist definitiv die Kreuzursprungssache, das andere wie Sie die SceneLoader.Load Methode nennen.

Wenn ich den Code aus dem Tutorial mit regulären Chrome versuche, sehe ich drei Warnungen in meiner Webkonsole. Zwei Fehler über Test.babylon.manifest (mit Ihrer Beispieldateibenennung) und einer über Test.babylon. Sie können die in Bezug auf Manifeste afaik ignorieren. Der wichtigste ist der Fehler bei Test.babylon selbst. Standardmäßig sind Cross-Ursprungs-Anfragen nicht erlaubt und die Babylon-Datei wird nicht geladen (wie erwartet).

Wenn ich nun Chrome schließe und es erneut öffne, indem ich open -a "Google Chrome" --args --allow-file-access-from-files im Terminal starte (ich bin auf OSX Yosemite), und dann die Seite lade, lädt das Objekt gut. Ich sehe immer noch zwei Fehler über Manifeste in der Webkonsole, aber sie können ignoriert werden.

Beachten Sie, wie die BABYLON.SceneLoader.Load-Funktion aufgerufen wird. Der Importvorgang ist asynchron, und der letzte Parameter scheint eine Callback-Funktion zu sein, die nach dem erfolgreichen Laden des Objekts ausgeführt wird. Daher glaube ich nicht, dass Sie scene wie in Ihrem ursprünglichen Code übergeben können. Schauen Sie sich die function docs.

+0

Danke. Ich dachte, der Rückruf wäre optional, wie in den Funktionsdokumenten angegeben? Das Beispiel-Lernprogramm erstellt außerdem direkt eine neue Szene und Kamera im SceneLioader. In meinem Fall versuche ich, in eine bestehende Szene zu laden, also schneide meine Args zurück, um die Callback-Funktion zu entfernen und auf Szene zu reduzieren. Was kann ich in der Callback-Funktion tun, wenn ich keine neue Szene/Kamera erstellen, neu rendern möchte usw.? Habe auch die ImportMesh-Option ausprobiert, die keinen Callback benötigt ( – MarkGuk

+0

). Es ist erwähnenswert, dass mein Vorschlag ab Version 5.0 von BabylonJS nicht mehr alleine funktioniert. Die 'Tools.LoadFile'-Methode in [babylon.tools.ts] (https://github.com/BabylonJS/Babylon.js/blob/407b2d3f0ffe9d7e80ecc670ebab7fc3f14bae9d/src/Tools/babylon.tools.ts#L484-L492) verwendet einen XmlHttpRequest und gibt 0 anstelle von 200 für lokale Dateien zurück. Ich habe einen Sonderfall hinzugefügt, um auch den nächsten Schritt für den Statuscode 0 auszulösen. –

Verwandte Themen