Cartesian3

该博客介绍了如何利用Cesium的Cartesian3.fromDegrees方法,从经度、纬度和高度创建3D坐标点。这个静态方法将度转换为Cartesian3位置。

new Cesium.Cartesian3(x, y, z)

A 3D Cartesian point.

Name Type Default Description
x Number 0.0 optional The X component.
y Number 0.0 optional The Y component.
z Number 0.0 optional The Z component.

Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result) → Cartesian3

static

Returns a Cartesian3 position from longitude and latitude values given in degrees.

Name Type Default Description
long
<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()); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值