blender3d.cz
http://blender3d.cz/forum/

Nelineárny harmonický oscilátor
http://blender3d.cz/forum/viewtopic.php?f=11&t=8604
Stránka 11

Autor:  Kapo [ sob kvě 05, 2012 11:25 am ]
Předmět příspěvku:  Nelineárny harmonický oscilátor

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

Autor:  Kapo [ čtv kvě 10, 2012 2:47 pm ]
Předmět příspěvku:  Re: Nelineárny harmonický oscilátor

To fakt nikto nevie?

Autor:  jucas [ pon kvě 14, 2012 12:10 am ]
Předmět příspěvku:  Re: Nelineárny harmonický oscilátor

Řekl bych, že přístup do dat renderingu zajišťuje modul bpy, ne bge. Krom toho, pokud se jedná o verzi 2.5+, tak je oproti 2.4 jiné api pro přístup do databloků Blenderu (modul bpy). Podívej se do dokumentace api.

Sčítání vektorů: buď je vektor reprezentován jako seznam [], a pak nejde takhle sčítat - objekt seznamu o vektorech nic neví, operátor + je pro seznamy přetížený na metodu extend. Součet se dá udělat třeba takhle c=[i+j for i,j in zip (a,b)].
Nebo jde o objekt Vector z modulu mathutils, který jde sčítat, ale musí se správně deklarovat v=v+Vector((1,2,3)).
Jak je to konkrétně u actuators řešené je v dokumentaci bge.

Autor:  Kapo [ pon kvě 21, 2012 12:21 am ]
Předmět příspěvku:  Re: Nelineárny harmonický oscilátor

No modul bpy vraj nepozna rendering context. modul bpy nepozna ani logic
Druha vec, na vektory sa pozriem, dakujem
Tretia vec, stale neviem, ako sa pristupuje k rychlosti objektu, ked mu priradim rychlost, nic sa nedeje, ani konzola nic nehlasi...(own.linV)

Stránka 11 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/