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