Here is an enhanced arcball sketch, features use of control panel for zoom facility, and drop down menu too choose which or whether rotation is frozen about an axis. See previous post for library.
load_libraries 'arcball', 'opengl', 'control_panel'
import "arcball"
import "opengl"
X = 0
Y = 1
Z = 2
attr_reader :my_ball, :zoom
def setup
size(600, 600, OPENGL)
setup_opengl
@my_ball = ArcBall.new(width/2.0, height/2.0, min(width - 20, height - 20) * 0.5)
control_panel do |c|
c.title = 'Controller'
c.slider :zoom, 0..2.0, 0.0
c.menu(:freeze, ['X-axis', 'Y-axis', 'Z-axis', 'free'], 'free') {|m| load_menu_item(m) }
end
@zoom = 0
end
def draw
background(50, 50, 100)
translate(width/2.0, height/2.0, zoom * width/2.0)
define_lights
update
lights
stroke(0)
cube(my_ball.radius / 2.0)
end
def setup_opengl
hint ENABLE_OPENGL_4X_SMOOTH
hint DISABLE_OPENGL_ERROR_REPORT
end
def update
theta, x, y, z = my_ball.update
rotate(theta, x, y, z)
end
def mouse_pressed
my_ball.mouse_pressed(mouse_x, mouse_y)
end
def mouse_dragged
my_ball.mouse_dragged(mouse_x, mouse_y)
end
def define_lights
ambient(20, 20, 20)
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
def load_menu_item(m)
case(m)
when 'X-axis':
my_ball.select_axis(X)
when 'Y-axis':
my_ball.select_axis(Y)
when 'Z-axis':
my_ball.select_axis(Z)
when 'free'
my_ball.select_axis(-1)
end
end
def cube(sz)
sz *= 0.5
fill(200, 200, 200, 255)
begin_shape(QUADS)
vertex(-sz, -sz, -sz)
vertex(+sz, -sz, -sz)
vertex(+sz, +sz, -sz)
vertex(-sz, +sz, -sz)
vertex(-sz, -sz, +sz)
vertex(+sz, -sz, +sz)
vertex(+sz, +sz, +sz)
vertex(-sz, +sz, +sz)
vertex(-sz, -sz, -sz)
vertex(-sz, -sz, +sz)
vertex(-sz, +sz, +sz)
vertex(-sz, +sz, -sz)
vertex(+sz, -sz, -sz)
vertex(+sz, -sz, +sz)
vertex(+sz, +sz, +sz)
vertex(+sz, +sz, -sz)
vertex(-sz, -sz, -sz)
vertex(+sz, -sz, -sz)
vertex(+sz, -sz, +sz)
vertex(-sz, -sz, +sz)
vertex(-sz, +sz, -sz)
vertex(+sz, +sz, -sz)
vertex(+sz, +sz, +sz)
vertex(-sz, +sz, +sz)
end_shape
end
|
sketch screenshot using the gimp |
No comments:
Post a Comment