使用地理坐标代替笛卡尔在 Argon 和 A-Frame 中绘制
Using Geo-coordintes Instead of Cartesian to Draw in Argon and A-Frame
我想用 Argon 和 A-Frame 创建一个 GPS drawing 程序,它根据人的动作画线。
线可以在 A-Frame 中绘制,例如 meshline component 使用笛卡尔点:
<a-entity meshline="lineWidth: 20; path: -2 -1 0, 0 -2 0</a-entity>
如果我要使用 GPS 设备执行此操作,我会采用 GPS 坐标并将它们直接映射到 Google 地图之类的东西。 Argon 是否具有任何类似的功能,以便我可以像这样直接使用 GPS 坐标作为路径:
<a-entity meshline="lineWidth: 20; path: 37.32299 -122.04185 0, 37.32298 -122.03224</a-entity>
因为可以为参考帧指定一个 LLA 点,我想这样做的一种方法是将中心 LLA 点设想为“0, 0, 0”,然后使用一个函数来映射 LLA 域到笛卡尔范围。
但是,最好直接使用地理坐标。这在氩气中可能吗?
要理解答案,您需要先了解 Argon 使用的各种参考系。
首先,Argon 使用 cesiumjs.org 的地理空间数学库和 Entity 的,因此 Argon 中的所有 "locations" 都必须以地理空间方式表达或与地理空间实体相关。它们植根于地球的中心,Cesium 称之为 FIXED
坐标,但也称为 ECEF 或 ECF 坐标。在那个系统中,坐标以米为单位,up/down 穿过两极,east/west 穿过子午线(我相信)。地球表面的任何一点都用相当大的数字表示。
这个坐标系很好,因为我们可以用它精确地表示地球上或附近的任何东西。 Cesium还支持INERTIAL
坐标系,用于表示近地轨道天体,可以在两个坐标系之间进行转换。
但是,由于以下几个原因,在做 AR 时不方便:
用于表示观察者及其附近物体位置的数字非常大,即使它们非常接近,也会导致数学精度问题,尤其是在 3D 图形系统中。
当我们思考我们周围的世界时,我们 "think about" 的坐标有地面 "flat" 和 "up" 指向......好吧,向上。因此,在 3D 图形中,位于另一个对象上方的对象通常具有相同的 X 和 Z 值,但具有更大的 Y 值。在 ECEF 坐标中,所有数字都会发生变化,因为我们认为的 "up" 实际上是一个从地球中心穿过我们的矢量,如果我们在北方(或南方,取决于您的 +/-) 极点。您可能想要使用的大多数 3D 图形库(例如物理库)假设一个世界,其中地面是一个平面(通常是 XZ 平面)并且 Y 向上(一些航空和其他工程应用程序使用 Z 作为向上并以XY为地面,但问题是一样的)。
与许多地理空间 AR 系统一样,Argon 通过创建供图形和应用程序使用的本地坐标系来解决这个问题。真的有三个选项:
选择一些任意(但固定)的地方作为原点。一些专为在一个地方工作而构建的系统对此进行了硬编码。其他人让应用程序设置它。我们不这样做是因为它会鼓励应用程序走捷径,只在一个地方工作(我们过去已经看到过这种情况)。
将本地设置为相机。这样做的好处是数学最"accurate" 因为所有的点都是相对于相机表达的。但是,这会导致两个问题。首先,在 AR 应用程序中,相机往往会连续移动(即使只是由于传感器噪音)。其次,许多图书馆(同样,像物理图书馆)假设系统的起源是稳定的并且在地球上,camera/user 穿过它。这些问题是可以解决的,但对于应用程序开发人员来说,处理起来很乏味。
将局部坐标的原点设置为用户附近的任意位置,如果用户远离它,则自动重新居中。这样做的好处是程序不必做很多事情来处理它,并且它与 3D 图形库很好地结合在一起。缺点是局部坐标是任意的,每次程序可能都不一样运行。但是,应用程序开发人员可能需要注意原点何时重新居中。
Argon 使用 open 3. 当应用程序启动时,我们在用户位置创建一个新的局部坐标系,在与地球相切的平面上。如果用户远离该位置,我们会更新原点并向应用程序发出事件(目前,如果您距离原点 5 公里,我们会重新定位)。在许多简单的应用程序中,只有少数帧或参考以地理空间坐标表示(其余应用程序数据表示相对于已知地理空间位置),从地理空间到本地的转换可以在每一帧完成,允许应用程序开发人员忽略重入问题。程序员可以自由使用 ENU(东北上)或 EUS(东上南)作为他们的坐标系;我们倾向于使用 EUS,因为它与大多数 3D 图形系统使用的类似(Y 向上,Z 指向南,X 指向东)。
我们选择这种方法的原因之一是我们过去发现,如果我们有可预测的本地坐标,应用程序开发人员会使用这些坐标存储数据,即使这不是一个好主意(你的数据现在绑定到一些相对任意的特定于应用程序的坐标系,现在只能在该位置工作)。
那么,现在回答你的问题。你的问题是你想在 AFrame 中使用地理空间(铯的坐标,氩使用)坐标。简短的回答是您不能直接使用它们,因为 AFrame 是在假设本地 3D 图形坐标系的情况下构建的。 argon-aframe 包通过允许您指定 referenceframe
将 a-entity 定位在 argon/cesium 地理空间位置的组件将 aframe 绑定到 argon,并为您处理所有内部转换。
我编写代码时的假设是,作者随后会使用本地 3D 图形坐标创建他们的内容,并将这些大块图形附加到位于 referenceframe
世界中的实体的。
为了使 AFrame 中的各个坐标与地理空间位置相对应,您需要自己进行管理,可能通过创建一个组件来为您完成,或者(如果数据在开始时已知)通过转换它在前面。
这就是我要做的。
假设您有一个地理空间坐标列表(表示为 LLA),我会将每个坐标转换为局部坐标(首先从 LLA 转换为 Cesium 的 FIXED ECEF 坐标并创建一个 Cesium 实体,然后调用 Argon 的 context.getEntityPose()
在那个实体上(这将 return 它是本地坐标)。我会在集合中选择一个地理空间位置(也许是第一个?)然后从每个位置中减去它的本地坐标,以便它们全部以相对于已知地理空间位置的局部坐标表示。
然后,我将创建一个附加到该唯一地理空间实体的参考框架的 AFrame 实体,并使用相对于它表示的局部坐标在其中创建图形内容。例如,假设地理空间位置是 LongLat = "-84.398881 33.778463"
并且您将这些点(本地坐标,相对于 LongLat
)存储在 userPath
中,您可以这样做:
<ar-scene>
<ar-geopose id="GT" lla=" -84.398881 33.778463" userotation="false">
<a-entity meshline="lineWidth: 20; path: userPath; color: #E20049"></a-entity>
</ar-geopose>
</ar-scene>
我想用 Argon 和 A-Frame 创建一个 GPS drawing 程序,它根据人的动作画线。
线可以在 A-Frame 中绘制,例如 meshline component 使用笛卡尔点:
<a-entity meshline="lineWidth: 20; path: -2 -1 0, 0 -2 0</a-entity>
如果我要使用 GPS 设备执行此操作,我会采用 GPS 坐标并将它们直接映射到 Google 地图之类的东西。 Argon 是否具有任何类似的功能,以便我可以像这样直接使用 GPS 坐标作为路径:
<a-entity meshline="lineWidth: 20; path: 37.32299 -122.04185 0, 37.32298 -122.03224</a-entity>
因为可以为参考帧指定一个 LLA 点,我想这样做的一种方法是将中心 LLA 点设想为“0, 0, 0”,然后使用一个函数来映射 LLA 域到笛卡尔范围。
但是,最好直接使用地理坐标。这在氩气中可能吗?
要理解答案,您需要先了解 Argon 使用的各种参考系。
首先,Argon 使用 cesiumjs.org 的地理空间数学库和 Entity 的,因此 Argon 中的所有 "locations" 都必须以地理空间方式表达或与地理空间实体相关。它们植根于地球的中心,Cesium 称之为 FIXED
坐标,但也称为 ECEF 或 ECF 坐标。在那个系统中,坐标以米为单位,up/down 穿过两极,east/west 穿过子午线(我相信)。地球表面的任何一点都用相当大的数字表示。
这个坐标系很好,因为我们可以用它精确地表示地球上或附近的任何东西。 Cesium还支持INERTIAL
坐标系,用于表示近地轨道天体,可以在两个坐标系之间进行转换。
但是,由于以下几个原因,在做 AR 时不方便:
用于表示观察者及其附近物体位置的数字非常大,即使它们非常接近,也会导致数学精度问题,尤其是在 3D 图形系统中。
当我们思考我们周围的世界时,我们 "think about" 的坐标有地面 "flat" 和 "up" 指向......好吧,向上。因此,在 3D 图形中,位于另一个对象上方的对象通常具有相同的 X 和 Z 值,但具有更大的 Y 值。在 ECEF 坐标中,所有数字都会发生变化,因为我们认为的 "up" 实际上是一个从地球中心穿过我们的矢量,如果我们在北方(或南方,取决于您的 +/-) 极点。您可能想要使用的大多数 3D 图形库(例如物理库)假设一个世界,其中地面是一个平面(通常是 XZ 平面)并且 Y 向上(一些航空和其他工程应用程序使用 Z 作为向上并以XY为地面,但问题是一样的)。
与许多地理空间 AR 系统一样,Argon 通过创建供图形和应用程序使用的本地坐标系来解决这个问题。真的有三个选项:
选择一些任意(但固定)的地方作为原点。一些专为在一个地方工作而构建的系统对此进行了硬编码。其他人让应用程序设置它。我们不这样做是因为它会鼓励应用程序走捷径,只在一个地方工作(我们过去已经看到过这种情况)。
将本地设置为相机。这样做的好处是数学最"accurate" 因为所有的点都是相对于相机表达的。但是,这会导致两个问题。首先,在 AR 应用程序中,相机往往会连续移动(即使只是由于传感器噪音)。其次,许多图书馆(同样,像物理图书馆)假设系统的起源是稳定的并且在地球上,camera/user 穿过它。这些问题是可以解决的,但对于应用程序开发人员来说,处理起来很乏味。
将局部坐标的原点设置为用户附近的任意位置,如果用户远离它,则自动重新居中。这样做的好处是程序不必做很多事情来处理它,并且它与 3D 图形库很好地结合在一起。缺点是局部坐标是任意的,每次程序可能都不一样运行。但是,应用程序开发人员可能需要注意原点何时重新居中。
Argon 使用 open 3. 当应用程序启动时,我们在用户位置创建一个新的局部坐标系,在与地球相切的平面上。如果用户远离该位置,我们会更新原点并向应用程序发出事件(目前,如果您距离原点 5 公里,我们会重新定位)。在许多简单的应用程序中,只有少数帧或参考以地理空间坐标表示(其余应用程序数据表示相对于已知地理空间位置),从地理空间到本地的转换可以在每一帧完成,允许应用程序开发人员忽略重入问题。程序员可以自由使用 ENU(东北上)或 EUS(东上南)作为他们的坐标系;我们倾向于使用 EUS,因为它与大多数 3D 图形系统使用的类似(Y 向上,Z 指向南,X 指向东)。
我们选择这种方法的原因之一是我们过去发现,如果我们有可预测的本地坐标,应用程序开发人员会使用这些坐标存储数据,即使这不是一个好主意(你的数据现在绑定到一些相对任意的特定于应用程序的坐标系,现在只能在该位置工作)。
那么,现在回答你的问题。你的问题是你想在 AFrame 中使用地理空间(铯的坐标,氩使用)坐标。简短的回答是您不能直接使用它们,因为 AFrame 是在假设本地 3D 图形坐标系的情况下构建的。 argon-aframe 包通过允许您指定 referenceframe
将 a-entity 定位在 argon/cesium 地理空间位置的组件将 aframe 绑定到 argon,并为您处理所有内部转换。
我编写代码时的假设是,作者随后会使用本地 3D 图形坐标创建他们的内容,并将这些大块图形附加到位于 referenceframe
世界中的实体的。
为了使 AFrame 中的各个坐标与地理空间位置相对应,您需要自己进行管理,可能通过创建一个组件来为您完成,或者(如果数据在开始时已知)通过转换它在前面。
这就是我要做的。
假设您有一个地理空间坐标列表(表示为 LLA),我会将每个坐标转换为局部坐标(首先从 LLA 转换为 Cesium 的 FIXED ECEF 坐标并创建一个 Cesium 实体,然后调用 Argon 的 context.getEntityPose()
在那个实体上(这将 return 它是本地坐标)。我会在集合中选择一个地理空间位置(也许是第一个?)然后从每个位置中减去它的本地坐标,以便它们全部以相对于已知地理空间位置的局部坐标表示。
然后,我将创建一个附加到该唯一地理空间实体的参考框架的 AFrame 实体,并使用相对于它表示的局部坐标在其中创建图形内容。例如,假设地理空间位置是 LongLat = "-84.398881 33.778463"
并且您将这些点(本地坐标,相对于 LongLat
)存储在 userPath
中,您可以这样做:
<ar-scene>
<ar-geopose id="GT" lla=" -84.398881 33.778463" userotation="false">
<a-entity meshline="lineWidth: 20; path: userPath; color: #E20049"></a-entity>
</ar-geopose>
</ar-scene>