Another, more geometrical, experiment with RotationRate
:
--
-- Cube Rotate
--
supportedOrientations(LANDSCAPE_LEFT)
function setup()
if deviceMetrics().platformName == "iPad 1G" then
print("This code needs a gyroscope."..
" An iPad 1 does not have one.")
end
local size = math.min(HEIGHT, WIDTH) / 2
d = 1000
m = cubeMesh(size)
dir = vec3(0, 0, 1)
dir2 = vec3(0, 1, 0)
end
function draw()
background(0)
perspective()
local mat = matrix()
local dxa = RotationRate.y
local dya = - RotationRate.x
local dza = - RotationRate.z
mat = mat:rotate(dxa, 1, 0, 0)
mat = mat:rotate(dya, 0, 1, 0)
mat = mat:rotate(dza, 0, 0, 1)
dir = mult(mat, dir)
dir2 = mult(mat, dir2)
local x = dir.x * d
local y = dir.y * d
local z = dir.z * d
camera(x, y, z, 0, 0, 0, dir2.x, dir2.y, dir2.z)
m:draw()
end
function cubeMesh(size)
local v = {}
local c = {}
for i = 0, 7 do
local x = (i % 2) * 2 - 1
local y = (math.floor(i / 2) % 2) * 2 - 1
local z = (math.floor(i / 4) % 2) * 2 - 1
v[i] = vec3(x, y, z) * size / 2
c[i] = color(127 + 127 * x, 127 + 127 * y, 127 + 127 * z)
end
local ver = {}
local col = {}
for v1 = 1, 3 do
local v2 = v1 * 3 % 7
local v3 = 7 - v1
local v4 = 7 - v2
local vt = {v[0], v[v1], v[v2], v[0], v[v3], v[v4],
v[7], v[v2], v[v1], v[7], v[v4], v[v3]}
for i = 1, #vt do
ver[(v1 - 1) * #vt + i] = vt[i]
end
local ct = {c[0], c[v1], c[v2], c[0], c[v3], c[v4],
c[7], c[v2], c[v1], c[7], c[v4], c[v3]}
for i = 1, #ct do
col[(v1 - 1) * #ct + i] = ct[i]
end
end
local m = mesh()
m.vertices = ver
m.colors = col
return m
end
function mult(mat, vec)
local v1 = mat[1] * vec.x + mat[2] * vec.y + mat[3] * vec.z
local v2 = mat[5] * vec.x + mat[6] * vec.y + mat[7] * vec.z
local v3 = mat[9] * vec.x + mat[10] * vec.y + mat[11] * vec.z
return vec3(v1, v2, v3)
end