实现思路:修改3dtileset中的顶点的高度值。
1、ue4的cesium插件中是通过UCesiumGltfComponent中来加载的。具体通过static void loadModelGameThreadPart( UCesiumGltfComponent* pGltf, LoadModelResult& loadResult, const glm::dmat4x4& cesiumToUnrealTransform)
这个函数来加载。在这里面会将每个tile通过对应的转换矩阵实现cesium中的位置转到ue中的位置。
pMesh->HighPrecisionNodeTransform = loadResult.transform;
pMesh->UpdateTransformFromCesium(cesiumToUnrealTransform);
2、 获取staticmesh中所有的顶点信息。
FPositionVertexBuffer& posBuffer = pStaticMesh->RenderData->LODResources[0].VertexBuffers.PositionVertexBuffer;
通过ion转换的模型,gltf的默认朝上的轴是Y轴,通过cc导出的3dtileset朝上的轴是Z轴。所以需要判断下朝上的轴是哪个。然后去修改对应轴的值。
3、计算需要修改的高度值
通过上面1中提交的方法,获取到cesium中坐标转换到ue中的坐标的转换矩阵。绘制一个范围,获取这个范围中的高度的最小值。根据范围,高度值来创建一个点,并获取到这个点在cesium中的位置。
FVector inverseLoca = inverse.TransformFVector4(FVector(_polygon.west,_polygon.south,_polygon.height));
最后将需要修改的顶点的高度值改为inverseLoca的高度值即可。
问题:1、这样修改完之后会闪面,没有太好的解决办法。
2、压平范围限制只能使用矩形,多边形的范围判定会很卡,应该是我使用算法的原因。如果能将范围判定放到显卡中计算就好了。但现在不会。。。。