Kirjoittaja Aihe: Auttaisikohan joku fyysikko tai matemaatikko minua blenderin scriptissä?  (Luettu 3158 kertaa)

peran

  • Vieras
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...
Koodia: [Valitse]
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]

Tuxer

  • Käyttäjä
  • Viestejä: 657
  • Debian 7.0, Sailfish
    • Profiili
    • opendimension.org
En ole matemaatikko enkä fyysikko enkä edes Wiitä omista mutta veikkaan silti että ongelma liittyy gimbal lock -ilmiöön. Ongelman voi välttää käyttämällä kvaternioita, jossa määritellään akseli jonka suhteen halutaan pyörittää ja sitten kääntökulma.

http://en.wikipedia.org/wiki/Gimbal_lock

Kvaterniot löytyy Blenderistä Mathutils-moduulista:
http://www.blender.org/documentation/245PythonDoc/Mathutils.Quaternion-class.html

Tämä oli siis vain arvelu :)

EDIT: Toinen vaihtoehto on käännellä Wiillä Armaturea ja kiinnittää haluttu kohde siihen. Armaturet käyttävät kvaternioita (käsittääkseni)
« Viimeksi muokattu: 30.03.09 - klo:09.05 kirjoittanut Ari Häyrinen »
"Menehän Tonttu Tomera tarkastamaan ollaanko korsuissa kiltisti."
Fingerpori

peran

  • Vieras
Tästä ilmeisesti on kysymys. Ihmettelinkin, kun olikohan ne X ja Z akselit, jotka tulivat yhteen minulla, miten ne pyörivät samaan suuntaan.

Olen tosiaan täysi nyyppä Blenderissä, ja noita armatureja en ole onnistuneesti vielä käyttänyt, mutta eiköhän tämä tästä. Kvaterniotkin on täysin uusi sana.

qwertyy

  • Käyttäjä
  • Viestejä: 5777
    • Profiili
Aika hyvä animaatio ja selitys miten kolmella akselilla voi vältellä tuota ongelmaa.
http://www.youtube.com/watch?v=zc8b2Jo7mno&feature=related

Tuxer

  • Käyttäjä
  • Viestejä: 657
  • Debian 7.0, Sailfish
    • Profiili
    • opendimension.org
Yksi mahdollisuus olisi yksinkertaisesti linkittää kamera "jalustaan" ja siten luoda hierarkia jolloin ko. ongelmaa ei synny. Luomalla jalustan, joka hoitaa pyörimiset (pan) ja linkittämällä siihen varren joka hoitaa ylös/alas -käännöt (tilt) ja linkittämällä kameran siihen ja sitten pyörittämällä kameraa akselinsa ympäri, saat systeemin jonka pitäisi toimia.

Linkittäminen tapahtui Blenderissä siis valitsemalla kappaleet ja painamalla Ctrl + P. Jälkimmäisenä valitusta tulee parentti.

Toivottavasti auttaa oikeaan suuntaan.
"Menehän Tonttu Tomera tarkastamaan ollaanko korsuissa kiltisti."
Fingerpori