我如何绘制从相机到 3D 区域的投影线?
How i can draw projection line from camera to 3D area?
我需要一条线作为用户界面的一部分,但它始终指向 3D 中的特定位置 space。
为此,我尝试:
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);
其中 x
和 y
- 点在 3D space 上的坐标。 cameraX
和 cameraY
- 相机旋转的角度。 toX`` and
相机平面(用户界面)上的 toY``` 目标点。
所有这些代码都在相机前运行(
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 轴上的旋转:
正如您在屏幕截图中看到的,当相机旋转时,红线仍然会移动。
我怎样才能让它在 spaces 中始终处于我需要的位置? (截图中红圈中央)
你应该:
手动将您希望线条结束的 3D 点投影到屏幕上。为此
- 使用
glGetFloatv
、GL_MODELVIEW_MATRIX
和 GL_PROJECTION_MATRIX
获取模型视图和投影矩阵。
- 将您的 3d 点乘以矩阵,执行透视除法,然后转换为您的视口坐标。
从您希望它开始的 UI 位置到您希望它结束的投影二维位置画一条二维线。
我需要一条线作为用户界面的一部分,但它始终指向 3D 中的特定位置 space。
为此,我尝试:
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);
其中 x
和 y
- 点在 3D space 上的坐标。 cameraX
和 cameraY
- 相机旋转的角度。 toX`` and
相机平面(用户界面)上的 toY``` 目标点。
所有这些代码都在相机前运行(
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 轴上的旋转:
正如您在屏幕截图中看到的,当相机旋转时,红线仍然会移动。 我怎样才能让它在 spaces 中始终处于我需要的位置? (截图中红圈中央)
你应该:
手动将您希望线条结束的 3D 点投影到屏幕上。为此
- 使用
glGetFloatv
、GL_MODELVIEW_MATRIX
和GL_PROJECTION_MATRIX
获取模型视图和投影矩阵。 - 将您的 3d 点乘以矩阵,执行透视除法,然后转换为您的视口坐标。
- 使用
从您希望它开始的 UI 位置到您希望它结束的投影二维位置画一条二维线。