Stewart Platform and Simlation of Earthquake Room
I
3D Studio Max 3D Studio Max II
The purpose of this speial subjet is to simulate the senario of the earthquakee by using 3D Studio Max and Stewart platform it is our goal to aomplish the building of the earthquake room. Continue the researh of the Stewart platform system we try to investigate the generation of earthquake senery and integrate to the platform system.in this program tasks have been shared into two parts one is looking for the data of earthquake the other is to generate the senario of earthquake.finally we tune the ation of the platform to math the senery of the earthquake. III
1-1 3 1-2.7 1-3 1-4 1-5 1-6 2-1 2-2 2-3 2-4 2-5 2-6 2-7 3-1 3D 3-23D 3-3 3-4 3-5 4-1Open GL 4-2 4-3 4-4 IV
1-1 JMA 4 1-2 SI 4 1-3.5 1-4.6 2-1 17 V
1
2
S t e f t f t t / ( ) [1 sin(2 m )]sin(2 ) f T 1/ m m f 3
log A m M 1.73log 3.17 Am M log T 0.82 0.22M m C ( t) A sin2 f t A C fa C 2 2 4 2 f A M 4.85 0.5M k M M k 1-1 4
T 1 SI S V dt T S V 0 1-2 2 2 4 f A 2 fa 2 f f 1 2 f 1 392 1.006 H Z 2 62 f 1 24.5 0.599 H Z 2 6.5 5
1-3 1-4 6
1-2 1-3 7
1-4 1-5 1-6 8
9 2-1
2-3 2-2 10
2-4 11
12 Cartesian Joint Spae p v p p z y x T R z y x T Z Y X 1 1 0 1 1 s s s s s s s s s s s s s s s s s s s s s R R R R X Y Z 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0,,, T v z y x T 1 ~ 6 i, i P v i P R T P 6 1~ i, i i i B P S, 1 ~ 6 i S S S i i i i
y R 1 VI 1716.35 2 6.22 * 10 s 4.782 *10 4 2 s 1 1 s 1 PM -5 V I 6.22*10 1716.35 4 2 2 s 4.782*10 s 1 60( ma) 1716.35( m / s) 10.2981( m / s) VI * 10( V ) 1( A) 1( V ) 10( V ) PM 360( m) 1( V ) 36( m) 13
14
2-6 2-7 15
16
17-1
3.1 3-1 18
3.2 3-2 19
3-3 20
3-4 21
3-5 22
Open GL Open GL Open GL Open GL C C++ runtime library Open GL Open GL API Windows API Internet Open GL 3D Open GL CAD 3D API Mirosoft Windows 3D Open GL Open GL API(Appliation Programming Interfae Open GL Open GL C C++ Open GL Open GL Open GL Windows GDI 23
API, Open GL C (alling onvention) C C C API Open GL OpenGL (proedual desriptive API 200 OpenGL OpenGL Mirosoft Windows) bitmap OpenGL OpenGL Open GL Open GL Silion Graphis IRIS GL. IRIS 3D API. (3D depth SGI IRIS GL 24
OpenGL IRIS GL API GL 25
4-1 4-2 26
4-3 27
(Ambient) (Diffuse) (Speular) (Emitted) 4-4 28
29
MAX : 3D STUDIO MAX R2.X 1998Club, V. N. (Club, V. N.) 3D Studio max R2 1998 MAX : 3D Studio MAX R2.5 1998Club, V.N. 3D Studio MAX R2.5 1998 3D Studio MAX 2 1998Carbonaro, Greg (Carbonaro, Greg) 3D Studio MAX 2.X 1998 3D STUDIO MAX FOR WINDOWSNT 1997 3D Studio max 1997 3D Studio MAX 1997 3D Studio MAX 1997 3D Studio : 3DS 1994 : 3D STUDIO 1991 30
#inlude <math.h> #inlude <stdio.h> #inlude <graphis.h> #inlude <onio.h> #inlude <bios.h> #inlude <dos.h> #inlude <stdarg.h> #inlude <iostream.h> #inlude "inverse.h" #define PI 3.1415926 int grid[32],gridnew[32],sidegrid[32]; matrix R(1,0,0,0,1,0,0,0,1),RT,Rnew; vetor p1(-52.5,90.94,-89.5),p2(105,0,-89.5),p3(-52.5,-90.94,-89.5); vetor pp1(-52.5,90.94,0),pp2(105,0,0),pp3(-52.5,-90.94,0); vetor p1new,p2new,p3new,p1p,p2p,tv(0,0,-89.5),tvnew,temptv; vetor b1(-122.5,24.65,0),b2(39.9,118.4,0),b3(82.6,93.75,0); vetor b4(82.6,-93.75,0),b5(39.9,-118.4,0),b6(-122.5,-24.65,0); float a0,as0,a2,as2,a3,as3,a1=0,a2=0,a3=0; float rolldeg,pithdeg,yawdeg,fm,f; void main(void) { int i,k=0,vgadriver=detect,vgamode; void Inversekine(void); void invgraph(void); void seteular(void); void settv(void); void nextatt(void); 31
sidegrid[0]=195; sidegrid[1]=195; sidegrid[2]=160; sidegrid[3]=170; sidegrid[4]=125; sidegrid[5]=195; sidegrid[6]=125; sidegrid[7]=250; sidegrid[8]=195; sidegrid[9]=250; sidegrid[10]=195; sidegrid[11]=195; sidegrid[12]=125; sidegrid[13]=195; sidegrid[14]=125; sidegrid[15]=250; sidegrid[16]=150; sidegrid[17]=250; sidegrid[18]=150; sidegrid[19]=230; sidegrid[20]=170; sidegrid[21]=230; sidegrid[22]=170; sidegrid[23]=250; sidegrid[24]=195; sidegrid[25]=250; sidegrid[26]=195; sidegrid[27]=195; sidegrid[28]=125; sidegrid[29]=195; sidegrid[30]=125; sidegrid[31]=250; for(i=0;i<32;i++) { grid[i]=sidegrid[i]; gridnew[i]=sidegrid[i]; } initgraph(&vgadriver,&vgamode,""); while(1) { settextstyle(small_font,horiz_dir,4); setfillstyle(solid_fill,green); bar(0,0,639,479); setfillstyle(solid_fill,white); bar(10,135,320,365); 32
setolor(black); setlinestyle(solid_line,1,thick_width); retangle(8,133,322,367); setfillstyle(solid_fill,white); bar(330,135,630,365); setolor(black); setlinestyle(solid_line,1,thick_width); retangle(328,133,632,367); setlinestyle(dotted_line,1,1); line(160,136,160,364); line(11,250,319,250); setlinestyle(dotted_line,1,1); line(480,136,480,364); line(331,313,630,313); line(331,223,630,223); setolor(black); moveto(425,455); settextstyle(triplex_font,horiz_dir,4); outtext("earthquake Room Simulation"); if(k==0) { p1new=p1; p2new=p2; k=1; } setolor(red); setlinestyle(solid_line,1,thick_width); setfillstyle(solid_fill,black); drawpoly(16,gridnew); 33
invgraph(); seteular(); /**/ settv(); /**/ } } void Inversekine(void) { a1=pithdeg/180*pi; a2=yawdeg/180*pi; a3=rolldeg/180*pi; a0=os(a1); as0=sin(a1); a2=os(a2); as2=sin(a2); a3=os(a3); as3=sin(a3); Rnew.setdata(0,0,os(a1)*os(a2)); Rnew.setdata(1,0,os(a1)*sin(a2)); Rnew.setdata(2,0,-sin(a1)); Rnew.setdata(0,1,sin(a3)*sin(a1)*os(a2)-os(a3)*sin(a2)); Rnew.setdata(1,1,os(a1)*os(a2)+sin(a3)*sin(a1)*sin(a2)); Rnew.setdata(2,1,sin(a3)*os(a1)); Rnew.setdata(0,2,sin(a3)*sin(a2)+os(a3)*sin(a1)*os(a2)); Rnew.setdata(1,2,os(a3)*sin(a1)*sin(a2)-sin(a3)*os(a2)); Rnew.setdata(2,2,os(a3)*os(a1)); Rnew.normalize(); /**/ RT=Rnew.transpose(); /* matrix */ p1new=tvnew+ve_mtr(pp1,rt); p2new=tvnew+ve_mtr(pp2,rt); p3new=tvnew+ve_mtr(pp3,rt); 34
} void invgraph(void) { int b31x1,b31x3,px1,px2,py1,py2; setfillstyle(solid_fill,blue); b31x3=480-b3.putdata(0)-28; b31x1=480-b1.putdata(0)+25; bar(b31x3,311,b31x1,315); px2=480-p2new.putdata(0); px1=480-p1new.putdata(0); py2=313+p2new.putdata(2); /* z-axil display in y-plane */ py1=313+p1new.putdata(2); setolor(red); setlinestyle(solid_line,1,norm_width); line(px2,py2-2,px1,py1-2); line(px1,py1-2,px1,py1+2); line(px1,py1+2,px2,py2+2); line(px2,py2+2,px2,py2-2); setfillstyle(solid_fill,blue); floodfill((px1+px2)/2,(py1+py2)/2,red); setolor(red); setlinestyle(solid_line,1,thick_width); line(480-b3.putdata(0),313+b3.putdata(2),px2,py2); line(480-b2.putdata(0),313+b2.putdata(2),px1,py1); line(480-b1.putdata(0),313+b1.putdata(2),px1,py1); } void seteular(void) { har h; 35
bar(5,5,635,125); gotoxy(2,2); printf(" Continue or not! (y or n) "); gotoxy(300,2); h=geth(); if((h=='n') (h=='n')) { losegraph(); return; } gotoxy(2,3); } printf(" OK!"); void settv(void) { bar(5,5,325,125); temptv.getvetor(); gotoxy(2,6); } void vetor::getvetor(void) { float move,t,time,x=0,y=0; int m; gotoxy(2,3); out<<"input the intensive value of the earthquake! (1-8)"; in >>m; if(m==1) 36
{ bar(5,5,635,125); gotoxy(2,3); out<<"the intensity is 1 degree!\n"; fm=4; f=0.099; } else if(m==2) { bar(5,5,635,125); gotoxy(2,3); out<<"the intensity is 2 degree!\n"; fm=2.44; f=0.211; } else if(m==3) { bar(5,5,635,125); gotoxy(2,3); out<<"the intensity is 3 degree!\n"; fm=1.45; f=0.295; } else if(m==4) { bar(5,5,635,125); gotoxy(2,3); out<<"the intensity is 4 degree!\n"; fm=0.88; f=0.391; } else if(m==5) 37
{ bar(5,5,635,125); gotoxy(2,3); out<<"the intensity is 5 degree!\n"; fm=0.52; f=0.497; } else if(m==6) { bar(5,5,635,125); gotoxy(2,3); out<<"the intensity is 6 degree!\n"; fm=0.3165; f=0.599; } else if(m==7) { bar(5,5,635,125); gotoxy(2,3); out<<"the intensity is 7 degree!\n"; fm=0.19; f=0.681; } else if(m==8) { bar(5,5,635,125); gotoxy(2,3); out<<"the intensity is 8 degree!\n"; fm=0.1148; 38
f=1.01; } gotoxy(2,5); out<<"input the moving time!"; in>>time; moveto(30,380); for(t=0.05;t<=time;t+=0.05) { move=exp(-t/10)*(1+0.5*sin(2*pi*fm*t))*sin(2*pi*f*t)*10; x=3; y=(move/2); setlinestyle(solid_line,1,thick_width); setolor(white); linerel(x,y); data[0]=move; data[1]=0; data[2]=0; int i; for(i=0;i<3;i++) { Tvnew.setdata(i,Tv.putdata(i)+tempTv.putdata(i)); temptv.setdata(i,0); } Inversekine(); invgraph(); delay(100); setfillstyle(solid_fill,255); bar(330,132,630,365); for(i=0;i<32;i+=2) gridnew[i]=(grid[i]+move); setolor(red); 39
} } drawpoly(16,gridnew); delay(100); bar(95,168,220,251); setlinestyle(dotted_line,1,1); line(160,136,160,364); line(11,250,319,250); setlinestyle(dotted_line,1,1); line(480,136,480,364); line(331,313,630,313); line(331,223,630,223); void matrix::normalize(void) { int i,j; float size,temp=0; for (i=0;i<3;i++) { for (j=0;j<3;j++) temp+=data[j][i]*data[j][i]; size=sqrt(temp); temp=0; for (j=0;j<3;j++) data[j][i]=data[j][i]/size; } } matrix matrix::transpose(void) { matrix result; 40
} int i,j; for (i=0;i<3;i++) for (j=0;j<3;j++) result.setdata(i,j,data[j][i]); return result; vetor operator+(vetor &a,vetor &b) { vetor ; int i; for (i=0;i<3;i++).setdata(i,a.putdata(i)+b.putdata(i)); return ; } vetor ve_mtr(vetor &a,matrix &b) { vetor result; int i,j; float temp=0; for (i=0;i<3;i++) { for (j=0;j<3;j++) temp+=a.putdata(j)*b.putdata(j,i); result.setdata(i,temp); temp=0; } return result; } 41