Snažím sa spraviť si vlastný, nelineárny (konkrétne tento je vzhľadom na duplicitu členu "(length-l0)", kvadratický) harmonický oscilátor. Môj script vyzerá takto:
import bge
scene = bge.logic.getCurrentScene() cont = bge.logic.getCurrentController() own = cont.owner context = scene.getRenderingContext()
Obj2 = scene.objects[own['target']]
length = own.getDistanceTo(Obj2)
l0 = own['l0'] k = own['k'] dt = 1/context.fps x = own.getPosition(x) - own['target'].getPosition(x) y = own.getPosition(y) - own['target'].getPosition(y) z = own.getPosition(z) - own['target'].getPosition(z) vx = dt*(x/length)*k*(length-l0)*(length-l0) vy = dt*(y/length)*k*(length-l0)*(length-l0) vz = dt*(z/length)*k*(length-l0)*(length-l0)
Motion1 = own.actuators['Motion']
Motion1.linV = [vx,vy,vz]
Na objekte, kde je prilinkovaný script je gameproperty l0 (dĺžka, keď je oscilátor v rovnováhe), k (tuhosť, konštanta úmernosti) a target (string, ukazujúci na objekt, ktorý tvorí druhú stranu pržiny). Zatiaľ fungovali tie šamaniny s own['target'], dĺžku mi to pekne vypisovalo, no prišiel problém. V bge som nenašiel nič ako set acceleration, takže to musím robiť cez zmenu rýchlosti, resp. nastavovať rýchlosť, ako malú pribudnuvšiu plochu pod pomysleným grafom zrýchlenia. Takže potrebujeme niečo, ako dt. Dt sa ľahko zistí z fps, as long as fps je vlastne s na mínus prvú, teda naše dt bude 1/fps. To je super, no konzola má očividne problém s "context = scene.getRenderingContext()", neviem prečo. Ďalej potrebujeme vektor rýchlosti, no aby sme vedeli, kam mieri, treba zistiť relatívnu pozíciu (rozdiel absolútnych pozícii) oboch koncov pružiny. Teda ono getPosition, napríklad, nefunguje. Neviem prečo. Ďalší problém bol, že som skúšal ešte naneostro objektu cez tento motion priradiť nejakú rýchlosť, konzola nič nehlásila (je prístup own.linV = ... správny?), no ani s objektami sa nič nedialo, proste len spadli. No a posledný problém bol, že script nejako nepoberá zápis Motion1.linV = Motion1.linV + [vx, vy, vz], frfle na dačo s vektorovým súčtom, vraj to robím zle. Googlil som, čo to dalo, no nejako sa mi zdá, že je tej dokumentácie k python+blender nejako málo. Poradil by mi niekto, ako ten kód spraviť lepšie? Nemá poprípade bge v sebe nelineárny harmonický oscilátor podľa funkcie m*a = -F(x)?
Za prípadnú pomoc vopred ďakujem.
Braňo
|