点云到屏幕点

Pointcloud to screen point

我想获取点云作为屏幕点。 我将 projectionMatrix 和 ViewMatrix 相乘。然后每个点都被单独对待。

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

 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";
                }

我找到了合适的解决方案,或者至少我认为是。我将视图矩阵与投影矩阵相乘。获取点在 4X1 矩阵中的结果。

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

为了获得归一化点,我们构建 "transformation screen" 矩阵并相乘。

最后,只需使用宽度和高度,我们就可以将 3D 点转换为屏幕坐标。

 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;
                    }