Мне нужна строка, которая будет частью пользовательского интерфейса, но она всегда указывает на конкретное c место в трехмерном пространстве.
Для этого я пытаюсь:
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
- координата точки в трехмерном пространстве. 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 :
Как видно на скриншотах, красная линия все еще смещается при вращении камеры. Как я могу сделать так, чтобы он всегда был в нужной точке в пространстве? (В центре красный кружок на скриншотах)