Olen luullut, että matematiikka on vahvuuksiani, mutta näin ei ilmeisesti ole.
Tavoitteenani on saada Blenderin kamera tai kappale pyörimään kun pyöritän Wiin ohjainta akselinsa ympäri. Samalla tavalla olisi tavoitteena pyörittää Blenderin kamerassa kuvaa kuvan keskipisteen ympäri riippumatta missä ja missä asennossa kamera/kappale on.
Parit erikoistapaukset hallitsen. Kun kamera katsoo suoraan alaspäin, pyörii kuva nätisti pyörittämällä kappaletta Z-akselin ympäri. Samaten onnistuu vastaavassa tapauksessa pyörittää Y-akselin ympäri, mutta 45° kuvakulmassa en ole onnistunut pyörittämään kuvaa ohjelmallisesti, vaikka olen yrittänytkin. Lisäksi haluaisin yleispätevän ratkaisun ongelmaani.
Käyttiksenä on Ubuntu 810, ja blenderin versio on 2.46.
Tässä scriptini koodia...
import Blender
from Blender import Scene
import cwiid,time
from math import asin,acos,atan,sqrt,degrees,pi,sin,cos
def wii():
xbutton=0
scn=Scene.GetCurrent()
ob_act = scn.objects.active
scn.objects.selected=[]
ob_act.sel = 1
wm = cwiid.Wiimote()
wm.rpt_mode=cwiid.RPT_ACC | cwiid.RPT_BTN
s=[0,0,0]
while(xbutton!=cwiid.BTN_HOME):
xbutton=wm.state['buttons']
s[0]=0
s[1]=0
s[2]=0
r=1000
for i in range(r):
state=wm.state
s[0]+=state['acc'][0]
s[1]+=state['acc'][1]
s[2]+=state['acc'][2]
r*=120.0
x=s[0]-r
y=s[1]-r
z=s[2]-r
##xrot=xrot if(z*z+y*y==0) else asin(y/sqrt(z*z+y*y))
yrot=yrot if(z*z+x*x==0) else pi-asin(x/sqrt(z*z+x*x)) if(z<0) else asin(x/sqrt(z*z+x*x))
ob_act.RotX=pi/4-yrot*0.5
ob_act.RotY=pi/4- ((pi/4-yrot/2) if(pi>=yrot*2) else (yrot/2-pi/4))
ob_act.RotZ=-pi/2-yrot
Blender.Redraw()
if(xbutton==cwiid.BTN_HOME):
print "vapauta napit, kun jaksat"
while wm.state['buttons']!=0:
pass
print "paina uudestaan kotia lopettaaksesi, tai paina muuta jatkaaksesi"
xbutton=0
while xbutton==0:
xbutton=wm.state['buttons']
print "vapauta, niin loppuu"
while wm.state['buttons']!=0:
pass
wm.close()
print 'painelehan 1 ja 2 wiimotessa yhtaaikaa'
xbutton=0
scn=Scene.GetCurrent()
ob_act = scn.objects.active
scn.objects.selected=[]
ob_act.sel = 1
xrot=ob_act.RotX
yrot=ob_act.RotY
xrotmem=ob_act.RotX
yrotmem=ob_act.RotY
zrotmem=ob_act.RotZ
print xbutton,"(",degrees(xrotmem),",",degrees(yrotmem),",",degrees(zrotmem),"),(",ob_act.LocX,",",ob_act.LocY,",",ob_act.LocZ,")"
wii()
Tässä siis koodia, joka yrittää toimia tarvitsee python-cwiid-paketin ja wiimote-ohjaimen kokeilemiseen.
Ohjelma pyörittää valittua kappaletta, kun pyörität wii-ohjainta pituusakselin ympäri, mutta se ei pyöri nätisti.
Kokeilemiseen .blend-tiedosto liitteenä.
Koe-käyttäjille ohjeeksi pyöritys käynnistyy painamalla wiimotesta 1+2 yhtä aikaisesti ja vapauttamalla. Ohjelman suoritus loppuu, kun painaa mökkiä pari kertaa. Ensimmäisellä kerralla pysähtyy toiminta, ja jos ei kelpaa, niin voi jatkaa pyöritystä oikeaan asentoon painamalla toisen kerran. Kuva siis pyörii melkein nätisti.
Teoriaa, jotka eivät voi kokeilla, mutta osaavat geometrisia kykyjä:
ob_act.RotX - kulma, joka on kohtisuorassa x-akselia. siis voidaan pyörittää x-akselin ympäri.
ob_act.RotY - kulma, joka on kohtisuorassa y-akselia. siis voidaan pyörittää y-akselin ympäri.
ob_act.RotZ - kulma, joka on kohtisuorassa z-akselia. siis voidaan pyörittää z-akselin ympäri.
koodissa yrot-on kulma, jossa Wiimote-ohjain on.
Oletuksena kamera katsoo Z-akselin suuntaisesti alas päin. siinä tapauksessa kelpaa RotZ=yrot, RotX,RotY=0
Toivottavasti joku osaa auttaa, ja viitsii sen tehdä.
Tavoitteena on tehdä toimiva ohjain blenderille.
[ylläpito on poistanut liitteen]