如何使相机跟随地形's在此示例中的高度:http://threejs.org/examples/#webgl_t

how to make a camera follows the terrain's height in this sample: http://threejs.org/examples/#webgl_terrain_dynamic

本文关键字:http 高度 threejs #webgl examples org 跟随 相机 何使      更新时间:2023-09-26

我想知道如何在这三个js示例中制作相机:http://threejs.org/examples/#webgl_terrain_dynamic

遵循地形的高度。因此,当地形移动时,相机会根据地形的山丘(高度)上下移动。

换句话说,知道地形的高度是由高度图构建的,我怎么能得到地形的高度?

我已经尝试使用Raycaster如下:

var raycaster = new THREE.Raycaster( camera.position, new THREE.Vector3(0, -1, 0) );
var intersects = raycaster.intersectObject( terrain, false );
var intersect_point = intersetcs[0].point;

但无论相机位于何处,intersect_point的y值始终等于0。实际上,本例中的地形高度是由高度图创建的。因此,作为平面的地形的几何图形不会被高度贴图更改,而是保持平坦,因此是光线投射器的结果。

你能帮我找到一种方法来获得给定位置的地形高度吗。

非常感谢你的帮助。

在示例中,计算相机相对于"heightmap"纹理的位置,并读取高度信息(您可能需要查看heightmap正在使用的着色器来确定如何"读取",因为我不记得它的详细信息)。

以下是我要使用的一般解决方案。

步骤1:复制地形着色器(添加颜色的着色器,而不是创建物理地形的着色器)并对其进行修改,以便不输出地形颜色,而是根据与摄影机的距离输出颜色(想想MeshDepthMaterial或MeshDistanceMaterial)。您必须执行一些浮动<->彩色包装,以确保您可以读出完整的浮动。我们将其称为"距离着色器",因为它的目标是渲染事物离相机的距离。

第二步:添加一个看起来笔直向下的相机(相对于地形),你需要保持这个相机的位置与你的实际相机同步。这在渲染循环期间应该很容易做到(只需复制位置向量)。相机的视野可能非常小(比如1度)。我们称之为"高度相机",因为它的目标是确定高度。

步骤3:在渲染循环中。首先使用"距离着色器"answers"高度摄影机"将地形渲染为纹理目标(可以很小,可能只有1像素乘1像素)。

步骤4:读取步骤3中纹理目标的颜色信息,通过反转颜色填充将其从RGBA转换回float。现在你有了身高。