Использование поворота камеры для отображения квадратора перед камерой (c ++ / opengl) - PullRequest
2 голосов
/ 27 июня 2011

Я пытаюсь сделать так, чтобы четырехугольник всегда появлялся перед камерой, я пытаюсь начать с выравнивания его с камерой на плоскости x-z и быть уверенным, что он всегда обращен к камере. Я использовал этот код ...

float ry = cameraRY+PI_2;
float dis = 12;
float sz = 4;

float x = cameraX-dis*cosf(ry);
float y = cameraY;
float z = cameraZ-dis*sinf(ry)+cosf(ry)*sz;

float x2 = x + sinf(ry)*sz;
float y2 = y + sz;
float z2 = z - cosf(ry)*sz;

glVertex3f(x,y,z);
glVertex3f(x2,y,z2);
glVertex3f(x2,y2,z2);
glVertex3f(x,y2,z);

Но это выглядело не совсем правильно, казалось, что квад вращался вокруг невидимой точки, которая правильно вращалась вокруг камеры. Я действительно не знаю, как это изменить или как это сделать, любая помощь приветствуется!

Редактировать: забыл упомянуть, cameraX, cameraY, cameraZ - координаты x, y, z камеры

cameraRX и cameraRY - это повороты x и y камеры (вращение Z всегда равно нулю)

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Ознакомьтесь с этим старым учебником на Lighthouse3D.Он описывает несколько техник «билбординга», которые, я полагаю, вам нужны.

0 голосов
/ 27 июня 2011

Пусть P - матрица проекции вида модели, а c - центр четырехугольника, который вы пытаетесь нарисовать.Вы хотите найти пару векторов u, v, которые определяют ребра вашего четырехугольника,

Q = [ c-u-v, c-u+v, c-u-v, c+u-v ]

, так что u указывает прямо вниз в координатах клипа, а v указывает вправо:

P(u) = (0, s, 0, 0)
P(v) = (s, 0, 0, 0)

Где s - желаемый масштаб вашего четырехугольника.Предположим, что P записано в блочной диагональной форме,

    [   M   | t ]
P = [-----------]
    [ 0 0 1 | 0 ]

Тогда пусть m0, m1 будут первыми двумя строками M. Теперь рассмотрим уравнение, которое мы получили для P (u), подставив и упростив, получим:

              [ 0 ]
P(u) ~> M u = [ s ]
              [ 0 ]

Что приводит к следующему решению для u, v:

u = s * m1 / |m1|^2
v = s * m0 / |m0|^2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...