当前位置: 首页 > 面试题库 >

将3D世界(arcore锚点/姿势)转换为其相应的2D屏幕坐标

林和畅
2023-03-14
问题内容

我正在努力实现这种转变。给定锚定姿势在arcore中,如何在屏幕中获取其相应的2D坐标?


问题答案:

最终,经过几天的调查并从不同的资源中获取了信息,我才能够使它工作。以下是一个代码片段(基于arcore示例Java应用),用于将World坐标(Arcore中的位姿)转换为2D屏幕坐标:

首先,我们需要计算要从世界->屏幕转换的矩阵:

  public float[] calculateWorld2CameraMatrix(float[] modelmtx, float[] viewmtx, float[] prjmtx) {

    float scaleFactor = 1.0f;
    float[] scaleMatrix = new float[16];
    float[] modelXscale = new float[16];
    float[] viewXmodelXscale = new float[16];
    float[] world2screenMatrix = new float[16];

    Matrix.setIdentityM(scaleMatrix, 0);
    scaleMatrix[0] = scaleFactor;
    scaleMatrix[5] = scaleFactor;
    scaleMatrix[10] = scaleFactor;

    Matrix.multiplyMM(modelXscale, 0, modelmtx, 0, scaleMatrix, 0);
    Matrix.multiplyMM(viewXmodelXscale, 0, viewmtx, 0, modelXscale, 0);
    Matrix.multiplyMM(world2screenMatrix, 0, prjmtx, 0, viewXmodelXscale, 0);

    return world2screenMatrix;

}

一旦有了这个矩阵,就可以将点从3D世界投影到2D,但是在投影过程中,我们必须将NDC坐标转换为屏幕。以下是执行此转换的方法

  double[] world2Screen(int screenWidth, int screenHeight, float[] world2cameraMatrix)
  {
    float[] origin = {0f, 0f, 0f, 1f};
    float[] ndcCoord = new float[4];
    Matrix.multiplyMV(ndcCoord, 0,  world2cameraMatrix, 0,  origin, 0);

    ndcCoord[0] = ndcCoord[0]/ndcCoord[3];
    ndcCoord[1] = ndcCoord[1]/ndcCoord[3];

    double[] pos_2d = new double[]{0,0};
    pos_2d[0] = screenWidth  * ((ndcCoord[0] + 1.0)/2.0);
    pos_2d[1] = screenHeight * (( 1.0 - ndcCoord[1])/2.0);

    return pos_2d;
  }

最后,一个简单的用法示例:

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int height = displayMetrics.heightPixels;
        int width = displayMetrics.widthPixels;

        // Get projection matrix.
        float[] projmtx = new float[16];
        camera.getProjectionMatrix(projmtx, 0, 0.1f, 100.0f);

        // Get camera matrix and draw.
        float[] viewmtx = new float[16];
        camera.getViewMatrix(viewmtx, 0);

        float[] anchorMatrix = new float[16];
        anchor.getPose().toMatrix(anchorMatrix, 0);
        float[] world2screenMatrix =    
        virtualObject.calculateWorld2CameraMatrix(anchorMatrix, viewmtx, projmtx);
        double[] anchor_2d =  world2Screen(width, height, world2screenMatrix);


 类似资料:
  • 我正在进行一个处理项目,需要能够确定鼠标是否在圆内。因此,我需要获得圆的位置和鼠标的位置。但是,圆的位置已使用矩阵函数进行了修改,如和。例如: 在处理中有什么方法可以做到这一点吗?我在看留档,但似乎找不到任何功能。如果没有,我如何实现我的目标? 谢谢。

  • 假设用户单击屏幕上的任何位置,我需要将该点,例如(500200)转换为屏幕中心的极点。抽头位置(500,200)从屏幕左上角开始测量。 因此,我必须从一个原点位于屏幕左上角的笛卡尔坐标系转换为另一个原点位于屏幕中间的笛卡尔坐标系(宽度/2,高度/2),然后再从中心原点转换为一个极点。 另一种提问方式是我需要屏幕点与屏幕中心的角度。

  • 问题内容: 假设我有一个彩色图像,这自然将由python中的3维数组表示,例如形状(nxmx 3),并将其称为img。 我想要一个新的二维数组,将其称为“ narray”,其形状为(3,nxm),以便该数组的每一行分别包含R,G和B通道的“扁平化”版本。而且,它应该具有这样的属性:我可以通过类似以下方法轻松地重建任何原始通道 问题是如何从“ img”构造“ narray”?简单的img.resha

  • 我正试图在OpenGL(C++)中使一个光源跟随鼠标。在world coords中,我的屏幕中心是,我的鼠标中心是(窗口res是1280,720)。我只转换了中心的坐标,但我不知道如何转换其余的坐标。 用于转换中心坐标: 我尝试的另一个转换是 其中x和y是鼠标坐标。 到目前为止,我在网上找到的所有解决方案都不起作用。 有什么想法吗?

  • 本文向大家介绍Android屏幕锁屏弹窗的正确姿势DEMO详解,包括了Android屏幕锁屏弹窗的正确姿势DEMO详解的使用技巧和注意事项,需要的朋友参考一下 在上篇文章给大家介绍了Android程序开发仿新版QQ锁屏下弹窗功能。今天通过本文给大家分享android锁屏弹窗的正确姿势。 最近在做一个关于屏幕锁屏悬浮窗的功能,于是在网上搜索了很多安卓屏幕锁屏的相关资料,鉴于网上的资料比较零碎,所以我

  • 对于我的游戏,我需要在两个坐标系之间转换函数。这主要是一道数学题,但我需要的是C代码,以及一些解释如何解决我的问题。 屏幕坐标: a)左上角是0,0 b)无负值 c) 右=x(x值越大,右侧点越多) d) 底部=y 笛卡尔二维坐标: a) 中点为(0,0) b)减去值确实存在 c)右=x d)底部-=y(y越少,底部越点) 我需要一种简单的方法从一个系统转换到另一个系统,反之亦然。要做到这一点,(