Javascript 巴比伦JS-本地文件中的SceneLoader

Javascript 巴比伦JS-本地文件中的SceneLoader,javascript,babylonjs,Javascript,Babylonjs,巴比伦JS的新用户,希望能跟上这个奇妙的框架。玩过沙盒和在线编辑器,使用标准组件(长方体、球体等)从头开始创建了自己的编码模型。我的问题涉及如何加载更复杂的自定义几何体。非常熟悉3D CAD-STL/OBJ文件,获得了一些从Blender到.Babylon格式的导出,这些导出导入到Babylon的在线沙盒和编辑器中。但是,我似乎无法让SceneLoader从本地C:/drive读取文件。代码摘录如下: // Create new Babylon Scene var scene = new BAB

巴比伦JS的新用户,希望能跟上这个奇妙的框架。玩过沙盒和在线编辑器,使用标准组件(长方体、球体等)从头开始创建了自己的编码模型。我的问题涉及如何加载更复杂的自定义几何体。非常熟悉3D CAD-STL/OBJ文件,获得了一些从Blender到.Babylon格式的导出,这些导出导入到Babylon的在线沙盒和编辑器中。但是,我似乎无法让SceneLoader从本地C:/drive读取文件。代码摘录如下:

// 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);
我的模型有一个带地平面的标准几何体框。在巴比伦,一切都变得伟大——直到我添加了SceneLoader线。当我添加这个时,我被困在巴比伦加载简介启动屏幕上(旋转巴比伦标志)。如果我注释掉上面的最后一行代码,则模型可以很好地渲染框。 我看了论坛上的各种页面,把我的大脑弄得几乎卡住了,例如:&
我相信Google Chrome可能出于安全考虑锁定了本地文件链接,已经尝试过在允许本地文件访问模式下运行,但仍然停留在加载页面上。我需要一个web服务器(我不知道从哪里开始!)还是可以在本地运行巴比伦场景

所以我不是100%确定这个答案,但希望它能有所帮助。我遵循了这一点(跳到加载场景的部分)。一个问题肯定是跨源问题,另一个问题是如何调用
SceneLoader.Load
方法

当我使用常规Chrome尝试教程中的代码时,我在web控制台中看到三个警告。关于Test.babylon.manifest(使用您的示例文件命名)的两个错误和关于Test.babylon的一个错误。您可以忽略关于清单的内容。重要的是关于测试的错误。巴比伦本身。因此,默认情况下不允许跨原点请求,并且巴比伦文件不会加载(如预期的那样)

现在,当我关闭Chrome并通过运行
open-a“Google Chrome”-args--从终端(我在OSX Yosemite上)中的文件
重新打开它,然后加载页面时,对象加载良好。我仍然在web控制台中看到两个关于清单的错误,但是可以忽略它们

注意如何调用
巴比伦.SceneLoader.Load
函数。导入过程是异步的,最后一个参数看起来是一个回调函数,用于在对象成功加载后执行什么操作,因此我认为您不能像在原始代码中那样传递
场景。请查看。

Ok-porgress。 我使用SceneLoader.ImportMesh实现了它,但我必须使用Python(v3)设置一个简单的HTTP服务器。这个链接帮助很大: 因此,您可以从巴比伦index.html所在的目录运行Python HTTP服务器,它的运行就像HTTP绕过Chrome中的本地文件访问限制一样。
所以我的问题几乎得到了回答。现在,我将Test.Baylon文件中的网格几何体放入主场景。使用SceneLoader.Load时仍有问题,因为新场景将取代我的原始场景,并且原始几何体将消失。David-我认为您在需要的函数上是正确的,尽管我认为这是可选的。正如我所说,教程示例创建了一个newScene并在函数中进行渲染,在我的例子中,我不知道在函数中要做什么。。。可能只是“返回”?

OP提出的第一个问题:浏览器没有从文件系统加载网格。

解决方案:使用简单HTTP服务器(Python)等web服务器。根据Python版本的不同,实现这一点的方法略有不同。要在Windows上检查Python版本,请打开命令提示符并键入
Python--version
。记住以后的版本号:)

使用Python设置简单web服务器并使用命令提示:

  • 使用文件资源管理器中的
    index.html
    文件导航到目录
  • 左键单击路径框内的空白处(上面写着
    This PC>Documents
    ,等等)
  • 键入
    cmd
    ,它将在当前目录中打开命令提示符
  • 输入相应的命令

    python-m SimpleHTTPServer[可选端口号],如果您使用的是python 2

    python-mhttp.server[可选端口号],如果您使用的是python3

    我通常省略端口号,只需键入
    python-mhttp.server

  • 现在打开首选浏览器,在地址栏中输入
    localhost:8000
    。(8000是默认端口号。如果指定了端口,请使用指定的端口号。)如果代码没有错误,则应加载网格

OP:SceneLoader提出的第二个问题。加载方法覆盖以前加载的网格。

解决方案:

  • 如果只需要导入几个网格,请使用或。但是,这种方法不便于管理许多资产

  • 或者,使用。由于Babylon.js异步加载模型,因此asset manager允许通过回调函数轻松使用。换句话说,如果在回调函数中键入,可以使用
    scene.getMeshByName(“yourMesh”)
    按名称查找资产。这是一本书


我知道这个问题已经问了好几年了,但如果有人对此仍有疑问,我希望这个答案能有所帮助。

您在web控制台中获得了有用的输出吗?我认为如果它与跨来源请求有关,它应该抱怨。从您描述的内容来看,通过运行Chrome with
——允许从文件访问文件,您似乎走上了正确的道路。我记得我也不得不处理这个问题,希望以后能有时间来研究一下。在这个阶段,您肯定不需要web服务器。是的-Chrome开发工具控制台建议在访问本地文件时出现多个错误。三四个红色c