diff --git a/my_trees/tree1.png b/my_trees/tree1.png new file mode 100644 index 0000000..f8c53cf Binary files /dev/null and b/my_trees/tree1.png differ diff --git a/my_trees/tree2.png b/my_trees/tree2.png new file mode 100644 index 0000000..27d953d Binary files /dev/null and b/my_trees/tree2.png differ diff --git a/my_trees/tree3.png b/my_trees/tree3.png new file mode 100644 index 0000000..c06d16b Binary files /dev/null and b/my_trees/tree3.png differ diff --git a/my_trees/tree4.png b/my_trees/tree4.png new file mode 100644 index 0000000..e960a90 Binary files /dev/null and b/my_trees/tree4.png differ diff --git a/src/distribution.js b/src/distribution.js index f4c14e6..06c358b 100644 --- a/src/distribution.js +++ b/src/distribution.js @@ -1,32 +1,91 @@ +function fract(x) { + return x - Math.floor(x); +} + +function bias(b, x) { + return Math.pow(x, Math.log(b) / Math.log(0.5)); +} + +function impulse(i, x) { + var j = i * x; + return j * Math.exp(1.0 - j); +} + +function cubicPulse(c, w, x) { + x = Math.abs(x - c); + + if (x > w) return 0.0; + + x /= w; + + return 1.0 - x * x * (3.0 - (2.0 * x)); +} export function func1(mesh, settings) { var abs_y = settings.pos; var height = settings.max - settings.min; var rel_y = (settings.pos - settings.min) / height; - + + var y = (height - abs_y); + + var fnA = y * 0.5; + var fnB = 0.25 * Math.sin(6.0 * y); + var fnC = Math.sin(0.35 * y) * fnA + fnB; + var fn = fnC; + mesh.position.set(0, abs_y, 0); + mesh.scale.set(fn, settings.size, fn); } -export function sawtooth(mesh, settings) { +export function func2(mesh, settings) { var abs_y = settings.pos; var height = settings.max - settings.min; var rel_y = (settings.pos - settings.min) / height; - + + var y = (height - abs_y); + + var fnA = (Math.pow(y, 3.0) / 2000.0); + var fnB = fract(y / 5.0) * fnA; + var fn = fnB; + mesh.position.set(0, abs_y, 0); + mesh.scale.set(fn, settings.size, fn); } -export function triangle(mesh, settings) { +export function func3(mesh, settings) { var abs_y = settings.pos; var height = settings.max - settings.min; var rel_y = (settings.pos - settings.min) / height; - + + var y = (height - abs_y); + + var freq = 0.2; + var amplitude = 2.0; + + var fnA = Math.abs((y * freq) % amplitude - (0.5 * amplitude)); + var fnB = Math.pow(fnA, 2.0) * y; + var fn = fnB; + mesh.position.set(0, abs_y, 0); + mesh.scale.set(fn, settings.size, fn); } -export function step(mesh, settings) { +// NOTE: +// This one isn't as good as the rest, struggled a bit trying +// to find an impulse curve to fit the outer shape, settled on a sine +// wave but it clearly isn't perfect. + +export function func4(mesh, settings) { var abs_y = settings.pos; var height = settings.max - settings.min; var rel_y = (settings.pos - settings.min) / height; - + + var y = (height - abs_y); + + var fnA = Math.sin((y / 16.0) - 1.5) * 25.0; + var fnB = (2.0 * (1.0 - fract(y / 4.0))) + fnA + 25.0; + var fn = fnB; + mesh.position.set(0, abs_y, 0); + mesh.scale.set(fn, settings.size, fn); } \ No newline at end of file diff --git a/src/main.js b/src/main.js index 909c8d2..a8542a4 100644 --- a/src/main.js +++ b/src/main.js @@ -13,7 +13,7 @@ function onLoad(framework) { var stats = framework.stats; // LOOK: the line below is synyatic sugar for the code above. Optional, but I sort of recommend it. - // var {scene, camera, renderer, gui, stats} = framework; + // var {scene, camera, renderer, gui, stats} = framework; // initialize a simple box and material var cylinder = new THREE.CylinderGeometry(0.5, 0.5, 1, 32, 32); @@ -22,7 +22,7 @@ function onLoad(framework) { var light1 = new THREE.DirectionalLight(0xffffff, 0.8); light1.position.set(10, 10, 10); - + var light2 = new THREE.DirectionalLight(0xffffff, 0.2); light2.position.set(-10, 5, -10); @@ -59,11 +59,11 @@ function onLoad(framework) { size: settings.leafHeight }; - func1(mesh, params); - // func2(mesh, settings); - // func3(mesh, settings); - // func4(mesh, settings); - + // func1(mesh, params); + // func2(mesh, params); + // func3(mesh, params); + func4(mesh, params); + scene.add(mesh); tree_items.push(mesh); }