Code archives/3D Graphics - Mesh/new fast animation
This code has been declared by its author to be Public Domain code.
Download source code
| test my system of animation |
;mnz animation ;mnzsoftware@aliceposta.it dim bank_anim(100) dim bank_anim_rt(100) dim num_bo(100) dim costante_anim(0) costante_anim(0)=24050 dd=millisecs() dim load(0) load(0)=0 global mu numero_omini=100 dim play_blending(numero_omini) dim frame_iniziale(numero_omini) dim frame_finale(numero_omini) dim frame_spazio(numero_omini) dim tipo_blending(numero_omini) dim attivazione_blending(numero_omini) dim incrementale_blending(numero_omini) dim frame_blending(numero_omini) dim transizione_blending(numero_omini) dim tipologia_blending(100) Graphics3D 800,600,16,2 SetBuffer BackBuffer() apptitle "mnz compiler 001","Sei sicuro?" camera=CreateCamera() AmbientLight(100, 100, 100) as$="load a animfile b3d" ; load a animfile ; Load mesh mesh=LoadanimMesh(as$) positionentity mesh,0,0,0 xx=90 entityfx mesh,16 dim numero_bones(0) dim nome_bones$(5,100) numero_bones(0)=23 bon=numero_bones(0) dim bones(bon,10) fra=1000 dim angolo_bone_x#(bon,fra) dim angolo_bone_y#(bon,fra) dim angolo_bone_z#(bon,fra) dim pos_bone_x#(bon,fra) dim pos_bone_y#(bon,fra) dim pos_bone_z#(bon,fra) bank_anim_rt(0)=createbank(bon*18*4+100) dim iniziale_ax#(bon,10) ;0 dim iniziale_ay#(bon,10) ;4 dim iniziale_az#(bon,10) ;8 dim iniziale_pax#(bon,10) ;12 dim iniziale_pay#(bon,10) ;16 dim iniziale_paz#(bon,10) ;20 dim attuale_ax#(bon,10) ;24 dim attuale_ay#(bon,10) ;28 dim attuale_az#(bon,10) ;32 dim attuale_pax#(bon,10) ;36 dim attuale_pay#(bon,10) ;40 dim attuale_paz#(bon,10) ;44 dim differenza_ax#(bon,10) ;48 dim differenza_ay#(bon,10) ;52 dim differenza_az#(bon,10) ;56 dim differenza_pax#(bon,10) ;60 dim differenza_pay#(bon,10) ;64 dim differenza_paz#(bon,10) ;68 b3dhierarchy(mesh%,0) if load(0)=0 num=0 ;-------------------------------------zero° for n=0 to numero_bones(0) bones(n,num)=FindChild (mesh,nome_bones$(0,n)) for fra=0 to 699 ;qui 280 SetAnimTime mesh,fra,0 ;colpo a zero° angolo_bone_x#(n,fra)=entitypitch#(bones(n,num)) angolo_bone_y#(n,fra)=entityyaw#(bones(n,num)) angolo_bone_z#(n,fra)=entityroll#(bones(n,num)) pos_bone_x#(n,fra)=entityx#(bones(n,num)) pos_bone_y#(n,fra)=entityy#(bones(n,num)) pos_bone_z#(n,fra)=entityz#(bones(n,num)) next next tempo_s2=millisecs()-dd ;##################################################### file_save=WriteFile("dati_scheletro_001.txt") For n =0 To numero_bones(0) For fra=0 to 1000 WriteFloat (file_save,angolo_bone_x#(n,fra)) WriteFloat (file_save,angolo_bone_y#(n,fra)) WriteFloat (file_save,angolo_bone_z#(n,fra)) WriteFloat (file_save,pos_bone_x#(n,fra)) WriteFloat (file_save,pos_bone_y#(n,fra)) WriteFloat (file_save,pos_bone_z#(n,fra)) next next closefile file_save ;###################################### endif ;##################################### num=0 file_save=readFile("dati_scheletro_001.txt") For n =0 To numero_bones(0) bones(n,num)=FindChild(mesh,nome_bones$(0,n)) for fra=0 to 1000 angolo_bone_x#(n,fra)=READFloat(file_save) angolo_bone_y#(n,fra)=READFloat(file_save) angolo_bone_z#(n,fra)=READFloat(file_save) pos_bone_x#(n,fra)=READFloat(file_save) pos_bone_y#(n,fra)=READFloat(file_save) pos_bone_z#(n,fra)=READFloat(file_save) next next closefile file_save file_save=readFile("dati_scheletro_001.txt") bank_anim(0)=createbank(costante_anim(0)*(numero_bones(0)+1)*24.1) for n=0 to numero_bones(0) for fra=0 to 1000 PokeFloat bank_anim(0),0+fra*24+n*costante_anim(0),READFloat(file_save) PokeFloat bank_anim(0),4+fra*24+n*costante_anim(0),READFloat(file_save) PokeFloat bank_anim(0),8+fra*24+n*costante_anim(0),READFloat(file_save) PokeFloat bank_anim(0),12+fra*24+n*costante_anim(0),READFloat(file_save) PokeFloat bank_anim(0),16+fra*24+n*costante_anim(0),READFloat(file_save) PokeFloat bank_anim(0),20+fra*24+n*costante_anim(0),READFloat(file_save) next next closefile file_save hide=0 tempo_s=millisecs()-dd hide2=1 positionentity camera,5,5,5 pointentity camera,mesh set_anim_mnz(0,1,2,0,639,2,40) While Not KeyDown( 1 ) if keyhit(2) then set_anim_mnz(0,1,2,91,118,1,4) if keydown(75) then xs#=xs#-.01 if keydown(77) then xs#=xs#+.01 ;positionentity sfere,0,.305,xs# ; Time elapsed between last frame Time% = MilliSecs() DeltaTime# = Float(Time - OldTime) / 1000 ; in seconds OldTime% = Time ; Camera movement CamSpd# = 20 * DeltaTime MoveEntity(camera, Float(KeyDown(205) - KeyDown(203)) * CamSpd, 0, Float(KeyDown(200) - KeyDown(208)) * CamSpd) If MouseDown(1) TurnSpeed# = 0.8 TurnEntity(camera, Float(MouseYSpeed()) * TurnSpeed#, 0, 0, False) TurnEntity(camera, 0, -Float(MouseXSpeed()) * TurnSpeed#, 0, True) Else MouseXSpeed() : MouseYSpeed() EndIf tempo_click=tempo_click-1 ;if keyhit(72) then hideentity bones(63,0) ;if keyhit(80) then showentity bones(63,0) if keydown(59) set_anim_mnz(0,1,2,0,50,2,40) endif if keydown(60) set_anim_mnz(0,1,2,100,150,2,10) endif if keydown(64) and tempo_click<0 tempo_click=3 mu=mu+1 if mu=78 then mu=78 set_anim_mnz(0,1,2,mu,mu,1,1) endif if keydown(62) and tempo_click<0 tempo_click=3 mu=mu-1 if mu<0 then mu=0 set_anim_mnz(0,1,2,mu,mu,1,1) endif te=millisecs() anim_mnz_poke_new(0) te2=millisecs()-te updateworld RenderWorld num=0 text 10,80,"te2 "+te2 text 500,100,"frame_blending(num)"+frame_blending(0) text 10,180,"AnimLength (mesh)"+AnimLength (mesh) Flip Wend End Function Point_Entity(entity,x#,y#,z#) xdiff# = EntityX(entity)-x# ydiff# = EntityY(entity)-y# zdiff# = EntityZ(entity)-z# dist#=Sqr#((xdiff#*xdiff#)+(zdiff#*zdiff#)) pitch# = ATan2(ydiff#,dist#) yaw# = ATan2(xdiff#,-zdiff#) RotateEntity entity,pitch#,yaw#,0 End Function Function AngleDifference#(angle1#,angle2#) Return ((angle2 - angle1) Mod 360 + 540) Mod 360 - 180 End Function function set_anim_mnz(num,tipo,att,ini,fini,spa,trans) attivazione_blending(num)=att incrementale_blending(num)=0 frame_iniziale(num)=ini frame_finale(num)=fini frame_spazio(num)=spa transizione_blending(num)=trans tipologia_blending(num)=tipo end function function anim_mnz_poke_new(num) if attivazione_blending(num)=2 if incrementale_blending(num)=0 for n=0 to numero_bones(0) pokefloat bank_anim_rt(0),0+n*72,peekfloat(bank_anim_rt(0),24+n*72) pokefloat bank_anim_rt(0),4+n*72,peekfloat(bank_anim_rt(0),28+n*72) pokefloat bank_anim_rt(0),8+n*72,peekfloat(bank_anim_rt(0),32+n*72) pokefloat bank_anim_rt(0),48+n*72,AngleDifference#(peekfloat(bank_anim_rt(0),24+n*72),peekFloat(bank_anim(0),frame_iniziale(num)*24+n*costante_anim(0)))/transizione_blending(num) pokefloat bank_anim_rt(0),52+n*72,AngleDifference#(peekfloat(bank_anim_rt(0),28+n*72),peekFloat(bank_anim(0),4+frame_iniziale(num)*24+n*costante_anim(0)))/transizione_blending(num) pokefloat bank_anim_rt(0),56+n*72,AngleDifference#(peekfloat(bank_anim_rt(0),32+n*72),peekFloat(bank_anim(0),8+frame_iniziale(num)*24+n*costante_anim(0)))/transizione_blending(num) pokefloat bank_anim_rt(0),12+n*72,peekfloat(bank_anim_rt(0),36+n*72) pokefloat bank_anim_rt(0),16+n*72,peekfloat(bank_anim_rt(0),40+n*72) pokefloat bank_anim_rt(0),20+n*72,peekfloat(bank_anim_rt(0),44+n*72) pokefloat bank_anim_rt(0),60+n*72,(peekfloat(bank_anim_rt(0),36+n*72)-peekFloat(bank_anim(0),12+frame_iniziale(num)*24+n*costante_anim(0)))/transizione_blending(num) pokefloat bank_anim_rt(0),64+n*72,(peekfloat(bank_anim_rt(0),40+n*72)-peekFloat(bank_anim(0),16+frame_iniziale(num)*24+n*costante_anim(0)))/transizione_blending(num) pokefloat bank_anim_rt(0),68+n*72,(peekfloat(bank_anim_rt(0),44+n*72)-peekFloat(bank_anim(0),20+frame_iniziale(num)*24+n*costante_anim(0)))/transizione_blending(num) next endif incrementale_blending(num)=incrementale_blending(num)+1 for n=0 to numero_bones(0) pokefloat bank_anim_rt(0),24+n*72,peekfloat(bank_anim_rt(0),0+n*72)+peekfloat(bank_anim_rt(0),48+n*72)* incrementale_blending(num) pokefloat bank_anim_rt(0),28+n*72,peekfloat(bank_anim_rt(0),4+n*72)+peekfloat(bank_anim_rt(0),52+n*72)* incrementale_blending(num) pokefloat bank_anim_rt(0),32+n*72,peekfloat(bank_anim_rt(0),8+n*72)+peekfloat(bank_anim_rt(0),56+n*72)* incrementale_blending(num) rotateentity bones(n,num),peekfloat(bank_anim_rt(0),24+n*72),peekfloat(bank_anim_rt(0),28+n*72),peekfloat(bank_anim_rt(0),32+n*72) pokefloat bank_anim_rt(0),36+n*72,peekfloat(bank_anim_rt(0),12+n*72)-peekfloat(bank_anim_rt(0),60+n*72)* incrementale_blending(num) pokefloat bank_anim_rt(0),40+n*72,peekfloat(bank_anim_rt(0),16+n*72)-peekfloat(bank_anim_rt(0),64+n*72)* incrementale_blending(num) pokefloat bank_anim_rt(0),44+n*72,peekfloat(bank_anim_rt(0),20+n*72)-peekfloat(bank_anim_rt(0),68+n*72)* incrementale_blending(num) positionentity bones(n,num),peekfloat(bank_anim_rt(0),36+n*72),peekfloat(bank_anim_rt(0),40+n*72),peekfloat(bank_anim_rt(0),44+n*72) next if incrementale_blending(num)>=transizione_blending(num) attivazione_blending(num)=1 incrementale_blending(num)=0 frame_blending(num)=frame_iniziale(num)+1 endif endif if attivazione_blending(num)=1 and tipologia_blending(num)=1 if incrementale_blending(num)=0 for n=0 to numero_bones(0) pokefloat bank_anim_rt(0),0+n*72,peekfloat(bank_anim_rt(0),24+n*72) pokefloat bank_anim_rt(0),4+n*72,peekfloat(bank_anim_rt(0),28+n*72) pokefloat bank_anim_rt(0),8+n*72,peekfloat(bank_anim_rt(0),32+n*72) pokefloat bank_anim_rt(0),48+n*72,AngleDifference#(peekfloat(bank_anim_rt(0),24+n*72),peekFloat(bank_anim(0),frame_blending(num)*24+n*costante_anim(0)))/frame_spazio(num) pokefloat bank_anim_rt(0),52+n*72,AngleDifference#(peekfloat(bank_anim_rt(0),28+n*72),peekFloat(bank_anim(0),4+frame_blending(num)*24+n*costante_anim(0)))/frame_spazio(num) pokefloat bank_anim_rt(0),56+n*72,AngleDifference#(peekfloat(bank_anim_rt(0),32+n*72),peekFloat(bank_anim(0),8+frame_blending(num)*24+n*costante_anim(0)))/frame_spazio(num) pokefloat bank_anim_rt(0),12+n*72,peekfloat(bank_anim_rt(0),36+n*72) pokefloat bank_anim_rt(0),16+n*72,peekfloat(bank_anim_rt(0),40+n*72) pokefloat bank_anim_rt(0),20+n*72,peekfloat(bank_anim_rt(0),44+n*72) pokefloat bank_anim_rt(0),60+n*72,(peekfloat(bank_anim_rt(0),36+n*72)-peekFloat(bank_anim(0),12+frame_blending(num)*24+n*costante_anim(0)))/frame_spazio(num) pokefloat bank_anim_rt(0),64+n*72,(peekfloat(bank_anim_rt(0),40+n*72)-peekFloat(bank_anim(0),16+frame_blending(num)*24+n*costante_anim(0)))/frame_spazio(num) pokefloat bank_anim_rt(0),68+n*72,(peekfloat(bank_anim_rt(0),44+n*72)-peekFloat(bank_anim(0),20+frame_blending(num)*24+n*costante_anim(0)))/frame_spazio(num) next endif incrementale_blending(num)=incrementale_blending(num)+1 for n=0 to numero_bones(0) ;attuale_ax#(n,num)=peekfloat(bank_anim_rt(0),0+n*72)+differenza_ax#(n,num)* incrementale_blending(num) ;attuale_ay#(n,num)=peekfloat(bank_anim_rt(0),4+n*72)+differenza_ay#(n,num)* incrementale_blending(num) ;attuale_az#(n,num)=peekfloat(bank_anim_rt(0),8+n*72)+differenza_az#(n,num)* incrementale_blending(num) pokefloat bank_anim_rt(0),24+n*72,peekfloat(bank_anim_rt(0),0+n*72)+peekfloat(bank_anim_rt(0),48+n*72)* incrementale_blending(num) pokefloat bank_anim_rt(0),28+n*72,peekfloat(bank_anim_rt(0),4+n*72)+peekfloat(bank_anim_rt(0),52+n*72)* incrementale_blending(num) pokefloat bank_anim_rt(0),32+n*72,peekfloat(bank_anim_rt(0),8+n*72)+peekfloat(bank_anim_rt(0),56+n*72)* incrementale_blending(num) rotateentity bones(n,num),peekfloat(bank_anim_rt(0),24+n*72),peekfloat(bank_anim_rt(0),28+n*72),peekfloat(bank_anim_rt(0),32+n*72) pokefloat bank_anim_rt(0),36+n*72,peekfloat(bank_anim_rt(0),12+n*72)-peekfloat(bank_anim_rt(0),60+n*72)* incrementale_blending(num) pokefloat bank_anim_rt(0),40+n*72,peekfloat(bank_anim_rt(0),16+n*72)-peekfloat(bank_anim_rt(0),64+n*72)* incrementale_blending(num) pokefloat bank_anim_rt(0),44+n*72,peekfloat(bank_anim_rt(0),20+n*72)-peekfloat(bank_anim_rt(0),68+n*72)* incrementale_blending(num) positionentity bones(n,num),peekfloat(bank_anim_rt(0),36+n*72),peekfloat(bank_anim_rt(0),40+n*72),peekfloat(bank_anim_rt(0),44+n*72) next if incrementale_blending(num)>=frame_spazio(num) attivazione_blending(num)=1 frame_blending(num)=frame_blending(num)+1 if frame_blending(num)>frame_finale(num) attivazione_blending(num)=2 endif incrementale_blending(num)=0 endif endif end function Function b3dhierarchy(parent%,numero) children%=CountChildren(parent%) For loop = 1 To children% child%=GetChild (parent%,loop) ;Print EntityName$(child%) ; writeline (file(0),"nome_bones$("+tipo+","+str$(num(0))+")="+chr(34)+EntityName$(child%)+chr(34)) nome_bones$(numero,num_bo(numero))=EntityName$(child%) num_bo(numero)=num_bo(numero)+1 b3dhierarchy(child%,numero) Next End Function |