Paul Murrell
The University of Auckland
November 2022
Suppose we want to create a shape like this ...
Two problems:
A language and interpreter for creating 3D scenes.
my_model(x[3], a[1]) { my_model = x[2]; }
array d[3]; array vertex[3]; d = [5, 5, 5]; vertex[1] = -d[1]; vertex[2] = -d[2]; vertex[3] = -d[3]; cube = hfBlock(x, vertex, 2*d[1], 2*d[2], 2*d[3]);
array centre[3]; r = .8; centre = [2, 2, 5]; threeA = hfSphere(x, centre, r); centre = [0, 0, 5]; threeB = hfSphere(x, centre, r); centre = [-2, -2, 5]; threeC = hfSphere(x, centre, r); three = threeA | threeB | threeC;
my_model(x[3], a[1]) { ... my_model = cube \ three }
centre = [0, 0, 0]; trim = hfSphere(x, centre, .975*sqrt(2*d[1]*d[1]));
my_model(x[3], a[1]) { ... my_model = cube \ three \ ~trim }
Three remaining problems:
An R package interface to HyperFun
library(hyperfun) cube <- hfBlock(dx=10, dy=10, dz=10) r <- 0.8 three <- hfSphere(c(2, 0, -2), c(2, 0, -2), 5, r=r) trim <- hfSphere(r=.975*sqrt(2*5^2)) dice <- cube - three - !trim hfp(dice)
hfSphere()
HF_24_1(x[3], a[1]) { array center[3]; center = [0, 0, 0]; sphere = hfSphere(x, center, 1); HF_24_1 = sphere; }
hfBlock() - hfSphere()
HF_25_1(x[3], a[1]) { array vertex[3]; vertex = [-0.5, -0.5, -0.5]; block = hfBlock(x, vertex, 1, 1, 1); HF_25_1 = block; } HF_26_1(x[3], a[1]) { array center[3]; center = [0, 0, 0]; sphere = hfSphere(x, center, 1); HF_26_1 = sphere; } HF_27_1(x[3], a[1]) { HF_27_1 = HF_25_1(x, a) \ HF_26_1(x, a); } my_model(x[3], a[1]) { my_model = HF_27_1(x, a); }
hfDice <- function(d) { cube <- hfBlock(dx=d, dy=d, dz=d) r <- 8/d three <- hfSphere(c(d/5, 0, -d/5), c(d/5, 0, -d/5), d/2, r=r) trim <- hfSphere(r=.975*sqrt(2*(d/2)^2)) cube - three - !trim } hfp(hfDice(10))
f <- function(xyz) xyz[2] xzPlane <- hfR(f) hfp(xzPlane)
hfR(f)
HF_44_1(x[3], a[1]) { object = hfR(x, 3); HF_44_1 = object; }
library(mvtnorm) f <- function(xyz) { xyz[2] - 10*dmvnorm(sqrt(xyz[1]^2 + xyz[3]^2)/2) } gaussian <- hfR(f) hfp(gaussian)
'hyperfun' brings together several concepts and technologies that are useful for creating 3D scenes.
The HyperFun Project
hyperfun.org
(dead link)
paulbourke.net/dataformats/hyperfun/
Jack Wong extended the support for FRep library shapes in 'hyperfun' as part of his BSc Hons project.