<think>我们正在讨论Cesium.Cartesian3,这是一个用于表示三维笛卡尔坐标的类,在Cesium中广泛应用。下面我将详细介绍其功能和使用方法。
### 一、Cartesian3基础概念
`Cesium.Cartesian3`表示三维空间中的点或向量,其数学定义为:
$$ \vec{v} = (x, y, z) $$
#### 1.1 核心属性
| 属性 | 类型 | 描述 | 示例值 |
|------|--------|--------------|---------------|
| `x` | Number | X轴坐标值 | `100.0` |
| `y` | Number | Y轴坐标值 | `80.0` |
| `z` | Number | Z轴坐标值 | `-30.0` |
#### 1.2 构造函数
```javascript
// 创建三维点
const position = new Cesium.Cartesian3(x, y, z);
// 示例:创建点(100, 80, -30)
const initialPosition = new Cesium.Cartesian3(100.0, 80.0, -30.0);
```
### 二、核心运算方法
Cartesian3提供丰富的向量运算能力。
#### 2.1 向量加法
$$ \vec{a} + \vec{b} = (a_x + b_x, a_y + b_y, a_z + b_z) $$
```javascript
const sum = Cesium.Cartesian3.add(
vec1,
vec2,
new Cesium.Cartesian3() // 结果存储对象(可选)
);
```
> 示例:计算新位置[^3]
> ```javascript
> const newPosition = Cesium.Cartesian3.add(
> initialPosition,
> scaledDirection, // 缩放后的方向向量
> new Cesium.Cartesian3()
> );
> ```
#### 2.2 向量减法
$$ \vec{a} - \vec{b} = (a_x - b_x, a_y - b_y, a_z - b_z) $$
```javascript
const diff = Cesium.Cartesian3.subtract(
p2,
p1,
new Cesium.Cartesian3()
);
```
> 应用:计算两点间向量[^4]
> ```javascript
> const c1 = Cesium.Cartesian3.subtract(p2, p1, new Cesium.Cartesian3());
> ```
#### 2.3 标量乘法
$$ k \cdot \vec{v} = (k \cdot v_x, k \cdot v_y, k \cdot v_z) $$
```javascript
const scaled = Cesium.Cartesian3.multiplyByScalar(
vector,
scale,
new Cesium.Cartesian3()
);
```
#### 2.4 常用运算方法速查
| 方法名 | 数学表达 | 功能描述 |
|-------------------------|--------------------------|------------------------|
| `cross(left, right)` | $\vec{a} \times \vec{b}$ | 叉积计算 |
| `dot(left, right)` | $\vec{a} \cdot \vec{b}$ | 点积计算 |
| `magnitudeSquared(vec)` | $\|\vec{v}\|^2$ | 向量模的平方(高效版) |
| `normalize(vec)` | $\hat{v} = \frac{\vec{v}}{\|\vec{v}\|}$ | 单位化向量 |
### 三、几何计算应用
#### 3.1 计算两点距离
```javascript
const distance = Cesium.Cartesian3.distance(point1, point2);
```
#### 3.2 计算向量夹角
```javascript
const angle = Cesium.Cartesian3.angleBetween(vec1, vec2);
```
> 应用:计算垂足坐标中的夹角[^4]
> ```javascript
> const angle = Cesium.Cartesian3.angleBetween(c1, c2);
> ```
#### 3.3 坐标转换
与地理坐标互转:
```javascript
// 经纬度→Cartesian3
const cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
// Cartesian3→经纬度
const position = Cesium.Cartographic.fromCartesian(cartesian);
```
### 四、性能优化技巧
1. **复用结果对象**
在循环运算中复用Cartesian3实例减少内存分配:
```javascript
const temp = new Cesium.Cartesian3();
for (let i = 0; i < 1000; i++) {
Cesium.Cartesian3.add(pos1, pos2, temp);
// 使用temp...
}
```
2. **优先使用magnitudeSquared**
比较距离时避免开方运算:
```javascript
if (Cesium.Cartesian3.magnitudeSquared(vec) < 100) {
// 距离小于10(因为100=10²)
}
```
§§相关问题§§
1. 如何将`Cesium.Cartesian3`坐标转换为屏幕像素坐标?
2. `Cesium.Cartesian3`与`Cesium.Cartesian2`在矩阵变换中有何差异?
3. 为什么在计算投影坐标时需要同时使用`Cartesian3`和`Matrix4`?
</think>### Cesium.Cartesian3 深度解析
`Cesium.Cartesian3` 是 CesiumJS 中处理三维空间数据的核心类,用于表示笛卡尔坐标系中的点或向量。以下是其核心功能和使用方法:
---
### 一、基础概念与构造
#### 1. 数学定义
笛卡尔坐标表示为三维向量:
$$ \vec{v} = (x, y, z) $$
#### 2. 构造函数
```javascript
// 创建三维点 (x, y, z)
const position = new Cesium.Cartesian3(x, y, z);
// 示例:初始位置 (100.0, 80.0, -30.0)
const initialPosition = new Cesium.Cartesian3(100.0, 80.0, -30.0); // [^3]
```
---
### 二、核心运算方法
#### 1. 向量加法
$$ \vec{a} + \vec{b} = (a_x + b_x, a_y + b_y, a_z + b_z) $$
```javascript
const newPosition = Cesium.Cartesian3.add(
initialPosition,
directionVector,
resultStorage // 可选结果容器
);
```
> **应用场景**:根据方向和距离计算新位置[^3]
> ```javascript
> const newPosition = Cesium.Cartesian3.add(
> initialPosition,
> Cesium.Cartesian3.multiplyByScalar(direction, distance),
> new Cesium.Cartesian3()
> );
> ```
#### 2. 向量减法
$$ \vec{a} - \vec{b} = (a_x - b_x, a_y - b_y, a_z - b_z) $$
```javascript
const vectorAB = Cesium.Cartesian3.subtract(
pointB,
pointA,
new Cesium.Cartesian3()
);
```
> **应用场景**:计算两点间向量[^4]
> ```javascript
> const c1 = Cesium.Cartesian3.subtract(p2, p1, new Cesium.Cartesian3());
> ```
#### 3. 标量乘法
$$ k \cdot \vec{v} = (k \cdot v_x, k \cdot v_y, k \cdot v_z) $$
```javascript
const scaledVector = Cesium.Cartesian3.multiplyByScalar(
vector,
scaleFactor,
resultStorage
);
```
---
### 三、高级几何运算
#### 1. 向量点积(投影计算)
$$ \vec{a} \cdot \vec{b} = a_xb_x + a_yb_y + a_zb_z $$
```javascript
const dotProduct = Cesium.Cartesian3.dot(vecA, vecB);
```
#### 2. 向量叉积(法向量计算)
$$ \vec{a} \times \vec{b} = (a_yb_z - a_zb_y, a_zb_x - a_xb_z, a_xb_y - a_yb_x) $$
```javascript
const normalVector = Cesium.Cartesian3.cross(vecA, vecB, new Cesium.Cartesian3());
```
#### 3. 向量夹角计算
```javascript
const angle = Cesium.Cartesian3.angleBetween(vecA, vecB); // [^4]
```
---
### 四、坐标转换
#### 1. 地理坐标 ↔ Cartesian3
```javascript
// 经纬度 → Cartesian3
const cartesian = Cesium.Cartesian3.fromDegrees(lon, lat, height);
// Cartesian3 → 经纬度
const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
```
#### 2. 屏幕坐标 ↔ Cartesian3
```javascript
// 屏幕像素坐标 → 场景坐标
const ray = viewer.camera.getPickRay(mousePosition);
const cartesian = viewer.scene.globe.pick(ray, viewer.scene);
// 场景坐标 → 屏幕坐标
const screenPos = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
viewer.scene,
cartesian
);
```
---
### 五、性能优化技巧
1. **复用对象减少内存分配**
```javascript
const reusableVector = new Cesium.Cartesian3();
Cesium.Cartesian3.add(a, b, reusableVector); // 复用对象
```
2. **优先使用 `magnitudeSquared` 避免开方运算**
```javascript
// 比较距离时更高效
if (Cesium.Cartesian3.magnitudeSquared(vec) < 100) {
// 距离小于10
}
```
---
### 应用场景示例
#### 计算三维空间中点到直线的垂足[^4]
```javascript
computeFoot: function(p1, p2, p3) {
const vecP1P2 = Cesium.Cartesian3.subtract(p2, p1, new Cesium.Cartesian3());
const vecP1P3 = Cesium.Cartesian3.subtract(p3, p1, new Cesium.Cartesian3());
const angle = Cesium.Cartesian3.angleBetween(vecP1P2, vecP1P3);
const distP1P3 = Cesium.Cartesian3.distance(p1, p3);
const projectLength = distP1P3 * Math.cos(angle);
const unitVec = Cesium.Cartesian3.normalize(vecP1P2, new Cesium.Cartesian3());
const projectVec = Cesium.Cartesian3.multiplyByScalar(unitVec, projectLength, new Cesium.Cartesian3());
return Cesium.Cartesian3.add(p1, projectVec, new Cesium.Cartesian3());
}
```
---