【问题标题】:parsing and updating object position for animation in three js解析和更新三个js中动画的对象位置
【发布时间】:2017-08-17 22:52:20
【问题描述】:

我读过的关于在three.js 中制作动画的所有教程都是关于以圆形或随机轨迹移动对象的。我的问题是我有一个 129k 行长的 .txt 文件,其中包含随着时间的推移原子的特定 xyz 位置。每次迭代都以:

256
Atoms. Timestep: 66000
1 0.702825 2.71217 2.71612
1 16.9592 2.64886 6.79019
1 0.681418 2.68359 10.8911
1 16.96 2.6822 14.9396
1 0.659922 6.77858 2.72442
1 16.9873 6.7709 6.77907
...

这会重复多达 256 个原子。忽略前 2 行,接下来的 256 行是动画第一个“帧”的原子的 xyz 位置,总共有 500 帧(500 x 258 = 129000 行)。我通过将前 256 个位置放入一个单独的文件并对其进行解析来对动画的第一帧进行建模,现在我想使用文档的其余部分为每一帧更新我的原子的位置。 这是我用来解析第一帧位置的代码:

    fetch('Une_image_256_atomes.txt').then(response => response.text()).then(text => {
      const atoms = text.split('\n')  
        .map(line => line.trim())     
        .map(line => line.split(' ')) 
        .map(([size, x, y, z]) => ({ 
          size: Number(size), 
          x: Number(x), 
          y: Number(y), 
          z: Number(z) 
        }));

        for (var i = 0; i < atoms.length; i++) {
            atom = sphere.clone();
            atom.position.set( atoms[i].x, atoms[i].y, atoms[i].z );
            atom.name = "atom";
            scene.add( atom );
            group.push( atom );
        }

其中“组”是包含所有原子对象的数组。

  1. 最好将长文件切割成 500 个小文件并循环解析每个短文件并使用相同的代码,还是应该一次性解析长文件?如果是后者,我如何在其中迭代以使动画的每一帧 = 接下来的 256 个位置?

  2. 有没有办法设置每一帧的时间?如果我想让动画更快,假设 1 毫秒,如果更慢,假设 10 毫秒。

  3. 如何让动画在页面加载时运行而无需先单击按钮?

【问题讨论】:

  • 我已经给出了答案,但请记住:1) 多个问题应该分成多个帖子,尤其是当一个主题与主题无关时其他的(例如,解析文件与时间渲染无关,与在页面加载时运行脚本无关。)2) 虽然您的代码可以帮助我们了解您的处理方式问题是,您没有提供任何告诉/向我们展示您尝试过的内容。先尝试很重要,这样我们才能帮助您解决具体问题/错误。

标签: animation three.js


【解决方案1】:

1) 如果内存允许,请将它们全部保存在一个文件中,并将它们解析为一个二维数组,这样每一帧就有一组 256 个位置。考虑循环:

var i, j;
for(i = 0, i < numberOfFrames; ++i){
    for(j = 0; j < numberOfAtoms; ++j){
        moveAtom(j, framePositions[i][j]);
    }
}

2) 使用间隔(setIntervalclearInterval)设置位置更新和渲染的定时执行。

3) 这就像执行一个解析数据文件并开始间隔的函数一样简单。这是 JavaScript 中的一种常见做法,网上有很多关于如何做到这一点的示例。

【讨论】:

  • 所以基本上 framePositions[i][j].x = x 一个原子的位置,framePositions[i][j].y = y 等等?对于短文件,我不必考虑每 258 行停止解析,因为整个文件是 258 行,但是我如何循环获取 2D 数组?
  • @YujiaDing 正确。要遍历文件,您可能需要在按换行符 (\n) 拆分后手动执行此操作。您可以从拆分返回的数组中slice 258 个“行”子数组,并处理这些子数组。正如我在评论中所说,尝试一下。如果您害怕破坏您拥有的东西,请进行备份。如果您遇到困难,请回来询问更多问题。
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2010-11-23
相关资源
最近更新 更多