2

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

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

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

任何指针将不胜感激。

4

2 回答 2

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);
于 2016-07-01T15:33:52.823 回答
1

我不知道是否可以遍历 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旨在保留节点层次结构,因此格式允许。我不知道如何操作节点及其转换:(。

于 2016-06-12T15:29:16.637 回答