x,y,z полярные координаты в сфере

В настоящее время я использую следующую математику, чтобы получить координаты x, y, z с предполагаемой гипотенузой 150 и моим известным шагом и креном рыскания.

float zPos = (float)Math.tan(Math.toRadians(rmPitch-90))*150;
float xPos = (float)Math.cos(Math.toRadians(90-rmYaw))*150;
float yPos = (float)Math.cos(Math.toRadians(rmYaw))*150;

Предположим, что зритель стоит в точке 0,0,0 и смотрит вверх на точку P. Q находится на расстоянии 150 единиц, и я знаю угол рыскания и угол обзора);

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

Предположим, что зритель стоит на 0,0,


person erik    schedule 19.05.2013    source источник
comment
Не могли бы вы превратить это в чисто математический вопрос и задать его на math.stackexchange.com?   -  person christopher    schedule 20.05.2013
comment
извините, не думал, что будет проблема с размещением его здесь и пометкой как математические, полярные координаты   -  person erik    schedule 20.05.2013
comment
Если кто-то может ответить, больше силы для вас. Я просто думаю, что это больше вопрос, основанный на математике, чем проблема программирования.   -  person christopher    schedule 20.05.2013
comment
Вы смотрели сферические координаты в википедии?   -  person John Alexiou    schedule 20.05.2013


Ответы (4)


Самый простой способ подумать об этом — представить единичный круг, встроенный в плоскость, содержащую P и ось z. Там вектор Q — одна сторона треугольника, а PQ — другая. Итак, вооружившись этой картинкой в ​​голове:

Во-первых, z должен быть cos(pitch), а не tan(pitch). Затем, чтобы скорректировать x, y для высоты тона, умножьте их на sin(pitch).

Обратите внимание, что это предполагает, что вы действительно хотели, чтобы фи/шаг был углом между осью z и вектором (а не более стандартным углом между плоскостью xy и вектором).

person dsharlet    schedule 19.05.2013

Существует проблема с углами Эйлера (то есть системой координат Азимут, Шаг, Крен), когда шаг составляет плюс/минус 90 градусов. Кажется, это то, о чем вы говорите, и оно известно как Grimbal Lock. Недавно я задал и затем ответил на вопрос об этом на math.stackexchange.com, поэтому, возможно, эта ссылка поможет.

person Stochastically    schedule 19.05.2013
comment
я знаю об этом, сэр ... и на самом деле я использую матрицу вращения и слияние датчиков акселерометра, гироскопа и компаса для создания матрицы, я просто использовал эйлеры, извлеченные из матрицы, для хранения полярных координат в базе данных - person erik; 20.05.2013
comment
Хорошо, мой комментарий о Grimbal Lock — это просто реакция на ваше заявление о проблемах, когда высота звука приближается к прямой вверх и вниз. В таком случае я не уверен, какая у вас проблема. Возможно, вам следует сформулировать немного более четко, например. явно указывая символы для тангажа и крена рыскания и говоря, какая у вас проблема. Обратите внимание, что просто для представления местоположения точки на сфере вам нужны только два угла, а не три. - person Stochastically; 20.05.2013

Поскольку фи — это угол между P и осью z, координата z должна быть rho*cos(phi). Точно так же x равно rho*sin(phi)cos(theta), y равно rho*sin(phi)sin(theta)

person xuanji    schedule 20.05.2013
comment
что такое тета? я предполагаю, что ро - это длина бирюзовой линии - person erik; 21.05.2013
comment
тета - это угол θ на вашей диаграмме - person xuanji; 21.05.2013
comment
ах, и теперь я вижу, что изображение, которое я разместил, на самом деле указывает на φ в неправильном месте.. вместо того, чтобы быть между z и p, я фактически получаю угол между p и y - person erik; 21.05.2013

dsharlet, использование загара (шаг-90), похоже, работает так, как я ожидал ... если я переключусь на потому, что я должен это сделать (шаг + 180), но, следуя вашему совету, следующий код, похоже, работает ... я должен перевернуть и ось или что-то странное.. можете немного рассказать о разнице между tan(pitch-90) и cos(pitch+180)

float zPos = (float)Math.cos(Math.toRadians(rmPitch+180))*radius;
float xPos = (float)Math.cos(Math.toRadians(90-rmYaw))*(float)Math.sin(Math.toRadians(rmPitch))*radius;
float yPos = (float)Math.cos(Math.toRadians(rmYaw))*(float)Math.sin(Math.toRadians(rmPitch))*radius;
person erik    schedule 21.05.2013