RGL исчезают с глубиной, восприятием глубины - PullRequest
0 голосов
/ 10 января 2020

Как я могу показать объекты еще дальше с эффектом затухания в rgl?

В настоящее время, учитывая трехмерный график рассеяния, пакет rgl от R отображает объекты, расположенные еще дальше, с меньшим размером. Тем не менее, мне все еще трудно воспринимать глубину объекта, особенно когда на графике изображено много точек. В следующем примере, без поворота трудно увидеть, какая точка находится позади другой.

x <- 1:101
y <- rnorm(101, sd=15)
z <- x + rnorm(101, sd=15)
library(rgl)
plot3d(x,y,z, type='s')

Но на изображении ниже легко увидеть, что точки слева от изображения находятся дальше , Как мне добиться подобного эффекта в rgl? Существует аргумент alpha, но он не зависит от глубины каждой точки.

Ответы [ 2 ]

2 голосов
/ 14 января 2020

OpenGL поддерживает «туман», а rgl дает вам некоторый контроль над ним, хотя не совсем понятно, как его получить. Тем не менее, это работает, если вы запускаете его перед большинством функций:

r3dDefaults$material$fog <- TRUE
r3dDefaults$bg$fogtype <- "linear"

Если вы хотите, чтобы некоторые части вашего дисплея исчезали, а другие нет, установите материал для частей без запотевания с помощью fog = FALSE. Обычно это значение по умолчанию.

Варианты типа тумана: c("none", "linear", "exp", "exp2"). С линейным туманом ваш пример выглядит следующим образом:

screenshot

Если вы хотите, чтобы туман воздействовал только на точки, вы можете сделать это следующим образом:

r3dDefaults$material$fog <- FALSE
r3dDefaults$bg$fogtype <- "linear"
plot3d(x, y, z, type = "s", fog = TRUE)

Это работает, потому что свойства материала применяются только к данным, а не к осям. Я думаю, что эта версия выглядит лучше, но ваш вкус может отличаться:

enter image description here

Одно ограничение: туман в настоящее время не поддерживается кодом WebGL, созданным rglwidget().

Редактировать: В комментариях было отмечено, что вызов bgplot3d очищает туман. Это была ошибка в rgl версиях до 0.100.33, которая была исправлена ​​на 0.100.34. См. Как мне установить последнюю версию rgl? , где ее взять.

1 голос
/ 10 января 2020

Как насчет генерации новой переменной для alpha:

x <- 1:101
y <- rnorm(101, sd=5)
z <- x + rnorm(101, sd=15)
a <-11/(order(z) +10)
library(rgl)
plot3d(x, y, z, type = 's', 
       alpha = a)

Возможно, вы захотите отрегулировать эти значения в a <- 11/(order(z) + 10, чтобы получить желаемый вид.

enter image description here

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