【问题标题】:Simulate an infinite number of objects模拟无限数量的物体
【发布时间】:2015-10-15 03:32:17
【问题描述】:

在这个example 上,我们可以在一个球体范围内移动,但进入一定的限制。我希望能够在它们之间无限移动。我该怎么做?

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    诀窍是重复使用相机后面的球体并将它们放在它前面。在this example 中查看它是如何完成的。在这里,程序员知道用户将继续朝同一个方向前进,因此他移除了到达某个位置的树。

    如果您使用类似于您引用的示例的内容,您将无法知道用户将采取哪个方向。因此,您可以使用相同的技巧,但必须以其他方式对其进行编码。如果用户移动,最明显的是定期检查所有球体的距离。如果一个球体距离相机太远,则将其镜像,使其面向相机,在雾的后面。

    “定期”可能意味着两件事,具体取决于场景中球体的实际数量:

    • 如果您有一个小场景和几个球体,您可以在渲染循环中检查这些距离。既不便宜也不实用,每秒 60 个,但这可能是第一个编码步骤

    • 那么最好的方法是使用网络工作者:发送相机和球体的位置,让工作者计算其线程中的所有内容,然后发回指令:'move那些领域到那些位置'。在 threejs 示例中,每一秒都更合理,但取决于您的场景,由您决定。

    注意:如果您有很多球体,或者您使用的任何网格,例如超过 20-30 个,则为每个球体设置一个网格会降低性能。我链接的示例中的树很少,没关系,但是有更多的对象和/或更重的场景,

    • 考虑将它们全部合并到一个几何体中。您可以通过从顶点索引推断或添加定义每个球体的属性来检查哪个球体在哪里。
    • 这也会影响工作人员延迟:它需要计算更多,因此需要更多时间。

    注 2:注 1 当然会删除该示例旨在说明的细节级别 :) (除非您在检查球体距离时也实现自己的......)

    【讨论】:

    • 感谢您的支持 ^^ 他可能永远不会回来
    【解决方案2】:

    如果你想拥有无限世界的幻觉,那么你可以:

    1. 将您的世界空间划分为多个区域(例如立方体)。
    2. 检测您当前所在的区域。
    3. 确保您在相邻区域中有对象(球体)。如果某些区域是空的 - 请修复它。
    4. 清除不再需要的区域。

    为此,您可能希望有这样的课程:

    Class Region {
        bool isEmpty = true;
        Vector3 center;
        float radius; // or 'range'
        Array<Sphere> = null; // storage of your objects
    
        // constructors / destructor
    
        generateObjects(params); // perlin noise might be helpful there
        removeObjects();
    }
    

    并定期做这样的事情:

    void updateRegions() {
        computeClosestGridCoord(myPosition); // which is center of your current region
        lookForNeighbourRegions(regionsArray); // and add new Region if needed
        deleteOldRegionsStuff(regionsArray);
    }
    

    【讨论】:

    • 问题是关于javascript的
    • C 风格的伪代码不是更具可读性吗? :O(或者你的意思是关于 js 结构而不是生成世界?)
    • 抱歉英语不好
    猜你喜欢
    • 2014-07-03
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多