[R] Plotting a cloud/fog of variable density in rgl

Duncan Murdoch murdoch.duncan at gmail.com
Mon Nov 22 19:55:13 CET 2010


On 22/11/2010 12:51 PM, JiHO wrote:
> Hi everyone,
>
> I want to plot a 3D interpolation of the concentration of aquatic
> organisms. My goal would be to have the result represented as clouds
> with a density proportional to the abundance of organisms, so that I
> could fly (well, swim actually ;) ) through the scene and see the
> patches here and there. Basically, I want to do something like this:
> 	http://www.youtube.com/watch?v=27mo_Y-aU-c
> but simpler and with only clouds.

rgl doesn't make everything in OpenGL available.  I'm not sure exactly 
how those clouds were done, but it wouldn't really be easy to do them in 
rgl.

I think you can come closest to what you want within rgl by using 
sprites rather than rendering transparent spheres.  See 
examples(sprites3d).

Duncan Murdoch

> I though about doing it this way:
> 1- interpolate to a fine grid
> 2- plot points at each grid intersection of transparency inversely
> proportional to abundance
> 3- blur/fog a bit each point to create the general impression of a cloud
>
> So far I am stuck on 3 but maybe there is a better overall solution.
> Here is some code that reads the result of the interpolation on a
> coarse grid and plots it:
>
> 	# read a set of gridded data points in 3D
> 	d = read.table("http://dl.dropbox.com/u/1047321/R/test3Ddata.txt", header=T)
>
> 	# plot
> 	library("rgl")
> 	spheres3d(d$x, d$y, d$z, alpha=alpha, radius=0.05)
>
> And here is a version that actually performs the interpolation a
> random set of points in 3D through kriging in case you want to try
> with increase precision.
>
> 	# create a set of random data points in 3D
> 	n = 50
> 	data3D = data.frame(x = runif(n), y = runif(n), z = runif(n), v = rnorm(n))
>
> 	# do 3d interpolation via kriging
> 	library("gstat")
> 	coordinates(data3D) = ~x+y+z
> 	range1D = seq(from = 0, to = 1, length = 10)
> 	grid3D = expand.grid(x = range1D, y = range1D, z = range1D)
> 	gridded(grid3D) = ~x+y+z
> 	res3D = krige(formula = v ~ 1, data3D, grid3D, model = vgm(1, "Exp", .2))
>
> 	# convert the result to a data.frame
> 	d = as.data.frame(res3D)
>
> 	# compute transparency (proportional to the interpolated value)
> 	maxD = max(d$var1.pred)
> 	minD = min(d$var1.pred)
> 	alpha = (d$var1.pred - minD)/(maxD - minD)
> 	# reduce maximum alpha (all points are semi-transparent)
> 	alpha = alpha/5
>
> 	# plot
> 	library("rgl")
> 	spheres3d(d$x, d$y, d$z, alpha=alpha, radius=0.05)
>
>
> I saw the fog effect but it seems to add a fog in the scene to
> increase depth. What I want is my scene to actually look like a fog.
>
> Thanks in advance for any help. Sincerely,
>
> JiHO
> ---
> http://maururu.net
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list