On 12-11-17 3:11 PM, Duncan Murdoch wrote:
On 12-11-17 1:51 PM, John Muschelli wrote:
That works! Thanks for the help, but I can't seem to figure out why
this happens with even one contour in the example below:
Disclaimer: using MNI template from FSL
(http://fsl.fmrib.ox.ac.uk/fsl/fslwiki/Atlases).
Firefox still has array initialiser too large for this one contour, but
Safari and Chrome both will render it, but again it comes out half of a
brain and the vertices are connected across the brain and not a surface.
The code is the same as with the example from AnalyzeFMRI, but a
different dimension for the array and a different level (Also attached).
There's a thread from last year here:
https://www.khronos.org/webgl/public-mailing-list/archives/1102/msg00093.html
that says that WebGL is limited to 65535 vertices in any object. I
assume that limit is still in effect, and your scenes probably have too
many vertices.
The writeWebGL function doesn't do any checks for things like this.
I'll think about having it split up objects as required, but in the
meantime, you'll need to do it yourself.
I just tried your example. The image has 205311 vertices, so it will
need splitting up. It is made up of triangles, and they're fairly
simple, so this should do it:
split_triangles <- function(ids = rgl.ids()$id, maxsize=65535) {
if (maxsize %% 3 != 0)
stop("maxsize must be a multiple of 3")
save <- par3d(skipRedraw=TRUE)
on.exit(par3d(save))
allids <- rgl.ids()
ids <- with(allids, id[ id %in% ids & type == "triangles" ])
for (id in ids) {
count <- rgl.attrib.count(id, "vertices")
if (count <= maxsize) next
verts <- rgl.attrib(id, "vertices")
norms <- rgl.attrib(id, "normals")
cols <- rgl.attrib(id, "colors")
rgl.pop(id=id)
while (nrow(verts) > 0) {
n <- min(nrow(verts), maxsize)
triangles3d(verts[1:n,], normals=norms[1:n,],
color=rgb(cols[1:n,1], cols[1:n,2], cols[1:n,3]), alpha=cols[1:n,4])
verts <- verts[-(1:n),,drop=FALSE]
norms <- norms[-(1:n),]
cols <- cols[-(1:n),]
}
}
}
This function isn't perfectly general, but I think it is good enough for
contour3d output. (It does slow down rendering noticeably: having one
object is easier to render than having 4.) You might need to play with
smaller values of maxsize.
Duncan Murdoch
______________________________________________
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.