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@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.
______________________________________________
R-help@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.