Last Updated: February 25, 2016
·
1.51K # Ruby OpenGL Walk Bounce

### Pretty bouncing effect that gives an illusion that you are walking forward

Normally we would move the camera around and draw the 3D environment relative to the camera position. Here is a trick on how to do it very inexpensively.

1. Rotate and translate the camera position according to user commands
2. Rotate the world around the origin in the opposite direction of the camera rotation (giving the illusion that the camera has been rotated)
3. Translate the world in the opposite manner that the camera has been translated (again, giving the illusion that the camera has moved)

``````def update
@ang_conv = 0.0174532925 # pi / 180
@y_ang -= 1.5 if button? Button::KbRight
@y_ang += 1.5 if button? Button::KbLeft

if button?(Button::KbUp)
@x_pos -= Math.sin(@y_ang * @ang_conv) * 0.05
@z_diff -= Math.cos(@y_ang * @ang_conv) * 0.05
@bounce_ang > 359 ? @bounce_ang = 0 : @bounce_ang += 10
@bouncing = Math.sin(@bounce_ang * @ang_conv) / 20
end

if button?(Button::KbDown)
@x_pos += Math.sin(@y_ang * @ang_conv) * 0.05
@z_diff += Math.cos(@y_ang * @ang_conv) * 0.05
@bounce_ang <= 1 ? @bounce_ang = 359 : @bounce_ang -= 10
@bouncing = Math.sin(@bounce_ang * @ang_conv) / 20
end

@z_diff -= 0.3 if button? Button::KbPageUp
@z_diff += 0.3 if button? Button::KbPageDown

@y_pos -= 0.05 if button? Button::KbW
@y_pos += 0.05 if button? Button::KbS
@x_pos += 0.05 if button? Button::KbD
@x_pos -= 0.05 if button? Button::KbA
end

def draw
x = -@x_pos
y = -@bouncing - 0.25
z = -@z_diff
scene_angle = 360 - @y_ang
gl
glRotatef(@z_diff,1,0,0) #rotate to be able to look up or down
glRotatef(scene_angle,0,1,0); #rotate on direction user is facing
glTranslate(x, y, z) #translate the world in opposite of camera
end
end``````

153.3K
9

135.7K
0

### Take a photo of yourself every time you commit

108.5K
28

#### Have a fresh tip? Share with Coderwall community!

Best #Ruby Authors   mcansky
130.2K knoopx
109.8K stevennunez
95.53K
Filed Under

Awesome Job