【问题标题】:How i can draw projection line from camera to 3D area?如何将投影线从相机绘制到 3D 区域?
【发布时间】:2020-02-28 09:31:48
【问题描述】:

我需要一条线作为用户界面的一部分,但它始终指向 3D 空间中的特定位置。

为此,我尝试:

            double camY, camX;
            camX = cameraX * -1;
            if(camX > 90)
                camX = 180 - camX;
            if(camX < -90)
                camX = -180 - camX;

            camY = cameraY;
            double camY2 = camY;
            if(camY > 90)
                camY2 = 180 - camY;
            if(camY < -90)
                camY2 = -180 - camY;

            double x1;
            double y1;
            double x2 = x * (90.0 - Math.abs(camY)) / 90.0,
            y2 = (y * (90.0 - Math.abs(camY)) / 90.0);
            if(vertical) {
                x1 = x2 + (y * (camY2 / 90.0) * ((90 - camX) / 90));
                y1 = (y2 * ((90 - camX) / 90)) - (x * (camY2 / 90.0));
            }else{
                x1 =  x2 + (y * (camY2 / 90.0));
                y1 = y2 - (x * (camY2 / 90.0));
                y1 = y1 * (camX / 90.0);
            }
            GL11.glVertex2d(x1, y1);
            GL11.glVertex2d(toX, toY);
            GL11.glVertex2d(toX, toY);
            GL11.glVertex2d(max, toY);

其中xy - 3D 空间上的点坐标。 cameraXcameraY - 摄像机旋转的角度。 toX`` andtoY``` 相机平面上的目标点(用户界面)。

所有这些代码在相机之前运行(

        GL11.glOrtho(-max, max, -1, 1, 10, -10);
        glRotatef(cameraX, 1f, 0f, 0);
        glRotatef(cameraY, 0f, 1f, 0); 

) 和 GL11.glMatrixMode(GL11.GL_MODELVIEW); 之前。因此,它忽略了 Z 坐标。

最初,我只有最后 4 行代码,但是当相机旋转时,整行代码都移到了它后面。所以我添加了其余的计算。

这部分解决了我的问题。

初始位置:

相机在 y 轴上旋转:

细线偏差已经可见。

相机在 x 和 y 轴上的旋转:

正如您在屏幕截图中看到的,当相机旋转时,红线仍然会移动。 我怎样才能让它总是在我需要的空间点? (在截图红圈的中心)

【问题讨论】:

    标签: java opengl lwjgl


    【解决方案1】:

    你应该:

    1. 手动将您希望线条结束的 3D 点投影到屏幕上。为此

      • 使用glGetFloatvGL_MODELVIEW_MATRIXGL_PROJECTION_MATRIX 获取模型视图和投影矩阵。
      • 将 3d 点乘以矩阵,执行透视除法,然后转换为视口坐标。
    2. 从您希望它开始的 UI 位置到您希望它结束​​的投影 2d 位置绘制一条 2d 线。

    【讨论】:

    • 感谢您的回复。你能用示例代码告诉我如何获得模型视图和投影矩阵吗?更好的是,如何获得点 X 和 Y 的乘数
    • @Aryesia 抱歉,不知道如何在 Java 中做到这一点。也不明白你所说的“积分乘数”是什么意思。
    • 我的意思是你需要乘以 X 和 Y 的数字,以便它们移动到正确的位置:)
    • @Aryesia:你熟悉线性代数吗?您将向量(3d 中的点)乘以矩阵(空间变换)。 “X 和 Y 的乘数”是您使用 glOrthoglRotate 设置的组合模型视图和投影矩阵,需要使用 glGetFloatv 检索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多