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

java– 将3D世界(arcore锚姿势)转换为相应的2D屏幕坐标,第1张

概述我正在努力实现这种转变.给定arcore中的锚Pose如何在屏幕中获得相应的2D坐标?解决方法:最后,经过几天的调查并从不同的资源获取信息后,我才能使其正常运行.以下是一个代码片段(基于arcore示例java应用程序),可以从世界坐标(在arcore中的姿势)转换为2D屏幕坐标:首先,我们需要计算从世

我正在努力实现这种转变.给定arcore中的锚Pose如何在屏幕中获得相应的2D坐标?

解决方法:

最后,经过几天的调查并从不同的资源获取信息后,我才能使其正常运行.以下是一个代码片段(基于arcore示例java应用程序),可以从世界坐标(在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);
总结

以上是内存溢出为你收集整理的java – 将3D世界(arcore锚/姿势)转换为相应的2D屏幕坐标全部内容,希望文章能够帮你解决java – 将3D世界(arcore锚/姿势)转换为相应的2D屏幕坐标所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1112488.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存