Расчет линии от начальной точки и угла в 3d - PullRequest
0 голосов
/ 31 декабря 2011

У меня есть точка в трехмерном пространстве и два угла, я хочу вычислить результирующую линию на основе этой информации. Я нашел, как сделать это с 2D линиями, но не 3D. Как это можно рассчитать?

Если это поможет: я использую C ++ и OpenGL и у меня есть местоположение щелчка мышью пользователя и угол наклона камеры, я хочу проследить эту линию для пересечений.

Ответы [ 2 ]

2 голосов
/ 31 декабря 2011

В терминах триггера для определения линии в трехмерном пространстве требуются два угла и точка. Преобразование этого в (x, y, z) является просто полярными координатами в декартовых координатах уравнения:

x = r sin (q) cos (f)

y = r sin (q) sin (f)

z = r cos (q)

Где r - расстояние от точки P до начала координат; угол q (зенит) между линией OP и положительной полярной осью (можно рассматривать как ось z); и угол f (азимут) между исходным лучом и проекцией OP на экваториальную плоскость (обычно измеряется от оси x).

Edit:

Хорошо, это была первая часть того, что вы спрашиваете. В остальном, реальный вопрос после его обновления гораздо сложнее, чем просто создание линии из двух углов и точки в трехмерном пространстве. Это включает использование матрицы преобразования камеры в мир и было рассмотрено в других вопросах SO. Для удобства вот один из них: Как преобразовать мировые координаты в координаты камеры? Ответы охватывают преобразование из мира в камеру и из камеры в мир.

2 голосов
/ 31 декабря 2011

Линия может быть понята как точка во «времени». Уравнение должно быть векторизованным или иметь направление, чтобы иметь смысл, поэтому время - это естественный способ думать об этом. Таким образом, уравнение линии в 3-х измерениях действительно может быть тремя двумерными уравнениями x, y, z, связанными со временем, такими как:

x = ax*t + cx
y = ay*t + cy
z = az*t + cz

Чтобы найти этот набор уравнений, предполагая, что камера находится в начале координат, (0,0,0), а ваша точка равна (x1, y1, z1), тогда

ax = x1 - 0
ay = y1 - 0
az = z1 - 0

cx = cy = cz = 0

так

x = x1*t 
y = y1*t 
z = z1*t 

Примечание: здесь также предполагается, что «скорость» линии или вектора такова, что она находится в вашей точке (x1, y1, z1) через 1 секунду.

Таким образом, чтобы нарисовать эту линию, просто заполните точки настолько хорошо, насколько вам нравится, так долго, как требуется, например, каждые 1/1000 секунды в течение 10 секунд или чего-то еще, может нарисовать «линию», действительно серию точки, которые при взгляде с расстояния отображаются в виде линии с расстоянием более 10 секунд, определяемым выбранной вами «скоростью».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...