Поворот трехмерного объекта вокруг другой точки C#
Прежде всего, извиняюсь за грубый рисунок, я отнюдь не хорошо разбираюсь в трехмерных манипуляциях и имею только очень базовое понимание матриц, поэтому, пожалуйста, объясните все как можно более ясно и не делайте предположений относительно моего уровня знаний.
В настоящее время я собираю данные о долготе и широте и преобразовываю их в декартовы X,Y и Z со следующей функцией:
public CartesianXYZ LonLat2Cartesian(double lon, double lat)
{
CartesianXYZ XYZ = new CartesianXYZ();
var R = 6371000;
XYZ.X = Convert.ToInt32(R * Math.Cos(lat) * Math.Cos(lon));
XYZ.Y = Convert.ToInt32(R * Math.Sin(lat) * Math.Cos(lon));
XYZ.Z = Convert.ToInt32(R * Math.Sin(lat));
return XYZ;
}
Нанося их на график, я обнаружил, что ось Y довольно значительно меняется, хотя эти точки очень близки друг к другу, я предполагаю, что это связано с тем, что мы сидим на сфере и если я не был на севере полюс, это будет считаться наклонным, тем более, что ближе к экватору я был. (Если это не так, пожалуйста, дайте мне знать)
Пожалуйста, смотрите ниже три точки, нанесенные на графике трехмерного рассеяния
Точка А будет считаться "центральной" точкой, где пользователь
Точка B - это точка, расположенная непосредственно к югу от пользователя.
Точка C - это точка, расположенная непосредственно к северу от пользователя.
Я надеюсь добиться того, чтобы повернуть точки B и C вокруг точки A, чтобы их значения Y были одинаковыми, и я могу считать график двухмерным представлением точек, которое я нашел, просто изменив Y на то же, что и в итоге. с довольно искаженной версией очков.
Конечная цель - использовать заголовок пользователя и выяснить, находится ли какая-либо из точек в пределах его поля зрения (для дополненной реальности).
Любая помощь, полезная критика или ссылки на полезные статьи будут с благодарностью.
1 ответ
Вы получили неправильное уравнение (не заметили его раньше:)) оно должно быть:
public CartesianXYZ LonLat2Cartesian(double lon, double lat)
{
CartesianXYZ XYZ = new CartesianXYZ();
var R = 6371000;
XYZ.X = Convert.ToInt32(R * Math.Cos(lat) * Math.Cos(lon));
XYZ.Y = Convert.ToInt32(R * Math.Cos(lat) * Math.Sin(lon));
XYZ.Z = Convert.ToInt32(R * Math.Sin(lat));
return XYZ;
}
Кстати, это просто сфера, которой не является наша планета, если вам нужен более точный результат, используйте WGS84: