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.

Reply via email to