#r #geometry #coordinate-transformation #lidar
#r #геометрия #преобразование координат #лидар
Вопрос:
Я работаю над своей магистерской диссертацией по моделированию полусферических фотографий из лидарных данных. Итак, моя главная цель — спроецировать 3D-точки (X, Y, Z), которые находятся в декартовой системе координат, в стереографическую проекцию (см. Рисунок 1, из: здесь). Система координат моего Pointcloud преобразуется так, что центральная точка расположена a (0,0,0), а все z-значения положительны.
Я программирую в RStudio, и я сначала попытался получить сферическую проекцию облака точек, используя формулу для декартовых сферических координат, перечисленных в википедии.
r <- sqrt(x^2 y^2 z^2)
theta <- acos(z/r)
phi <- atan2(y,x)
Я также пытался сделать это с помощью функции cart2sph из RPackage pracma, которая должна делать то же самое. Но, к сожалению, результаты обоих методов выглядят совсем не так, как я хотел, чтобы они были. Точки не помещаются на плоскую полусферу, а просто кажутся ориентированными вдоль оси z (см. Рисунок 2).
Есть ли у кого-нибудь предложения, как добиться стереографической проекции облака лидарных точек в RStudio? Может быть, есть даже пакет с некоторыми функциями для преобразования координат? К сожалению, у меня не так много опыта программирования, я был бы очень благодарен за любую помощь.
Редактировать
Я наношу декартовы точки на полушарие, используя сценарий Allans. Результат выглядит следующим образом с использованием программного обеспечения Cloudcompare:
Изображение: Полушарие
Я также выполнил стереографическую проекцию с преобразованными декартовыми координатами:
x2 <- (x / (1 z))
y2 <- (y / (1 z))
project_2d <- data.frame(x2, y2)
Изображение:
Стереографическая проекция
Тем не менее, мне интересно, почему внешний край графиков не соответствует идеальному кругу, поскольку все стволы деревьев имеют одинаковое значение min (z) (я использовал рамку отсечения).). Таким образом, все стволы деревьев должны выстраиваться на «экваторе» полушария. У вас есть какие-либо подсказки?
Комментарии:
1. Привет, Радде. Похоже, что все ваши точки находятся на плоскости y-z (хотя на этом конкретном изображении это трудно определить). Вы уверены, что преобразованные переменные неверны на этой плоскости?
2. эй, точки ориентированы вдоль плоскости x-z, а нулевая точка x разделяет облако точек на две половины. Но все же я не вижу никакого сферического преобразования в моем результате.
3. Если я понимаю, вы проецируете сцену на полусферу, затем последнюю на плоскость с помощью стереографии. Что вы показываете нам на рисунке 2 (псевдоним 4)?
4. И почему вы упоминаете сферическую проекцию и показываете формулы преобразования в сферические координаты ?
5. Привет, Ив, спасибо за твой ответ. Я хочу сначала спроецировать свои локальные точки из картезианской системы координат на сферическую полуплоскость, а затем на стереографическую 2D-плоскость (как показано на рисунке 1). Разве для этого мне не нужно преобразование в сферические координаты?
Ответ №1:
Сложно показать этот результат в 3D, но я постараюсь изо всех сил.
Предположим, у нас есть набор точек в форме креста, подвешенных над камерой, параллельных земле:
x <- c(rep(seq(-10, 10, 1), 2), rep(-1, 21), rep(1, 21))
y <- c(rep(-1, 21), rep(1, 21), rep(seq(-10, 10, 1), 2))
z <- rep(3, 84)
Мы можем попытаться показать это rgl
, добавив красную точку для обозначения положения камеры:
library(rgl)
plot3d(x, y, z, zlim = c(0, 10))
points3d(0, 0, 0, col = "red")
Используя формулу, которую вы нашли для преобразования в сферические координаты, мы можем преобразовать эти 3D-точки из x, y, z в тета, phi и r. Однако, чтобы спроецировать их на полусферу в декартовых координатах, нам нужно иметь r на фиксированном расстоянии от камеры. Затем нам нужно вычислить координаты x, y, z точек на этом полушарии из тета, phi и фиксированного r. Эта функция должна это сделать:
projection <- function(x, y, z) {
r <- sqrt(x^2 y^2 z^2)
theta <- acos(z / r)
phi <- atan2(y, x)
y <- theta * cos(phi)
x <- theta * sin(phi)
z <- sqrt((pi / 2)^2 - x^2 - y^2)
data.frame(x, y, z)
}
Итак, теперь, когда мы делаем:
df <- projection(x, y, z)
Мы можем снова построить график, чтобы показать точки, спроецированные на полусферу:
plot3d(df$x, df$y, df$z, zlim = c(0, pi))
Вид снизу
Вид сбоку
Комментарии:
1. @Radde1683 смотрите Мое обновление для реализации, которая должна работать в rgl
2. Привет, Аллан, большое спасибо за твой ответ! Функция работала на моем Pointcloud, поэтому она проецировала точки на полусферу. С помощью формулы для стереографической проекции я смог спроецировать полусферу на 2D плоскость: X ‘ = x / 1 z, Y ‘ = y / 1 z (x, y, z) Еще один вопрос: определяет ли ваша функция радиус полусферы? Если нет, возможно ли определить радиус единицы для «сферических» координат?
3. @Radde1683 да, радиус был установлен равным pi / 2. Я обновил функцию, чтобы сделать радиус полусферы равным 1. Я хотел бы увидеть результирующее изображение, которое вы получаете из своего pointcloud, если бы вы могли добавить это в качестве дополнения к вашему вопросу. Спасибо!