Поворот трехмерного объекта вокруг другой точки 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:

Другие вопросы по тегам