くるくるっとまわしてみる


とりあえず加速度センサでくるくるするようになったけど、やっぱりブルブルする。遊びを作っとかないと。
このデフォルトのプログラムだと文字列で三軸の値を返してくるんだけど、これだと重すぎてくるくるの反応が数秒遅れてやってくる。ここもなんとかしなくては。ハンドシェークするようにすればよいのんかな。

"""
vec.py   -- reinvention of wheel
            vector class
            only implements  outer product and subtraction
"""
import math

class vec(object):
   def __init__(self,v):
      self.v = v
   def d_sq(self):
      return sum([x*x for x in self.v])
   def normalize(self):
      d = math.sqrt(self.d_sq())
      return [x/d for x in self.v]
   def angle(self):
      return math.asin(self.d_sq())*180/math.pi
   def __and__(self, v):
      """ outer product & """
      return vec([self.v[1] * v.v[2]+ self.v[2] * v.v[1],
                 self.v[2] * v.v[0]+ self.v[0] * v.v[2],
                 self.v[0] * v.v[1]+ self.v[1] * v.v[0]])
   def __sub__(self, v):
      return vec([self.v[0]-v.v[0],
                  self.v[1]-v.v[1],
                  self.v[2]-v.v[2]] )
from OpenGL.GL import *;
from OpenGL.GLU import *;
from OpenGL.GLUT import *;
from vec import vec;
import sys

glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE)
glutInitWindowSize(400,400)
glutCreateWindow("kurukuru")


def keyboard(c, x, y):
   if ord(c) == 0x1b:
      tty.close()
      sys.exit(1)

def reshape(w, h):
   glViewport(0, 0, w, h)
   glMatrixMode(GL_PROJECTION)
   glLoadIdentity()
   gluPerspective(50, w/h, 0.1, 20)
   glMatrixMode(GL_MODELVIEW)
   glLoadIdentity()
   gluLookAt(0, 0, 6, 0, 0, 0, 0, 1, 0)

def display():
   glClear(GL_COLOR_BUFFER_BIT)
   raw = vec([ (int(x)-2012) for x in tty.readline().split(",")])
   e = vec(raw.normalize()) & vec([0,1,0])
   glLoadIdentity()
   gluLookAt(0, 1, 6, 0, 0, 0, 0, 1, 0)
   glRotatef(e.angle(), *e.normalize())
   #print "%f - - %r" % ( e.d_sq(), e.normalize())

   glutWireTeapot(1)
   glutSwapBuffers()

def idle():
   glutPostRedisplay()

glutKeyboardFunc(keyboard)
glutDisplayFunc(display)
glutReshapeFunc(reshape)
glutIdleFunc(idle)

tty = open("/dev/ttyACM0", "r+")
tty.write("*")
# tty.write("*")としたら
# IOError: [Errno 9] Bad file descriptor
# と怒られた。なぜ?
## ってうっかりしてた。modestringは "r+"だね
#import os
#fd = os.open("/dev/ttyACM0", os.O_WRONLY)
#os.write(fd, "*")
#os.close(fd)

glutMainLoop()