# A ruby processing sketch (needs re-factoring for jruby_art) # # # This example implements a custom VolumetricSpace using an implicit function # to calculate each voxel. This is slower than the default array or HashMap # based implementations, but also has much less memory requirements and so might # be an interesting and more viable approach for very highres voxel spaces # (e.g. >32 million voxels). This implementation here also demonstrates how to # achieve an upper boundary on the iso value (in addition to the one given and # acting as lower threshold when computing the iso surface) # # Usage: # drag mouse to rotate camera # w: toggle wireframe on/off # mouse wheel to zoom in/out # l: apply laplacian mesh smooth # # # # Copyright (c) 2010 Karsten Schmidt & ruby-processing version Martin Prout 2012 # This sketch relies on a custom toxiclibscore library for PovRAY export # # This library is free software you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation either # version 2.1 of the License, or (at your option) any later version. # # http://creativecommons.org/licenses/LGPL/2.1/ # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # require 'toxiclibs' load_library 'vecmath' # uncomment this line for ruby-processing RES = 64 ISO = 0.2 MAX_ISO = 0.66 attr_reader :mesh, :gfx, :curr_zoom, :is_wire_frame def setup size(720, 720, P3D) ArcBall.init(self) @gfx = Gfx::ToxiclibsSupport.new(self) vol = EvaluatingVolume.new(Toxi::Vec3D.new(400, 400, 400), RES, RES, RES, MAX_ISO) surface = Volume::HashIsoSurface.new(vol) @mesh = Toxi::WETriangleMesh.new surface.compute_surface_mesh(mesh, ISO) @is_wire_frame = false end def draw background(0) if is_wire_frame no_fill stroke(255) else fill(255) no_stroke define_lights lights end @gfx.mesh(mesh, true) end def key_pressed case key when 'w', 'W' @is_wire_frame = !is_wire_frame when 'l', 'L' Toxi::LaplacianSmooth.new.filter(mesh, 1) when 's', 'S' save_frame('implicit.png') end end def define_lights ambient_light(50, 50, 50) point_light(30, 30, 30, 200, -150, 0) directional_light(0, 30, 50, 1, 0, 0) spot_light(30, 30, 30, 0, 40, 200, 0, -0.5, -0.5, PI / 2, 2) end # Creating a volumetric space class # class EvaluatingVolume < Volume::VolumetricSpace include Processing::Proxy attr_reader :upper_bound FREQ = PI * 3.8 def initialize(scal_vec, resX, resY, resZ, upper_limit) super(scal_vec, resX, resY, resZ) @upper_bound = upper_limit end def clear # nothing to do here end def getVoxelAt(i) getVoxel(i % resX, (i % sliceRes) / resX, i / sliceRes) end def getVoxel(x, y, z) # can't overload so we renamed val = 0 if x > 0 && x < resX1 && y > 0 && y < resY1 && z > 0 && z < resZ1 xx = x * 1.0 / resX - 0.5 # NB: careful about integer division !!! yy = y * 1.0 / resY - 0.5 zz = z * 1.0 / resZ - 0.5 val = cos(xx * FREQ) * sin(yy * FREQ) + cos(yy * FREQ) * sin(zz* FREQ) + cos(zz * FREQ) * sin(xx * FREQ) # val = sin(xx * FREQ) + cos(yy * FREQ) + sin(zz * FREQ) # val = sin(xx * FREQ) * (xx * FREQ) + sin(yy * FREQ) * (yy * FREQ) + sin(zz * FREQ) * (zz * FREQ) val = 0 if val > upper_bound end val end end
Experiments with ruby-processing (processing-2.2.1) and JRubyArt for processing-3.0
Tuesday, 24 March 2015
Toxiclibs gem released
I've just released a toxiclibs gem that can be used with JRubyArt or ruby-processing (examples uses gem version 0.3.0.pre))
Labels:
JRubyArt,
processing-2.2.1,
ruby-processing,
toxiclibs
Subscribe to:
Post Comments (Atom)
Followers
About Me
- monkstone
- I have developed JRubyArt and propane new versions of ruby-processing for JRuby-9.1.5.0 and processing-3.2.2
No comments:
Post a Comment