Matrix4没有fromRotationX方法了
时间: 2025-09-03 11:15:19 AIGC 浏览: 18
你说得对!从 **Cesium 1.100+** 开始,`Cesium.Matrix4.fromRotationX()`、`fromRotationY()` 和 `fromRotationZ()` 这些方法已经被 **弃用**,并在后续版本中 **移除**。
> ❗ `Cesium.Matrix4.fromRotationX(angle)` 已被移除。
---
## ✅ 新的替代方式
Cesium 推荐使用 **`Cesium.Matrix3.fromRotationX(angle)`** 创建一个 **3x3 的旋转矩阵**,然后使用 `Cesium.Matrix4.fromRotationTranslation` 将其转换为 4x4 的变换矩阵。
---
## 🧠 旋转矩阵原理回顾
一个绕 **X轴旋转** 的 3x3 矩阵如下:
$$
R_x(\theta) =
\begin{bmatrix}
1 & 0 & 0 \\
0 & \cos\theta & -\sin\theta \\
0 & \sin\theta & \cos\theta
\end{bmatrix}
$$
同样的,绕 **Z轴旋转**:
$$
R_z(\theta) =
\begin{bmatrix}
\cos\theta & -\sin\theta & 0 \\
\sin\theta & \cos\theta & 0 \\
0 & 0 & 1
\end{bmatrix}
$$
---
## ✅ 正确实现方式(适用于 Cesium >= 1.100,包括 1.132)
```javascript
const viewer = new Cesium.Viewer('cesiumContainer');
// 定义原始点 A 和旋转中心点 B
const pointA = new Cesium.Cartesian3(1000000.0, 0.0, 0.0); // 原始点
const pointB = new Cesium.Cartesian3(0.0, 0.0, 0.0); // 旋转中心点
// 1. 平移到以 B 为原点
const translateToOrigin = Cesium.Matrix4.fromTranslation(
new Cesium.Cartesian3(-pointB.x, -pointB.y, -pointB.z)
);
// 2. 创建绕 X 轴旋转 30° 的矩阵
const rotationX = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(30));
const rotateXMatrix = Cesium.Matrix4.fromRotationTranslation({ rotation: rotationX });
// 3. 创建绕 Z 轴旋转 60° 的矩阵
const rotationZ = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(60));
const rotateZMatrix = Cesium.Matrix4.fromRotationTranslation({ rotation: rotationZ });
// 4. 构建反向平移矩阵(恢复原点)
const translateBack = Cesium.Matrix4.fromTranslation(pointB);
// 5. 构建复合变换矩阵:T * Rz * Rx * T_inv
let compositeMatrix = Cesium.Matrix4.multiply(rotateZMatrix, rotateXMatrix, new Cesium.Matrix4());
compositeMatrix = Cesium.Matrix4.multiply(compositeMatrix, translateToOrigin, new Cesium.Matrix4());
compositeMatrix = Cesium.Matrix4.multiply(translateBack, compositeMatrix, new Cesium.Matrix4());
// 6. 应用变换到点 A
const rotatedPoint = Cesium.Matrix4.multiplyByPoint(compositeMatrix, pointA, new Cesium.Cartesian3());
console.log('Original Point A:', pointA);
console.log('Rotated Point:', rotatedPoint);
// 可视化点
viewer.entities.add({
position: pointA,
point: {
pixelSize: 10,
color: Cesium.Color.RED
},
label: {
text: 'A',
font: '14px sans-serif',
horizontalOrigin: Cesium.HorizontalOrigin.LEFT
}
});
viewer.entities.add({
position: pointB,
point: {
pixelSize: 10,
color: Cesium.Color.GREEN
},
label: {
text: 'B',
font: '14px sans-serif',
horizontalOrigin: Cesium.HorizontalOrigin.LEFT
}
});
viewer.entities.add({
position: rotatedPoint,
point: {
pixelSize: 10,
color: Cesium.Color.BLUE
},
label: {
text: "A'",
font: '14px sans-serif',
horizontalOrigin: Cesium.HorizontalOrigin.LEFT
}
});
viewer.camera.flyTo({
destination: Cesium.Rectangle.fromDegrees(-180, -90, 180, 90)
});
```
---
## 🔁 变换顺序说明(重要)
Cesium 中矩阵乘法是 **右乘**,即:
```javascript
C = A * B => 先应用 B,再应用 A
```
因此:
```javascript
composite = translateBack * (rotateZ * rotateX * translateToOrigin)
```
表示:
1. 先平移至以 B 为原点
2. 绕 X 轴旋转
3. 绕 Z 轴旋转
4. 再平移回原始坐标系
---
## ✅ 总结:弃用方法与替代方案
| 被弃用的方法 | 替代方式 |
|-------------|----------|
| `Cesium.Matrix4.fromRotationX(angle)` | 使用 `Cesium.Matrix3.fromRotationX(angle)` + `Cesium.Matrix4.fromRotationTranslation({ rotation: ... })` |
| `Cesium.Matrix4.fromRotationY(angle)` | 同上,使用 `Cesium.Matrix3.fromRotationY(...)` |
| `Cesium.Matrix4.fromRotationZ(angle)` | 同上,使用 `Cesium.Matrix3.fromRotationZ(...)` |
---
###
阅读全文
相关推荐



