Cesium中gltf模型的坐标系

Cesium中使用gltf格式的模型,而gltf格式的模型的坐标系在加载到Cesium中后,Cesium会自动变换坐标系。

本文简要阐述gltf模型的坐标系加载前后的变化。

gltf模型

可以使用各种3D制图工具来进行模型的制作,例如3dsMax,Maya,Blender。在Blender中不仅可以制作模型,而且具备导出模型为gltf格式的功能。

我们可以使用visual studio code来打开gltf模型,不过需要gltf插件:gltf Tools,此处不再详述。

在vsc中可以可视化的方式显示三维模型,目前具备"Babylon.js",“Cesium”,"Filament"和"Three.js"四种插件的加载方式。使用"Babylon.js"浏览时,通过调试方式,可打开模型的节点及坐标系相关。

下图为Cesium官方的地面车的模型使用vsc打开的效果:

  • __root__下面的"GroundVehicle"即为地面车的最顶层的节点,名称为"GroundVehicle",由gltf文件中定义;
  • 下方TRANSFORMATIONS可手动调整模型的平移,旋转,缩放,可实时看到调整的效果。此坐标系即为模型最顶层节点的坐标系,我们称为模型坐标系。
    vsc中的gltf模型
    通常在gltf模型制作中,模型坐标系的常规定义为:
  • 模型的顶部,为Y轴;
  • 模型的前面,为Z轴;
  • 由X,Y轴和右手定则确定X轴。
    所谓模型的顶部,一般符合人们对模型的常识,如车子顶部,房子的上部等;

Cesium中的坐标系

当Cesium中加载gltf模型时,会自动将模型的Y轴转Z轴朝上和Z轴转X轴朝前,加载前后效果图如下:
模型坐标系和Cesium坐标系
也就是说,在Cesium中,凡是涉及模型的旋转等操作,均针对Cesium坐标系!!!,这点请务必和模型坐标系区分开来,具体对应为:

  1. Cesium坐标系X轴:模型坐标系Z轴
  2. Cesium坐标系Y轴:模型坐标系X轴
  3. Cesium坐标系Z轴:模型坐标系Y轴

下面为一简单的例子,代码如下,仅加载一个地面车,无任何旋转,那么地面车的坐标系(Cesium坐标系)应与地球Fixed系(在Cesium中,地球Fixed系为世界坐标系,所有对象均要表示在此坐标系)重合。

var veh = viewer.entities.add({
  //  地球Fixed系中,经度、纬度均为0
  position: Cesium.Cartesian3.fromDegrees(0, 0, 0),
  //  模型相对地球Fixed系无任何转动
  orientation: new Cesium.Quaternion(0,0,0,1),
  model: {
    uri: "../../Apps/SampleData/models/GroundVehicle/GroundVehicle.glb",
    minimumPixelSize: 200
  }});

加载的效果如下图
模型不旋转
下图为Cesium中的卫星的模型坐标系和Cesium坐标系区别
Cesium Satellite gltf

cesium中的gltf模型的坐标轴显示

Cesium中提供了加载gltf模型后显示Cesium坐标轴的功能: Cesium Inspector。在 Cesium 调试器面板中勾选显示参考框架,能够很清晰地看到该模型对应的X、Y、Z轴以及原点。

显示Cesium Inspector插件的代码一句话:

viewer.extend(Cesium.viewerCesiumInspectorMinxin);

下图为Inspector面板和模型的Cesium坐标轴显示,重点:

  • X轴:前方,红色
  • Y轴:左方,绿色
  • Z轴:上方,蓝色

Cesium Inspector

### GLTF 模型坐标系定义及转换方法 #### 1. GLTF 模型坐标系定义 GLTF (Graphics Language Transmission Format) 是一种用于传输和加载3D场景和模型的开放标准格式。其默认使用的是一种右手坐标系,其中 X 轴指向右方,Y 轴指向上方,而 Z 轴则指向观察者的反方向(即屏幕深处)。这种约定使得 GLTF 成为了许多现代图形库的标准支持格式之一[^1]。 在实际应用中,当使用 Three.js 或其他渲染框架加载 GLTF 文件时,默认情况下会遵循上述右手坐标系设定。如果目标环境采用不同的坐标系,则需要进行必要的转换操作来适配特定需求。 #### 2. 坐标系之间的转换原理 不同平台可能具有各自独特的坐标系统表示方式。例如,在某些地理信息系统(GIS),像 Cesium 中所运用的是基于地球表面曲率构建起来的一套空间定位体系——WGS84椭球体上的经度、纬度以及高度值组合而成的位置描述形式[^2]。因此,从 GLTF 的本地化三维直角座标过渡至全球范围内的经纬高表达就需要经历一系列变换过程: - **第一步**:通过 `Cesium.Cartesian3` 将给定位置参数转化为对应于该点处局部切平面下的欧几里得向量; - **第二步**:利用 `Cesium.Transforms.eastNorthUpToFixedFrame()` 创建固定帧矩阵,此步骤确立了一个新的参照系,让后续加入的对象能够按照预期方位呈现出来[^3]; - **第三步**(可选):调整物体自身的旋转属性以匹配期望的姿态表现,这通常涉及到设置合适的 heading(航向角)、pitch(俯仰角) 和 roll(翻滚角)。 对于那些希望维持原有姿态而不额外指定 orientation 参数的情况而言,Cesium 自动完成了一部分标准化处理工作,具体表现为将输入数据映射到 ENU(East-North-Up) 方位之后再进一步修正内部结构使之符合常规视觉习惯,也就是最终呈现出面向东方前进且左侧面朝北方的结果。 另外值得注意的是存在另一种不太常见的扩展版本叫做 Cartesian4 ,它增加了权重维度 w 来辅助计算加权平均等相关运算但并不改变基础的空间布局逻辑[^4]。 ```javascript // 示例代码展示如何在 Cesium 中正确导入并定向一个 GLTF 模型 var viewer = new Cesium.Viewer('cesiumContainer'); viewer.scene.primitives.add(new Cesium.GltfPrimitive({ url : './path/to/model.glb', })); var origin = Cesium.Cartesian3.fromDegrees(-75.1641667, 39.9522222); var hpr = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(45), 0, 0); var modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame( origin, hpr ); viewer.entities.add({ position : origin, model : { uri : './path/to/model.glb', modelMatrix : modelMatrix } }); ``` 以上脚本片段演示了怎样精确控制引入模型的方向角度等问题解决方案的一部分实现细节。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值