繁体   English   中英

R透明plane3d不应该隐藏plot3d点/球体

[英]R transparent planes3d should not hide plot3d points/spheres

我想把点/球和一个平面放在一个三维图中。 我希望平面的透明度为~0.5(它既不应该是完全透明也不应该是完全不透明的)。 这样我就可以通过平面看到点/球体和轴线。

我试过了:

library(rgl)

#Generating points:
m=20
a1=runif(m,-1,1)
a2=runif(m,-1,1)
b=a1+2*a2+rnorm(m,mean=0,sd=0.3)

# Plotting the points:
plot3d(a1,a2,b, type='s', xlim = c(-1, 1), ylim = c(-1, 1), zlim = c(-3.1, 3.1),xlab = 'a_i,1', ylab = 'a_i,2', zlab = 'b_i',alpha=0.9)
# Plotting the transparent plane:
planes3d(1, 2, -1, 0, col = 'red', alpha = 0.1, add=T)
# plot the points again (because I thought, maybe the the execution order could be relevant)
plot3d(a1,a2,b, add=T, type='s', xlim = c(-1, 1), ylim = c(-1, 1), zlim = c(-3.1, 3.1),xlab = 'a_i,1', ylab = 'a_i,2', zlab = 'b_i',alpha=0.9)

我得到的结果是我可以通过飞机看到轴,但我看不到隐藏在飞机后面的点/球:(

通过飞机无法看到部分球体: 在此输入图像描述

我希望看到通过平面的点/球体(就像通过飞机可以看到的轴一样好)。 我希望看到所有20点/ spehres,也包括那些被飞机覆盖/隐藏/隐藏/掩盖的点。

您正在使用“面向数据的例程”,这些例程可以快速渲染,但会扭曲轴,因为数据点通常在几何上彼此不相关。 可能它是剪切和渲染速度和忽略alpha缓冲区,以便快速能够绘制很多点。

如果你使用不同的渲染技术,你可以得到它,但它当然要慢得多。 它尊重坐标之间的纵横比。

library(rgl)

sphere3d <- function(cen, r=1,n = 65, ...){
  f <- function(s,t){ 
    cbind(   r * cos(t)*cos(s) + cen[1],
             r *        sin(s) + cen[2],
             r * sin(t)*cos(s) + cen[3])
  }
  persp3d(f, slim = c(-pi/2,pi/2), tlim = c(0, 2*pi), n = n, add = T,axes=T,...)
}

m=20
xx=runif(m,-1,1)
yy=runif(m,-1,1)
zz=xx+2*yy+rnorm(m,mean=0,sd=0.3)

# Plotting the points:
for (i in 1:m){
  cen <- c(xx[i],yy[i],zz[i])
  sphere3d(cen,col="black",r=0.15,n=17)
}

# add corner points to make the bounding box span the space
sphere3d(c(-1,-1,-3),col="black",r=0.15,n=17)
sphere3d(c( 1, 1, 3),col="black",r=0.15,n=17)

# Plotting the transparent plane:
planes3d(1, 2, -1, 0, col = 'red', alpha = 0.5)

# no axes by default
axes3d( edges="bbox",box=T )

产生这一点 - 但是请注意它也不完美 - 当你在球体上设置透明度时也会以类似的方式搞砸。 一般情况下,您只能完全正确地执行多层透明度,并且光线跟踪相关的内容非常慢:

在此输入图像描述

这是另一个正面视图,alpha设置为0.8。

在此输入图像描述

我认为这是一个错误,但有一个解决方法。 绘制平面时,明确表示您不需要深度遮罩,即使用

planes3d(1, 2, -1, 0, col = 'red', alpha = 0.1, depth_mask = FALSE)

编辑添加:

真的有两个错误。 上面的一行修复了一行。 另一个错误是飞机在球体之前被绘制,因为它没有像球体那样被xlimylimzlim值修剪。 (如果它们都是透明的,这是不可避免的,但如果球体是实心的,则应首先绘制它们。)您可以强制它用另一种解决方法绘制。 plot3d()调用之后,运行以下命令:

subs <- subsceneInfo()
useSubscene3d(subs$children)
planes3d(1, 2, -1, 0, col = 'red', alpha = 0.1, depth_mask = FALSE)
useSubscene3d(subs$id)

或者,如果限制并不重要,只需将它们排除在外,事情就行了,没有任何其他解决方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM