首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >点云到屏幕点

点云到屏幕点
EN

Stack Overflow用户
提问于 2017-12-08 14:49:33
回答 1查看 404关注 0票数 1

我想获得点云作为屏幕点。我把projectionMatrix和ViewMatrix相乘。然后每个点分别处理。

我真的不知道我做错了什么。有什么帮助吗?

代码语言:javascript
复制
 for (int i = 0; i < pointCloud.getPoints().remaining() / 4; i = i + 4) {
                    float x = pointCloud.getPoints().get(i);
                    float y = pointCloud.getPoints().get(i + 1);
                    float z = pointCloud.getPoints().get(i + 2);
                    float p = pointCloud.getPoints().get(i + 3);

                    float[] pointC = new float[]{x, y, z, 1.0F};
                    float[] screenPoint = new float[4];

                    float[] viewProjMtx = new float[16];
                    Matrix.multiplyMM(viewProjMtx, 0, projmtx, 0,viewmtx , 0);
                    Matrix.multiplyMV(screenPoint, 0,viewProjMtx , 0, pointC, 0);
                    float screenX = (result[0]+1)/2*1080;
                    float screenY = 2220-((result[1]+1)/2*2220);
                    String str = screenX+" "+screenY+"\r";
                }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-26 17:19:35

我找到了一个合适的解决方案,至少我认为是这样。我将视图矩阵与投影矩阵相乘。在4X1矩阵中得到的点的结果。

我们得到了一个4x1矩阵,它必须用w除以得到透视投影。

为了得到归一化点,我们建立了“变换屏幕”矩阵并进行乘法。

最后,只要使用宽度和高度,我们就可以将3D点放到屏幕坐标中。

代码语言:javascript
复制
 for (int i = 0; i < pointCloud.getPoints().remaining() ; i = i + 4) {
                        float x = pointCloud.getPoints().get(i);
                        float y = pointCloud.getPoints().get(i + 1);
                        float z = pointCloud.getPoints().get(i + 2);
                        float p = pointCloud.getPoints().get(i + 3);

                        float[] pointC = new float[]{x, y, z, 1.0F};
                        float[] res = new float[4];
                        float[] vpMatrix = new float[16];

                        Matrix.multiplyMM(vpMatrix, 0, projmtx, 0, viewmtx, 0);
                        Matrix.multiplyMV(res, 0, vpMatrix, 0, pointC, 0);

                        float[] mPp = new float[4];
                        mPp[0] = res[0] / res[3];
                        mPp[1] = res[1] / res[3];
                        mPp[2] = res[2] / res[3];
                        mPp[3] = 1;

                        float[] mVp = new float[16];
                        float[] ere = new float[4];

                        mVp[0] = 0.5f;
                        mVp[1] = 0;
                        mVp[2] = 0;
                        mVp[3] = 0;

                        mVp[4] = 0;
                        mVp[5] = -0.5f;
                        mVp[6] = 0;
                        mVp[7] = 0;

                        mVp[8] = 0;
                        mVp[9] = 0;
                        mVp[10] = 0.5f;
                        mVp[11] = 0;

                        mVp[12] = 0.5f;
                        mVp[13] = 0.5f;
                        mVp[14] = 0.5f;
                        mVp[15] = 1;
                        Matrix.multiplyMV(ere, 0, mVp, 0, mPp, 0);

                        float width = 1080;
                        float height = 1920;
                        float winX = ere[0] * width;
                        float winY = ere[1] * height;
                    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47716702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档