铯glTF模型层次结构

时间:2016-01-25 09:47:51

标签: cesium gltf

我正在进行一个演示,用户可以选择房屋和烟囱模型(以及其他)的一些变体。任何房子都可以与任何烟囱结合。烟囱在房子上有一个固定的位置,但两者都可以动态缩放。

这意味着"世界"烟囱的位置取决于房屋的位置和规模。

如何使用glTF模型在Cesium中创建此功能? glTF是否支持可以拥有另一个glTF模型的节点?或者我是否必须使用Cesium的modelMatrix来实现所需的功能?

任何指针都会非常感激。

2 个答案:

答案 0 :(得分:1)

我不知道是否可以遍历glTF模型结构并将几何的子集提取到另一个模型中,或者至少将不同的变换应用于模型几何的分支。 然而,我怀疑这是可能的,因为glTF模型的高度优化方式。不要把这作为最后的答案,因为我不太了解Cesium。

目前,我正在解决此问题,方法是先在资产管道中分离几何体,然后加载单独的模型,每个模型都以自己的局部坐标系为中心。我手动跟踪一个对象相对于另一个对象的坐标和方向,并手动进行计算。

var house = createModel("house", 'house/hull-lp.glb');
var chimney = createModel("chimney", 'models/chimney.glb');

定位烟囱,有些东西......

var chimneyRelativePosition = new Cesium.Cartesian3(0, 10, 0);  // The position of the chimney relative to the origin of the house
var chimneyRelativePositionScaled = Cesium.Cartesian3.multiplyByScalar(chimneyRelativePosition, houseScaleFactor, chimneyRelativePositionScaled);
var localCoords = Cesium.Matrix3.fromQuaternion(house.orientation.getValue(), new Cesium.Matrix3());
var chimneyPosition = Cesium.Matrix3.multiplyByVector(localCoords, chimneyRelativePositionScaled, new Cesium.Cartesian3());

chimney.position = chimneyPosition;

修改:glTF为designed to preserve node hierarchy,因此格式允许。我不知道如何操纵节点及其转换:(。

答案 1 :(得分:1)

查看https://cesiumjs.org/2014/10/13/youbeQ-Moving-from-Google-Earth-to-Cesium/上的文章,其中包含有关在Cesium中操作模型层次结构的信息。

示例:

var node = model.getNode('wheel_front_right');

var translationArray = model.gltf.nodes[node.id].translation;
var translation = new Cesium.Cartesian3(translationArray[0], translationArray[1], translationArray[2]);

node.matrix = Transforms.headingPitchRollToFixedFrame(translation, heading, tilt, roll);