Cesium 铯glTF模型层次结构

Cesium 铯glTF模型层次结构,cesium,gltf,Cesium,Gltf,我正在做一个演示,用户可以选择一些房屋和烟囱模型(以及其他模型)的变体。任何房子都可以与任何烟囱结合。烟囱在房屋上有一个固定的位置,但两者都可以动态缩放 这意味着烟囱的“世界”位置取决于房屋的位置和规模 如何使用glTF模型在铯中创建此功能?glTF是否支持可以包含另一个glTF模型的节点?或者我必须使用铯的模型矩阵来实现所需的功能 我不知道是否可以遍历glTF模型结构并将几何体的子集提取到另一个模型中,或者至少对模型几何体的分支应用不同的变换。然而,我怀疑这是可能的,因为glTF模型是高度优化

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

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

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


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

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

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为,因此格式允许它。但是,我不知道如何操作节点及其转换:(.

查看位于的文章,它包含有关在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);

或者,查看
modelMatrix
属性,因为您应该能够从那里更轻松地计算烟囱位置,或者使用它直接修改烟囱转换。glTF规范包含以下信息:更新了答案。找到了相关文章。为此添加了单独的答案。