数字孪生园区场景中的坐标知识
在开发数字孪生可视化项目时,经常会遇到各种坐标相关的问题可能会导致交付项目的效率降低。关于坐标,可能有这些问题:
① 什么是坐标系?低代码 ThingJS 用的是哪种坐标系?
② 在场景中需要什么信息才能确定某个对象的位置?
本期我们重点讲解一下园区场景中的坐标知识。
坐标(系)的基础概念、分类以及轴心点
基础概念及分类
从空间维度出发,坐标系大体可以分为两大类:平面坐标系、空间坐标系。坐标也会有相应的表达方式。
① 平面坐标系
② 空间(直角)坐标系
低代码 ThingJS 的坐标系是右手坐标系,即 Y 轴朝上, Z 轴朝向屏幕外,如下图:
和空间直角坐标系不同的地方是三个轴的方向不一样。把右手放在原点的位置,使大拇指、食指和中指互成直角,把大拇指指向 x 轴的正方向,食指指向 y 轴的正方向时,中指所指的方向就是 z 轴的正方向。
对比看看 3DsMax 里的坐标系:
可以看出如果要把 Max 里的坐标 [x1,y1,z1] 转换到 ThingJS 中需要 y 与 z 互换后再取反,如下图:
轴心点
园区里摆放的物体可能是规则的,也可能是不规则的。为了更好地对控制一个物体的位置并进行缩放 / 旋转,在表达一个物体的坐标时,我们会用这个物体的"轴心点"来代表这个物体的位置。简单说就是对象的轴心点就是对象自身坐标系的原点。
例如:这是园区中的一棵树,放缩时如果轴心点在地上,整棵树可以向上缩放。
如果轴心点在中心,就会不方便控制,根部会扎到地里。如下图:
再比如,一个雷达的轴心点应该旋转轴中心,以方便进行旋转的控制。如果轴心点在盖上,想一想就觉得很复杂....
坐标系的分类
基于"右手坐标系"都有哪些分类?在不同的使用场景下,选择合适的坐标系会让我们事半功倍。
1、世界坐标系
世界坐标系又称全局坐标系或绝对坐标系。当场景(注意不是指园区)创建后,在整个场景空间中标绘一个位置,此时场景空间的坐标系就是世界坐标系。
物体在世界坐标系下的坐标就是该物体的绝对坐标。
使用场景:物体是独立的,它的运动不受场景中其他物体的影响,只和整个场景有关系。
2、父物体坐标系
当在场景中创建了园区,在园区下放置一个飞机,飞机是园区的子物体,想在园区的坐标系下,设置飞机的位置,这时使用的园区的坐标系,就是飞机的父物体坐标系。
PS:当场景中只有一个园区时,以园区为参考建立的坐标系 = 世界坐标系,也就是说:飞机在世界坐标系的坐标和父物体下的坐标值是一致的。
使用场景:一个物体的运动受到另外一个物体的影响,这时就可以以“另外一个物体”为参考建立一个坐标系,作为该物体的父物体坐标系。
相对坐标
除了世界坐标系,其他所有的坐标系,其实都有"相对"的概念在里边。以任何物体为参考描述其他物体相对于该物体的空间位置即为相对坐标。
一个物体的绝对坐标只能有一个,相对坐标可以有无数个。
3、自身坐标系
有时候我们也希望在以自身作为坐标系统下控制。比如,飞机向前飞行 20 米,就是在自身坐标系下设置坐标[0,0,20](物体自身的 z 轴正向,可以理解为是物体正面的方向,比如我们面部的朝向)。
所以文章开头的问题在看到某个对象位置的坐标时比如 [5,18,10](假设坐标是 ThingJS 标准的右手坐标系下的坐标),还需要什么信息才能确定这个对象的位置呢?首先要知道,这个坐标是绝对坐标还是相对坐标。其次,如果是相对坐标,还要知道它是相对于谁的坐标。
弄清楚了以上信息,就能确定这个对象的位置。
评论