【发布时间】:2015-10-15 03:32:17
【问题描述】:
在这个example 上,我们可以在一个球体范围内移动,但进入一定的限制。我希望能够在它们之间无限移动。我该怎么做?
【问题讨论】:
标签: javascript three.js
在这个example 上,我们可以在一个球体范围内移动,但进入一定的限制。我希望能够在它们之间无限移动。我该怎么做?
【问题讨论】:
标签: javascript three.js
诀窍是重复使用相机后面的球体并将它们放在它前面。在this example 中查看它是如何完成的。在这里,程序员知道用户将继续朝同一个方向前进,因此他移除了到达某个位置的树。
如果您使用类似于您引用的示例的内容,您将无法知道用户将采取哪个方向。因此,您可以使用相同的技巧,但必须以其他方式对其进行编码。如果用户移动,最明显的是定期检查所有球体的距离。如果一个球体距离相机太远,则将其镜像,使其面向相机,在雾的后面。
“定期”可能意味着两件事,具体取决于场景中球体的实际数量:
如果您有一个小场景和几个球体,您可以在渲染循环中检查这些距离。既不便宜也不实用,每秒 60 个,但这可能是第一个编码步骤
那么最好的方法是使用网络工作者:发送相机和球体的位置,让工作者计算其线程中的所有内容,然后发回指令:'move那些领域到那些位置'。在 threejs 示例中,每一秒都更合理,但取决于您的场景,由您决定。
注意:如果您有很多球体,或者您使用的任何网格,例如超过 20-30 个,则为每个球体设置一个网格会降低性能。我链接的示例中的树很少,没关系,但是有更多的对象和/或更重的场景,
注 2:注 1 当然会删除该示例旨在说明的细节级别 :) (除非您在检查球体距离时也实现自己的......)
【讨论】:
如果你想拥有无限世界的幻觉,那么你可以:
为此,您可能希望有这样的课程:
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);
}
【讨论】: