与传统的Entity实体不同,Primitive作为一种自定义基本图元,几何形状、材质和其他属性均由使用者定义,在需要绘制大量静态几何图形的高效渲染场景中更为适用。
Primitive的移动涉及到矩阵变换,并不像Entity那样给它替换一个新的坐标数组就可以让其移动,现在让我们来看看怎么移动它。
1. 位置平移
// 假设你已经有一个Primitive实例,名为primitive
var primitive = ...; // 你的Primitive实例
// 获取当前的modelMatrix
var currentModelMatrix = Cesium.Matrix4.clone(primitive.modelMatrix);
// 定义平移向量(例如,沿x轴平移100单位)
var translation = new Cesium.Cartesian3(100.0, 0.0, 0.0);
// 创建一个平移矩阵
var translationMatrix = Cesium.Matrix4.fromTranslation(translation);
// 计算新的modelMatrix(将平移矩阵应用到当前模型矩阵上)
var newModelMatrix = Cesium.Matrix4.multiply(translationMatrix, currentModelMatrix, new Cesium.Matrix4());
// 注意:通常我们不会直接修改原始Primitive的modelMatrix,而是每次更新时都设置一个新的矩阵。
// 但是,在这个例子中,为了简单起见,我们直接更新了它。
// 在实际应用中,你可能需要保存原始矩阵或在更新前进行其他操作。
primitive.modelMatrix = newModelMatrix;
2. 位置重置
// 假设你已经有一个Primitive实例,名为primitive
var primitive = ...; // 你的Primitive实例
// 当前模型的modelMatrix(可能包含旋转和缩放)
var currentModelMatrix = Cesium.Matrix4.clone(primitive.modelMatrix);
// 新位置(世界坐标)
var newPosition = new Cesium.Cartesian3(x, y, z); // 替换x, y, z为你想要的新坐标
// 创建一个只包含新位置信息的平移矩阵
var translationMatrix = Cesium.Matrix4.fromTranslation(newPosition);
// 如果你想要保留当前的旋转和缩放(这通常更复杂),
// 你需要先从currentModelMatrix中提取这些信息,
// 然后创建一个新的模型矩阵,该矩阵包含新的平移、原始的旋转和缩放。
// 但是,为了简化,这里我们假设只关心平移。
// 一种简单的方法是重置modelMatrix为平移矩阵(这将丢失旋转和缩放)
// 注意:这可能不是你想要的结果,除非你确实只关心位置。
// primitive.modelMatrix = translationMatrix; // 不推荐这样做,因为它会丢失旋转和缩放。
// 现在重置为只包含新平移的模型矩阵(丢失旋转和缩放)
var modelMatrixWithOnlyTranslation = Cesium.Matrix4.multiplyByTranslation(Cesium.Matrix4.IDENTITY, newPosition, new Cesium.Matrix4());
primitive.modelMatrix = modelMatrixWithOnlyTranslation;
// 注意:上面的代码可能是不完善的,因为它会丢失旋转和缩放。
// 它只是为了说明如何创建一个只包含平移的矩阵。
// 在实际应用中,你可能需要找到一种方法来保留或重新应用旋转和缩放。
// 正确的移动做法通常涉及到更复杂的数学运算,
// 并且可能需要你跟踪对象的初始状态或使用其他方法来维护旋转和缩放信息。