我想将点/球和一个平面放在一个三维图中。我希望平面的透明度为~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,也包括那些被飞机覆盖/隐藏/隐藏/掩盖的点。
答案 0 :(得分:3)
您正在使用“面向数据的例程”,这些例程可以快速渲染,但会扭曲轴,因为数据点通常在几何上彼此不相关。可能它是剪切和渲染速度和忽略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。
答案 1 :(得分:3)
我认为这是一个错误,但有一个解决方法。绘制平面时,请明确说明您不需要深度屏蔽,即使用
planes3d(1, 2, -1, 0, col = 'red', alpha = 0.1, depth_mask = FALSE)
编辑添加:
真的有两个错误。上面的一行修复了一行。另一个错误是飞机在球体之前被绘制,因为它没有像球体那样被xlim
,ylim
,zlim
值限制。 (如果它们都是透明的,这是不可避免的,但如果球体是实心的,则应首先绘制它们。)您可以强制它用另一种解决方法绘制。 plot3d()
调用后,运行以下命令:
subs <- subsceneInfo()
useSubscene3d(subs$children)
planes3d(1, 2, -1, 0, col = 'red', alpha = 0.1, depth_mask = FALSE)
useSubscene3d(subs$id)
或者,如果限制并不重要,只需将它们排除在外,事情就行了,没有任何其他解决方法。