0 three.js
我已经搜索了很远很远,所以如果有类似的问题,请原谅我,但我就是找不到。
把我想要做的事情放在上下文中:我想创建一个无限生成的星星场,当它们离开屏幕时消失并重新出现在相机移动的屏幕边缘。我正在使用自上而下的视图,因此实现这一点必须非常简单,但可惜我没有任何线索。
我正在使用以下代码来确定星星是否已离开屏幕,然后将其替换:
//update camera frustum
camera.projScreenMatrix.multiplyMatrices(
camera.projectionMatrix,
camera.matrixWorldInverse
);
camera.frustum.setFromMatrix(camera.projScreenMatrix);
//loop through stars
var stars=scene.stars.geometry.vertices;
for(var i=0;i<stars.length;i++) {
if(!camera.frustum.containsPoint(stars[i])) {
stars[i]=new THREE.Vector3(
// fill in the blank
);
scene.stars.geometry.verticesNeedUpdate=true;
}
}
Run Code Online (Sandbox Code Playgroud)
由于我使用的是透视相机,我知道我需要以某种方式考虑camera.fov其他透视元素,但正如您所知,我不是三维方面的专家。
假设我有一个角度或归一化向量告诉我视图平移的方向,我将如何沿着屏幕边缘创建一个顶点,而不管其 Z 位置如何?
如果我不够清楚,我很乐意澄清。谢谢。
我知道这是一个老问题,但我在寻找答案时遇到了它,并找到了一种简单的、依赖于三角函数的方法来获取相机视锥体的左边缘,我将其分享,以防其他人发现它有用:
// Get half of the cameras field of view angle in radians
var fov = camera.fov / 180 * Math.PI / 2;
// Get the adjacent to calculate the opposite
// This assumes you are looking at the scene
var adjacent = camera.position.distanceTo( scene.position );
// Use trig to get the leftmost point (tangent = o / a)
var left = Math.tan( fov ) * adjacent * camera.aspect;
Run Code Online (Sandbox Code Playgroud)
基本上,这会得到最左边的点,但是如果你不乘以纵横比,你应该在你的相机视锥周围的圆圈中得到一个点,这样你就可以从相机焦点的任何方向平移一个点,它总是视锥体外。
它的工作原理是假设作为相机的假想平面垂直于连接相机及其焦点的线,因此存在直角。如果您还希望物体离得更远,这应该有效(因此,如果您希望它们离相机更远,您只需要增加焦点和相机之间的距离)。