4

我正在创建一个简单的 WebGL 项目,需要一种加载模型的方法。我决定使用 OBJ 格式,所以我需要一种加载它的方法。该文件(将要)存储在服务器上,我的问题是:如何在 JS 中加载文本文件并逐行扫描,一个令牌一个令牌(就像 C++ 中的流一样)?我是 JS 的新手,因此我的问题。方法越简单越好。

更新:我使用了你的解决方案,broofa,但我不确定我是否做对了。我从您编写的 forEach 循环中的文件加载数据,但在它之外(即在您的所有代码之后),我一直在填充数据的对象是“未定义的”。我究竟做错了什么?这是代码:

var materialFilename;

function loadOBJModel(filename)
{
    // ...

    var req = new XMLHttpRequest();
    req.open('GET', filename);
    req.responseType = 'text';
    req.onreadystatechange = function()
    {
        if (req.readyState == 4)
        {
            var lines = req.responseText.split(/\n/g);
            lines.forEach(function(line)
            {
                readLine(line);
            });
        }
    }
    req.send();

    alert(materialFilename);

    // ...
}

function readLine(line)
{
    // ...

    else if (tokens[0] == "mtllib")
    {
        materialFilename = tokens[1];
    }

    // ...
}
4

2 回答 2

3

您可以使用XMLHttpRequest来获取文件,假设它来自与您的主网页相同的域。如果没有,并且您可以控制托管文件的服务器,则可以启用CORS而不会有太多麻烦。例如

要逐行扫描,可以使用 split()。例如像这样的东西......

var req = new XMLHttpRequest();
req.open('GET', '/your/url/goes/here');
req.onreadystatechange = function() {
  if (req.readyState == 4) {
    if (req.status == 200) {
      var lines = req.responseText.split(/\n/g);
      lines.forEach(function(line, i) {
        // 'line' is a line of your file, 'i' is the line number (starting at 0)
      });
    } else {
      // (something went wrong with the request)
    }
  }
}

req.send();
于 2012-11-26T23:35:30.283 回答
0

如果您不能简单地使用 XHR 或 CORS 加载数据,则始终可以使用 JSON-P 方法,方法是使用 JavaScript 函数包装它并将脚本标记动态附加到您的页面。

您将拥有一个接受callback参数并返回类似callback1234(/* file data here */);.

获得数据后,解析应该是微不足道的,但您必须编写自己的解析函数。开箱即用的东西不存在。

于 2012-11-26T23:29:14.000 回答