【问题标题】:ARCore – Session, Frame, Camera and PoseARCore – 会话、帧、相机和姿势
【发布时间】:2019-01-16 16:56:49
【问题描述】:

我正在学习 ARCore ReferencesDevelop,从 Coursera 制作课程,并从 Samples 阅读、理解和学习。

但我仍然缺少一些实际使用示例的定义。

什么是会话?每次我需要使用 ARCore 时,我都需要一个会话? Session 总是有一个相机连接,所以我可以在屏幕上查看和绘制/渲染我的 3D 模型?我可以在没有 Session 的情况下执行此操作吗?

Camera有getPose,Frame有GetPose,它们有什么区别?

我想过把这个问题分开,但不知何故我知道它们都是相互关联的。会话、CameraAr、帧和姿势。

【问题讨论】:

    标签: java augmented-reality arcore


    【解决方案1】:

    #关于 ArSession

    ArSession 是 AR 拼图中最关键的元素。会话管理 AR 系统状态并处理会话生命周期。 Session 类 是 ARCore API 的主要入口点。此类允许用户创建会话、配置会话、启动或停止会话,最重要的是,接收允许访问ARCamera 图像和设备姿势ArFrames

    要使用 ARCore,您需要一个 ArSession。 ARCore 不渲染 3D 模型 (Renderables)。这项工作适用于Sceneform 框架

    代码示例:

    private Session mSession;
    Config config = new Config(mSession);
    
    if (!mSession.isSupported(config)) {
        showSnackbarMessage("This phone doesn't support AR", true);
    }
    mSession.configure(config);
    

    Session 的配置也可以包含嵌套类:

    • Config.AugmentedFaceMode(选择Augmented Faces子系统的行为)
    • Config.CloudAnchorModeConfig中的云锚模式)
    • Config.FocusMode(选择camera focus 子系统的所需行为)
    • Config.LightEstimationMode(选择lighting estimation子系统的行为)
    • Config.PlaneFindingMode(选择plane detection子系统的行为)
    • Config.UpdateMode(选择update()的行为)

    #关于姿势

    Pose 表示从一个坐标空间到另一个坐标空间的不可变刚性变换。正如所有 ARCore API 所提供的,姿势总是描述从对象的局部坐标空间到世界坐标空间的转换。转换是使用围绕原点的四元数旋转和平移来定义的。

    代码示例:

    float[] position = { 0, 0, -2.2 };          //  { x, y, z } position 
    float[] rotation = { 0, 0, 0, 1 };          //  { x, y, z, w } quaternion rotation
    
    Session session = arFragment.getArSceneView().getSession();
    Anchor myAnchor = session.createAnchor(new Pose(position, rotation));
    

    #关于 ARCamera

    ARCamera 代表一个虚拟相机,它决定了观看场景的视角。如果摄像头是 ArSceneView 的一部分,则摄像头会自动跟踪来自 ARCore 的 Camera Pose。 ARCamera 是一个长期存在的对象,每次调用Session.update() 时都会更新相机的属性。 Camera 类提供有关用于捕获图像的相机的信息以及每个 ArFrame 内部的附加信息。

    代码示例:

    // Shared camera access with ARCore
    
    sharedSession = new Session(this, EnumSet.of(Session.Feature.SHARED_CAMERA))
    sharedCamera = sharedSession.getSharedCamera();
    cameraId = sharedSession.getCameraConfig().getCameraId();
    

    #关于ArFrame

    当 ARCore 对环境的理解发生变化时,它会调整其世界模型以保持事物的一致性。发生这种情况时,ARCameraARAnchors 的数字位置(坐标)可能会发生显着变化,以保持它们所代表的物理位置的适当相对位置。这些变化意味着每个 ArFrame 都应被视为完全处于独特的世界坐标空间ARAnchorsARCamera 的数字坐标决不能在检索它们的渲染帧之外使用。

    每个 ArFrame 都存储以下有关 ARCore 状态的信息::

    • RGB 图像本身
    • 跟踪状态
    • 相机相对于世界的姿势
    • 估计的照明参数
    • 对象更新信息(如点云)

    代码示例:

    private void onUpdateFrame(FrameTime frameTime) {
    
        Frame frame = arFragment.getArSceneView().getArFrame();
    
        // .............
    }
    


    另外,您可以阅读this useful post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2015-05-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多