/* ------------------------------------------------------------- -- This script reads the contend of BVH files and -- applies the motion data on pointhelpers -- Spheres are used to display joints, lines are -- drawn between the different joints -- Layers are used to sperate pointhelpers from -- lines and spheres -- 31.12.2007 Markus Bliem ------------------------------------------------------------- */ PH =#() NoLe=#() PHLa=#() Noof=#() NoCh=#() PaNo=#() DeNo01=#() DeNo02=#() PHSi=1 PHBaMa=#() FiHei=170 ToNo=0 BoNo=0 Srad = 0.2 LDi= 0.2 ------------------------------------------------------------- --Function Create New Layer ------------------------------------------------------------- fn NewLa LaNa = ( NL = true LaCo = layermanager.count for i = 0 to (LaCo-1) do ( La = Layermanager.getlayer i print La.name if La.name == LaNa then NL = false ) if NL == true do ( La = Layermanager.newLayerfromName LaNa La = Layermanager.getlayer LaCo ) ) ------------------------------------------------------------- --Open File ------------------------------------------------------------- FiNa = getopenfilename caption "Select File" BVF = openfile FiNa skiptostring BVF "MOTION" fpe = filepos BVF seek BVF 0 fpo = filepos BVF Level = 1 NoNum = 0 NoDo01 = 0 NoDo02 = 0 LhNo=0 RhNo=0 ChTo=0 --------------------------------------------------------------- -- Draw PointHelper --------------------------------------------------------------- NewLa "BVH_PointHelper" while fpo < fpe do ( rli = readline BVF fpo = filepos BVF tes = filterstring rli "\t, " splitEmptyTokens:false chk = tes[1] if chk =="ROOT" do ( col =[0,50,150] NoNum = NoNum+1 NoNa= "BVPH_" + tes[2] PH[NoNum] = point name:NoNa size:PHSi wirecolor:col cross:true box:true NoLe[NoNum] = Level PHLa[NoNum] ="C" PaNo[Nonum]=0 DeNo01[NoNum] = Nodo01 DeNo02[NoNum] = Nodo02 ) if chk =="JOINT" do ( col =[0,50,150] NoNum = NoNum+1 NoNa= "BVPH_" + tes[2] colte = findstring NoNa "Left" if colte != undefined then col=[200,0,0] colte = findstring NoNa "Right" if colte != undefined then col=[0,200,0] PH[NoNum] = point name:NoNa size:PHSi wirecolor:col cross:true box:true NoLe[NoNum] = Level PHLa[NoNum] ="C" if (findstring PH[NoNum].name "Left")!= undefined then PHLa[NoNum] = "L" if (findstring PH[NoNum].name "Right")!= undefined then PHLa[NoNum] = "R" if (findstring PH[NoNum].name "Finger")!= undefined then PHLa[NoNum] = "F" if (findstring PH[NoNum].name "RightHand")!= undefined then RhNo=NoNum if (findstring PH[NoNum].name "LeftHand")!= undefined then LhNo=NoNum if (findstring PH[NoNum].name "Chest")!= undefined then ChTo=NoNum ) if chk =="End" do ( col =[255,225,5] NoNum = NoNum+1 naad ="" chna = PH[NoNum-1].name if (findstring chna "Left") != undefined then naad ="Left" if (findstring chna "Right") != undefined then naad ="Right" EsNa = filterstring chna "_" naad = EsNa[2] + "_EndSite" NoNa= "BVPH_" + naad PH[NoNum] = point name:NoNa size:PHSi wirecolor:col cross:true box:true NoLe[NoNum] = Level PHLa[NoNum] ="C" NoCh[NoNum] = 0 if (findstring PH[NoNum].name "Left")!= undefined then PHLa[NoNum] = "L" if (findstring PH[NoNum].name "Right")!= undefined then PHLa[NoNum] = "R" ) --------------------------------------------------------------- -- transform PointHelper --------------------------------------------------------------- if chk =="OFFSET" do ( Xpos=tes[2] as float Ypos=tes[3] as float Zpos=tes[4] as float Noof[NoNum]=[Xpos,Ypos,Zpos] PaNo[noNum] = NoNum-1 ) if chk =="CHANNELS" do ( NoCh[NoNum]=tes[2] as integer ) if chk == "{" do ( Level = Level+1 NoDo02 = 0 DeNo01[NoNum+1] = 0 DeNo02[NoNum+1] = Nodo02 ) if chk == "}" do ( Level = Level-1 NoDo01 = Nodo01 +1 NoDo02 = Nodo02 +1 DeNo01[NoNum+1] = Nodo01 DeNo02[NoNum+1] = Nodo02 ) ) for i = 1 to Nonum do ( print ChTo if DeNo01[i] != 0 do ( De= DeNo01[i] +1 PaNo[i] = i - De if PHLa[i] =="F" do ( if (findstring PH[i].name "Left") != undefined then PaNo[i] = LhNo if (findstring PH[i].name "Right") != undefined then PaNo[i] = RhNo ) if (findstring PH[i].name "Collar") != undefined then PaNo[i] = ChTo if (findstring PH[i].name "Neck") != undefined then PaNo[i] = ChTo ) ) for i = 1 to NoNum do ( LaSe =Layermanager.getLayerFromName "BVH_PointHelper" LaSe.addnode PH[i] if i > 1 then PH[i].parent = PH[PaNo[i]] ) for i = 1 to NoNum do ( PH[i].position = Noof[i] if i > 1 do ( PH[i].position = Noof[i] +PH[PaNo[i]].position ) ) for i = 1 to NoNum do ( format"%\t%\t%\t%\t%\t%\t%\t%\t%\t%\t%\t%\n" "Node:" i "Level:" NoLe[i] "Label" PHLa[i] "Name:" "Parent node:" PaNo[i] "Channels:" NoCh[i] PH[i].name ) --------------------------------------------------------------- -- draw joint spheres --------------------------------------------------------------- NewLa "BVH_DisplayGeo" for i = 1 to NoNum do ( na01=PH[i].name na02=filterstring na01 "_" NaSp = "BVSp_" + na02[2] sp=sphere radius:Srad name:NaSp sp.position = PH[i].position sp.wirecolor = PH[i].wirecolor sp.parent = PH[i] PH[i].size = Srad*4 LaSe =Layermanager.getLayerFromName "BVH_DisplayGeo" LaSe.addnode sp ) --------------------------------------------------------------- -- draw bone lines --------------------------------------------------------------- for i = 2 to NoNum do ( st= PaNo[i] BS = PH[st].position BE = PH[i].position na01=PH[i].name na02=filterstring na01 "_" NaLi = "BVLi_" + na02[2] Li = SplineShape pos:BS addNewSpline Li addKnot Li 1 #corner #line BS addKnot Li 1 #corner #line BE Li.wirecolor = PH[i].wirecolor Li.thickness = LDi Li.render_displayRenderMesh = true Li.sides = 6 Li.parent=PH[st] Li.name=NaLi LaSe =Layermanager.getLayerFromName "BVH_DisplayGeo" LaSe.addnode Li ) Ro= rotateXmatrix 90 PH[1].transform = PH[1].transform * Ro --------------------------------------------------------------- -- Read Transformation --------------------------------------------------------------- seek BVF 0 skiptostring BVF "Frames:" Rlin = readline BVF tes = filterstring Rlin "\t, " splitEmptyTokens:false FraCou = tes[1] as integer Rlin = readline BVF tes = filterstring Rlin "\t, " splitEmptyTokens:false FraTim = tes[3] as float FraSec = floor (1 / FraTim) as integer FraRan = FraCou/FraSec frameRate = FraSec animationRange = interval 1 FraCou slidertime = 1 for i = 1 to NoNum do ( PHBaMa[i] = PH[i].transform ) Pos00= PH[1].position with animate on ( for i = 1 to FraCou do ( slidertime = i Rlin = readline BVF DaLin = filterstring Rlin "\t, " splitEmptyTokens:false Xpos =DaLin[1] as float YPos =DaLin[2] as float ZPos =DaLin[3] as float Pos01 = [Xpos,Ypos,Zpos] + Pos00 ZRot=DaLin[4] as float XRot=DaLin[5] as float YRot=DaLin[6] as float ZRMa=rotateZMatrix ZRot XRMa=rotateXMatrix XRot YRMa=rotateYMatrix YRot RMa=YRMa*XRMa*ZRMa PH[1].transform = RMa * PHBaMa[1] PH[1].position = pos01 * PHBaMa[1] DaIn=7 for j = 2 to NoNum do ( No = PaNo[j] Ma0 = matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0] Ma0.row4 = Noof[j] PH[j].transform = Ma0 * PH[No].transform if NoCh[j] != 0 do ( NoZRot = DaLin[DaIn] as float NoXRot = DaLin[DaIn+1] as float NoYRot = DaLin[DaIn+2] as float DaIn = DaIn+3 ZRNoMa=rotateZMatrix NoZRot XRNoMa=rotateXMatrix NoXRot YRNoMa=rotateYMatrix NoYRot RNoMa=YRNoMa*XRNoMa*ZRNoMa RoMa=PH[j].transform PH[j].transform = RNoMa*RoMa ) ) ) slidertime = 1 LaSe =Layermanager.getLayerFromName "BVH_PointHelper" LaSe.ishidden = true )