要理解答案,您需要首先了解 Argon 使用的各种参考系。
首先,Argon 利用 cesiumjs.org 的地理空间数学库和实体,因此 Argon 中的所有“位置”必须以地理空间方式表示或相对于地理空间实体。它们植根于地球的中心,也就是铯所说的FIXED
坐标,但也称为 ECEF 或 ECF 坐标。在该系统中,坐标以米为单位,上/下穿过两极,东/西穿过子午线(我相信)。地球表面的任何点都用相当大的数字表示。
这个坐标系很好,因为我们可以使用它精确地表示地球上或地球附近的任何物体。铯还支持INERTIAL
坐标,用于表示近地轨道物体,并且可以在两个坐标系之间进行转换。
但是,由于以下几个原因,做 AR 时很不方便:
用于表示观看者及其附近物体位置的数字非常大,即使它们非常接近,这可能会导致数学准确性问题,尤其是在 3D 图形系统中。
当我们思考周围的世界时,我们“思考”的坐标将地面视为“平坦”,将“向上”视为指向......好吧,向上。因此,在 3D 图形中,另一个对象上方的对象通常具有相同的 X 和 Z 值,但 Y 值更大。在 ECEF 坐标中,所有数字都会发生变化,因为我们感知的“向上”实际上是从地球中心穿过我们的矢量,并且只有当我们在北方(或南方,取决于您的+)时才是“向上” /-) 极。您可能想要使用的大多数 3D 图形库(例如物理库)都假设一个世界,其中地面是一个平面(通常是 XZ 平面)并且 Y 向上(一些航空和其他工程应用使用 Z 作为向上)并以 XY 作为地面,但问题是相同的)。
与许多地理空间 AR 系统一样,Argon 通过创建一个供图形和应用程序使用的本地坐标系来解决这个问题。实际上有三种选择:
选择一些任意(但固定)的本地地点作为原点。有些系统是为在一个地方工作而构建的,对此进行了硬编码。其他人让应用程序设置它。我们不这样做是因为它会鼓励应用程序采取简单的路径并且只在一个地方工作(我们过去已经看到过这种情况)。
将本地位置设置为相机。这样做的优点是数学是最“准确”的,因为所有点都是相对于相机表示的。但是,这会导致两个问题。首先,在 AR 应用程序中,相机往往会连续移动(即使只是由于传感器噪声)。其次,许多库(同样,像物理库)假设系统的起源是稳定的并且在地球上,相机/用户在其中移动。这些问题可以解决,但对于应用程序开发人员来说处理起来很乏味。
将本地坐标的原点设置为用户附近的任意位置,如果用户远离它,则自动居中。这样做的优点是程序不必做太多处理来处理它,并且它与 3D 图形库很好地配合。缺点是局部坐标是任意的,并且每次运行程序时都可能不同。但是,应用程序开发人员可能必须注意原点何时居中。
Argon 使用 open 3。当应用程序启动时,我们在用户位置(与地球相切的平面上)创建一个新的局部坐标系。如果用户远离该位置,我们会更新原点并向应用程序发出一个事件(目前,如果您距离原点 5 公里,我们会重新居中)。在许多简单的应用程序中,只有几个帧或以地理空间坐标表示的参考(以及相对于已知地理空间位置表示的其余应用程序数据),从地理空间到本地的转换只需在每个帧中完成,从而允许应用程序开发人员忽略重入问题。程序员可以自由使用 ENU(东北上)或 EUS(东上南)作为坐标系;我们倾向于使用 EUS,因为它与大多数 3D 图形系统使用的类似(Y 向上,Z 指向南,X 指向东)。
我们选择这种方法的原因之一是,我们过去发现,如果我们有可预测的本地坐标,应用程序开发人员将使用这些坐标来存储数据,即使这不是一个好主意(您的数据现在与一些相对任意的坐标相关联)应用程序特定的坐标系,现在只能在该位置工作)。
那么,现在回答你的问题。您的问题是您想在 AFrame 中使用地理空间(铯的坐标,argon 使用的)坐标。简而言之,您不能直接使用它们,因为 AFrame 是假设本地 3D 图形坐标系构建的。 argon-aframe 包通过允许您指定将 aframe 绑定到 argonreferenceframe
将 a 实体定位在氩/铯地理空间位置的组件,并为您处理所有内部转换。
当我编写该代码时,假设作者将使用本地 3D 图形坐标创建内容,并将这些图形块附加到位于世界中的实体上referenceframe
's.
为了使 AFrame 中的各个坐标与地理空间位置相对应,您需要自己进行管理,也许可以通过创建一个组件来为您完成此操作,或者(如果数据在开始时已知)通过预先转换它。
这就是我要做的。
假设您有一个地理空间坐标列表(表示为 LLA),我会将每个坐标转换为本地坐标(首先从 LLA 转换为 Cesium 的 FIXED ECEF 坐标并创建一个 Cesium 实体,然后调用 Argon 的context.getEntityPose()
在该实体上(这将返回它的本地坐标)。我会在集合中选择一个地理空间位置(也许是第一个?),然后从每个位置中减去它的本地坐标,以便它们都以相对于该已知地理空间位置的本地坐标表示。
然后,我将创建一个附加到该唯一地理空间实体的参考框架的 AFrame 实体,并使用相对于它表示的本地坐标在其中创建图形内容。例如,假设地理空间位置是LongLat = "-84.398881 33.778463"
并且您存储了这些点(本地坐标,相对于LongLat
) in 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>