import processing.serial.*; //import ddf.minim.signals.*; import ddf.minim.*; import ddf.minim.analysis.*; //import ddf.minim.effects.*; /* mqoview for processing sample code. Swinging leak by Hatyune Type 1-1 2009.2.5 reco */ import javax.media.opengl.*; import processing.opengl.*; import javax.media.opengl.glu.GLU; import com.sun.opengl.util.GLUT; // 下記の2つのライブラリのインポートが必要 import jp.nyatla.kGLModel.*; import jp.nyatla.kGLModel.contentprovider.*; // KGLModelData[] model_data = new KGLModelData[100]; //モデルデータ格納用 KGLModelData[] model_data_head = new KGLModelData[8]; //モデルデータ格納用 KGLModelData[] model_data_body = new KGLModelData[8]; //モデルデータ格納用 KGLModelData[] model_data3 = new KGLModelData[2]; //モデルデータ格納用 KGLModelData[] model_data4 = new KGLModelData[7]; //モデルデータ格納用 KGLModelData model_data_rin; //モデルデータ格納用 KGLModelData model_data_haku; //モデルデータ格納用 KGLModelData model_data_wall; //モデルデータ格納用 KGLModelData[] model_data_buzz = new KGLModelData[2]; //モデルデータ格納用 KGLModelData[] model_data_laptop = new KGLModelData[2]; //モデルデータ格納用 //KGLModelData model_data_negi; //モデルデータ格納用 ContentProvider content_provider; //読み込みファイル・URL格納 PFont font; GLU glu; GLUT glut; float a; // 回転数を保持(デモ用) int play_frame=0; int n_anim = 24; //アニメーション枚数 float anim_per_frame = 1; //1枚のアニメを表示するフレーム数 frame_rate / anim_per_frame = 秒毎のコマ数 boolean load_model = false; // ロードフラグ(ロード完了で1を返す) int play_anim_no; int anim_count=0; int auto_mode = 0; int fft_mode = 0; int n_manual_swing=0; int n_total_manual_swing=0; int automode_pointer = 0; boolean f_draw_wall= true; int t1=0,t2=0; float anim_speed = 170; int scene2count = 0; int scene21count = 0; int scene21count2 = 0; boolean f_ddd = true; //for dolly int ddd =0; //for dolly int pmillis = 0; // for sleeping animation int skipcount= 0; // for test only int f_animation; //アニメーション中かを華を判断する int f_sleep = 0; // is sleeping?? int f_hitention = 0; // is hitention?? int camera_angle = 1; //カメラアングルを決定します float hatyune_rotate_speed = 0; // 回転スピードです。(単位ラジアンです)フレーム毎にこの値が加算されます float eyeX =0, eyeY =0, eyeZ = 4; float vpX =0, vpY =0, vpZ = 0; boolean eyemode = true; int movemode =1; //視点変更とかのモード float objX=0, objY=0, objZ=0; float objRX=0, objRY=0, objRZ=0; Minim minim; AudioPlayer player; int playhead = 0; int framecount=0; //------------ // for audio analysis FFT fft; //------------------------------- int[] autodata = new int[255]; int[] autodata2 = new int[255]; int[] autodatas = new int[255]; int[] autodatas2 = new int[255]; //------------------------------- void setup() { size(800, 600, OPENGL); frameRate(24); background(128); // colorMode(RGB, 100); font=createFont("FFScala", 12); // font2 = loadFont("VL-PGothic-Regular-16.vlw"); // String[] lines = loadStrings("http://cgi.hyde-ysd.com/reco-memo/Proce55ing/sample/miku_swing_leak2/leakcounter1.cgi?s=1"); minim = new Minim(this); player = minim.loadFile("IevanPolkka_miku.mp3"); fft = new FFT(player.bufferSize(), player.sampleRate()); // automation data load String datalines[] = loadStrings("roitsuma_analysis_data.csv"); // println("there are " + datalines.length + " lines"); for (int i=0; i < datalines.length; i++) { String[] tmp = split(datalines[i], ','); // autodata[i] = new int[2]; // autodata[i] = int(int(tmp[0])*33.33333333333f); autodata[i] = int(tmp[0]); // autodata2[i] = int(tmp[1]); // println(autodata[i]+":"+autodata2[i]); } String datalines2[] = loadStrings("roitsuma_analysis_data2.csv"); // println("there are " + datalines.length + " lines"); for (int i=0; i < datalines2.length; i++) { String[] tmp = split(datalines2[i], ','); // autodata[i] = new int[2]; // autodatas[i] = int(int(tmp[0])*33.33333333333f); autodatas[i] = int(tmp[0]); autodatas2[i] = int(tmp[1]); } glu = new GLU(); glut = new GLUT(); glu.gluPerspective(30.0, (double)width / (double)height, -500, 200.0); } //読み込みファイルを指定 //ローカルファイルの場合は、LocalContentProviderを使用 フルパスで記入する事。 //Httpアクセスの場合は相対アクセスでOK //content_provider = new HttpContentProvider(this, "http://www.hyde-ysd.com/reco-memo/MQOData/miku01_BONE7.mqo.txt"); // (サーバーの制限の問題で、拡張子がMQOのままUpできないため、拡張子がtxtになってます。 //miku01_xxxx.mqoは、三次元CG@七葉よりお借りしてます。利用条件はそちらに従ってください。 // 2009/4/13 //アニメーション(ぱらぱら漫画方式)は大量のモデルデータを読み込むため、 //Zip圧縮してあるデータにも対応しました。 Ver0.4以降 //LocalZipContentProvider(PAplet this, String ZipFilename, String MQOFilename) //HttplZipContentProvider(PAplet this, String ZipFile_URL, String MQOFilename) //テクスチャなどがある場合は、同じZIPファイル内に格納してください。 void loadModels() { textFont(font,15.0); fill(200,0,0); //OpenGLハンドルの取得 PGraphicsOpenGL pgl = (PGraphicsOpenGL) g; // g may change GL gl = pgl.beginGL(); // always use the GL object returned by beginGL content_provider = new HttpZipContentProvider(this, "http://www.hyde-ysd.com/reco-memo/MQOData/mqozipdatas0005.zip","miku_righthand2_0000.mqo"); // content_provider = new LocalZipContentProvider(this, "e:\\tmp\\MQOData\\mqozipdatas0005.zip","miku_righthand2_0000.mqo"); for(int i=0;i9 ? "":"0") +i+".mqo"; tmpstr = "miku_righthand2_00" + (i>9 ? "":"0") +i+".mqo"; println(tmpstr); // ZIPファイルの場合、下記関数で読み込みファイルを指定することで、再読み込みなしで実行が可能 // 特に通信環境の時には通信量が節約できるため、ローディング時間の短縮が期待できる content_provider.ChangeEntry(tmpstr); model_data[i] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; } content_provider.ChangeEntry("miku_head_normal.mqo"); model_data_head[0] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("miku_head_normal.mqo"); content_provider.ChangeEntry("miku_head_hard.mqo"); model_data_head[1] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("miku_head_hard.mqo"); content_provider.ChangeEntry("miku_head_soft.mqo"); model_data_head[2] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("miku_head_soft.mqo"); content_provider.ChangeEntry("miku_body.mqo"); model_data_body[0] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("miku_body.mqo"); for(int i=1;i<=2;i++) { content_provider.ChangeEntry("mqodatas_sleep"+i+".mqo"); model_data3[i-1] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("mqodatas_sleep"+i+".mqo"); } for(int i=0;i<7;i++) { content_provider.ChangeEntry("mqodatas_sleep"+(i+3)+".mqo"); model_data4[i] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("mqodatas_sleep"+(i+3)+".mqo"); } // content_provider = new LocalZipContentProvider(this, "e:\\tmp\\MQOData\\mqozipdatas0004.zip","rin_stop10000.mqo"); content_provider = new HttpZipContentProvider(this, "http://www.hyde-ysd.com/reco-memo/MQOData/mqozipdatas0004.zip","rin_stop10000.mqo"); /* model_data_rin = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; content_provider.ChangeEntry("haku_sitting20000.mqo"); println("rin"); model_data_haku = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("haku"); */ content_provider.ChangeEntry("roituma_wall_all.mqo"); model_data_wall = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("wall"); content_provider.ChangeEntry("buzzer1.mqo"); model_data_buzz[0] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("buzz1"); content_provider.ChangeEntry("buzzer2.mqo"); model_data_buzz[1] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("buzz2"); content_provider.ChangeEntry("laptoppc.mqo"); model_data_laptop[0] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("laptop"); content_provider.ChangeEntry("laptoppc2.mqo"); model_data_laptop[1] = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ; println("laptop2"); pgl.endGL(); load_model = true; play_anim_no = 1; } int f_getspeed; //------------ int detect_by_fft=0; int p_fft_hit=0, fft_unhit = -1; int fft_center = 1640, fft_range = 10, fft_border = 22; int detect_swing_by_audio() { fft.forward(player.mix); int fft_hit = 0, ret = 0; fft.forward(player.mix); // int center = 1325, range = 130, border = 50; int tmp = fft.freqToIndex(fft_center-fft_range); int tmp2 = fft.freqToIndex(fft_center+fft_range); for(int i=tmp; i<=tmp2; i++) { if( fft.getBand(i) >= fft_border)fft_hit+=1; } if(fft_hit > 0 && p_fft_hit == 0) { detect_by_fft++; p_fft_hit = 1; fft_unhit = -1; } if(fft_hit == 0 && fft_unhit != -1 && player.position() - fft_unhit > 250) { p_fft_hit = 0; } if(fft_hit == 0 && p_fft_hit != 0 && fft_unhit == -1) { fft_unhit = player.position(); } if(detect_by_fft>=1) { ret = 1; detect_by_fft = 0; } return ret; } void draw() { background(128); textFont(font,12.0); fill(200,0,0); if(millis()<5000) { text("Initializing........",10,250); return; } if(load_model==false) { text("Now Loading........",100,200); loadModels(); } framecount++; int fft_detect = 0; if(fft_mode==1) { fft_detect = detect_swing_by_audio(); if( fft_detect != 0 ) { mouseClicked(); textFont(font,20.0); text("FFT detect",5,250); textFont(font,12.0); } } if(f_animation != 0) { animation_frame_up(); f_sleep = 0; } else { if(auto_mode != 1) { if( millis() - p_playedtime2 > 1500) { // println(millis() - p_playedtime); f_sleep = 1;; } } } text("playframe(total):" + play_frame + " show_animation_no:" + play_anim_no,0,20); text("speed:"+anim_speed,0,40); text("fps:"+getfps(),0,60); String tmpstr = ""; if(player.isMuted()==true)tmpstr+="Mute "; if(auto_mode==1)tmpstr+="Auto "; if(fft_mode==1)tmpstr+="FFT "; text(tmpstr,0,80); text(n_total_manual_swing+"Swing(manual)",700,20); // writeInstruction(); writeCopyrights(); checkmusicstop(); int scene = getScene(); text("f_animation:"+f_animation,10,280); text("scene:"+scene+" Playhead:"+player.position(),10,300); text("eye:"+eyeX+","+eyeY+","+eyeZ,10,316); text("vp:"+vpX+","+vpY+","+vpZ,10,332); // text("objX:"+objX+","+objY+","+objZ,10,348); // text("objX:"+objRX+","+objRY+","+objRZ,10,364); text("a:"+a,10,380); text("movemode:"+movemode,10,396); PGraphicsOpenGL pgl = (PGraphicsOpenGL) g; // g may change GL gl = pgl.beginGL(); // always use the GL object returned by beginGL gl.glColor4f(0.7, 0.7, 0.7, 0.8); //おまじない gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE); gl.glEnable(GL.GL_CULL_FACE); gl.glCullFace(GL.GL_FRONT); //--------- // float[] lt0_position = {0,0,0,0}; // float[] lt0_position = {30,-50,30,0}; // float[] lt1_position = {0,50,0,0}; float[] lt0_ambient = {0.1f, 0.1f, 0.1f, 1.0f}; //.5 float[] lt0_diffuse = {0.3f, 0.3f, 0.3f, 1.0f}; //.8 float[] lt0_specular = { 1.0f, 1.0f, 1.0f, 1.0f}; // float emerald_ambient[] = {0.0215f, 0.1745f, 0.0215f, 1.0f}, // emerald_diffuse[] = {0.07568f, 0.61424f, 0.07568f, 1.0f}, // emerald_specular[] = {0.633f, 0.727811f, 0.633f, 1.0f}, // emerald_shininess[] = {76.8f}; /* gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // gl.glEnable(GL.GL_LIGHTING); gl.glEnable(GL.GL_DEPTH_TEST); // // gl.glLightfv( GL.GL_LIGHT0, GL.GL_POSITION, lt0_position,0); gl.glLightfv( GL.GL_LIGHT0, GL.GL_AMBIENT, lt0_ambient,0); gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, lt0_diffuse, 0); gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR,lt0_specular, 0); gl.glEnable(GL.GL_LIGHT0); /* gl.glLightfv( GL.GL_LIGHT1, GL.GL_POSITION, lt1_position,0); gl.glLightfv( GL.GL_LIGHT1, GL.GL_AMBIENT, lt0_ambient,0); gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE, lt0_diffuse, 0); gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR,lt0_specular, 0); gl.glEnable(GL.GL_LIGHT1); */ //------------ // glu.gluLookAt(eyeX, eyeY, eyeZ, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // eyeX = 0.0f; eyeY = 0.0f; eyeZ = 4.0f; // vpX = 0; vpY =0; vpZ = 0; //視点変更とか /* switch(camera_angle) { case 2: //ちょっと上 eyeX = 0.0f; eyeY = -2.0f; eyeZ = 3.0f; // gl.glRotatef(-50, 1, 0, 0); break; case 3: //ちょっと上空 eyeX = 0.0f; eyeY = -2.0f; eyeZ = 3.0f; // gl.glTranslatef(0, 145, 1200); // gl.glRotatef(-70, 1, 0, 0); break; case 4: //どん引き eyeX = 0.0f; eyeY = -2.0f; eyeZ = 3.0f; break; case 5: /// Up1 eyeX = 0.0f; eyeY = -2.0f; eyeZ = 3.0f; // gl.glTranslatef(20, -80, -250); break; case 6: // gl.glTranslatef(50, -150, -370); // Up2 eyeX = 0.0f; eyeY = -2.0f; eyeZ = 3.0f; break; case 7: // Low Angle eyeX = 0.0f; eyeY = -2.0f; eyeZ = 3.0f; // gl.glRotatef(20, 1, 0, 0); break; */ switch(camera_angle) { case 8: vpX = 0; vpY =0; vpZ = 0; if(ddd<70) { eyeX =-800.0f; eyeY = -695.0f + (ddd * 5); eyeZ = -3000.0f + ddd*30; } if(ddd>=30 && ddd<130) { eyeX =-800.0f + (ddd-30)*8; eyeY = -695.0f + (ddd * 5); eyeZ = -3000.0f + ddd*30; } if(ddd>=130 && ddd<140) { eyeX = 0.0f; eyeY = -695.0f + (ddd * 5); eyeZ = 903.0f - (ddd-130)*100; } ddd_count(140); break; case 9: vpX = 0; vpY =0; vpZ = 0; if(ddd<10) { eyeX = 0.0f - (ddd * 2.5); vpX = 0.0f - (ddd * 2.5); eyeY = 0.0f - (ddd * 5); vpY = 0.0f - (ddd * 5); eyeZ = 0.0f - (ddd * 18); vpZ = -300; } if(ddd>=10 && ddd<=20) { eyeX = -25.0f - ((ddd-10) * 2.5); vpX = -25.0f - ((ddd-10) * 2.5); eyeY = -50.0f - ((ddd-10) * 5); vpY = -50.0f - ((ddd-10) * 5); eyeZ = -180.0f - ((ddd-10) * 21); vpZ = -720; } ddd_count(20); break; case 10: if(ddd==0) { vpX = 0; vpY =0; vpZ = 0; } if(ddd<50) { eyeX = 0.0f + (ddd * 28); vpX = 0.0f + (ddd * 20.74); eyeY = 0.0f - (ddd * 2.22); vpY = 0.0f - (ddd * 0.6); eyeZ = 4.0f - (ddd * 2.4); vpZ = 0.0f - (ddd * 22); } /* if(ddd>=50 && ddd<=100) { eyeX = 1400.0f; vpX = 1037.0f; eyeY = -111.0f; vpY = 30.0f; eyeZ = -120.0f - ((ddd-50) * 47); vpZ = -1100.0f - ((ddd-50) * 48); } */ if(ddd>=50 && ddd<=150) { eyeX = 1400.0f; vpX += (1737f - vpX) / 5f; eyeY += (-71f - eyeY) / 5f; vpY += (0 - vpY)/5f; eyeZ += (-3100f - eyeZ) / 5f; vpZ += (-3700f - vpZ) / 5f; } /* if(ddd>=75 && ddd<=150) { eyeX = 1400.0f; vpX = 1037.0f + ((ddd-75) * 9.33); eyeY = -111.0f + ((ddd-75) * .53); vpY = 30.0f + ((ddd-75) * 0.4); eyeZ = -120.0f - ((ddd-50) * 25.2); vpZ = -1100.0f - ((ddd-50) * 48); } */ /* if(ddd>=100 && ddd<=150) { eyeX = 1400.0f; vpX = 1037.0f + ((ddd-75) * 9.33); eyeY = -111.0f + ((ddd-75) * .53); vpY = 30.0f + ((ddd-75) * 0.4); eyeZ = -2500f - ((ddd-100) * 12); vpZ = -3500.0f - ((ddd-100) * 4); } */ if(ddd>=151) { eyeX = 1400.0f; vpX = 1737f; eyeY = -71f; vpY = 0.0f; eyeZ = -3100f; vpZ = -3700.0f; } ddd_count(200); break; case 11: vpX = 0; vpY =0; vpZ = 0; if(ddd<20) { eyeX = 0.0f - (ddd * 50); vpX = 0.0f - (ddd * 48); // eyeY = 0.0f - (ddd * -1.31); // vpY = 0.0f - (ddd * -1.70); eyeY = 0.0f; vpY = 0.0f; eyeZ = 0.0f - (ddd * 20); vpZ = 0.0f - (ddd * 750); } if(ddd>=20 && ddd<=30) { eyeX = -1001.0f; vpX = -960.0f; eyeY = 0f; vpY = 0f; eyeZ = -400.0f - ((ddd-20) * 150); vpZ = -1500f - ((ddd-20) * 60);; } if(ddd>=30 && ddd<=40) { eyeX = -1001.0f - ((ddd-30) * -88); vpX = -960.0f - ((ddd-30) * -93.7); eyeY = 0f - ((ddd-30) * -13.1); vpY = 0f - ((ddd-30) * -17); eyeZ = -1850.0f; vpZ = -2100f; } ddd_count(40); break; } glu.gluLookAt(eyeX, eyeY, eyeZ, vpX, vpY, vpZ, 0.0, 1.0, 0.0); //位置調整 gl.glTranslatef(width/2, height*2/3, 0); //座標系の調整。 //(Processingは左上が0,0、一方メタセコは、中心が0,0で右上方向に軸が進むため gl.glRotatef(180, 0, 0, 1); gl.glRotatef(180, 0, 1, 0); // glu.gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 描画毎に aだけ回転(デモ用) gl.glRotatef(a, 0, 1, 0); switch(scene) { case 0: case 1: case 31: // スケールは各自調整してください。 // openGLの1.0fとは全然違うので、注意が必要。 // 枚数* // println(play_frame + " " + play_anim_no); model_data[play_anim_no].enables(100.0f) ; // model_data.draw() ; model_data[play_anim_no].draw() ; if(scene == 31) model_data_head[2].draw() ; else model_data_head[0].draw() ; model_data_body[0].draw() ; // model_data[play_anim_no].disables() ; break; case 2: model_data3[scene2count].enables(100.0f) ; model_data3[scene2count].draw() ; model_data3[scene2count].disables() ; if(millis()-pmillis>1000) { if(scene2count==0)scene2count=1; else scene2count=0; pmillis = millis(); } break; case 301: gl.glPushMatrix(); gl.glTranslatef(0,2f,0); model_data[play_anim_no].enables(100.0f) ; // model_data.draw() ; model_data[play_anim_no].draw() ; model_data_body[0].draw() ; model_data_head[1].draw() ; model_data[play_anim_no].disables() ; gl.glPopMatrix(); break; case 3: model_data[play_anim_no].enables(100.0f) ; // model_data.draw() ; model_data[play_anim_no].draw() ; model_data_body[0].draw() ; model_data_head[1].draw() ; model_data[play_anim_no].disables() ; break; case 4: case 5: case 6: case 7: model_data[play_anim_no].enables(100.0f) ; // model_data.draw() ; gl.glPushMatrix(); model_data[play_anim_no].draw() ; model_data_head[0].draw() ; model_data_body[0].draw() ; if(scene == 5 || scene == 6 || scene == 7) { gl.glTranslatef(2, 0, 2); model_data[play_anim_no].draw() ; model_data_head[0].draw() ; model_data_body[0].draw() ; // model_data[play_anim_no].draw() ; gl.glTranslatef(-4, 0, 0); model_data[play_anim_no].draw() ; model_data_head[1].draw() ; model_data_body[0].draw() ; } if(scene == 6 || scene == 7) { gl.glTranslatef(-2, 0, 2); model_data[play_anim_no].draw() ; model_data_head[0].draw() ; model_data_body[0].draw() ; gl.glTranslatef(3, 0, 0); if(scene == 7) model_data3[scene2count].draw() ; else { model_data[play_anim_no].draw() ; model_data_head[0].draw() ; model_data_body[0].draw() ; } gl.glTranslatef(3, 0, 0); model_data[play_anim_no].draw() ; model_data_head[0].draw() ; model_data_body[0].draw() ; gl.glTranslatef(3, 0, 0); model_data[play_anim_no].draw() ; model_data_head[0].draw() ; model_data_body[0].draw() ; if(millis()-pmillis>1000) { if(scene2count==0)scene2count=1; else scene2count=0; pmillis = millis(); } } /* if(scene == 7) { gl.glTranslatef(2, 0, 2); model_data[play_anim_no].draw() ; model_data_head[0].draw() ; model_data_body[0].draw() ; for(int j=0;j<7;j++) { gl.glTranslatef(-2, 0, 0); model_data[play_anim_no].draw() ; model_data_head[0].draw() ; model_data_body[0].draw() ; } } */ gl.glPopMatrix(); model_data[play_anim_no].disables() ; break; case 20: model_data3[scene2count].enables(100.0f); model_data3[scene2count].draw(); // model_data.draw() ; gl.glPushMatrix(); gl.glTranslatef(2, 0, 2); model_data3[scene2count].draw(); gl.glTranslatef(-4, 0, 0); model_data3[(scene2count==1?0:1)].draw(); gl.glTranslatef(-2, 0, 2); model_data3[(scene2count==1?0:1)].draw(); gl.glTranslatef(3, 0, 0); model_data3[scene2count].draw(); gl.glTranslatef(3, 0, 0); model_data3[(scene2count==1?0:1)].draw(); gl.glTranslatef(3, 0, 0); model_data3[scene2count].draw(); if(millis()-pmillis>1000) { if(scene2count==0)scene2count=1; else scene2count=0; pmillis = millis(); } gl.glPopMatrix(); model_data3[scene2count].disables() ; break; case 21: model_data4[scene21count].enables(100.0f); model_data4[scene21count].draw(); // model_data.draw() ; gl.glPushMatrix(); gl.glTranslatef(2, 0, 2); model_data4[scene21count2].draw(); gl.glTranslatef(-4, 0, 0); model_data4[scene21count].draw(); gl.glTranslatef(-2, 0, 2); model_data4[scene21count].draw(); gl.glTranslatef(3, 0, 0); model_data4[scene21count2].draw(); gl.glTranslatef(3, 0, 0); model_data4[scene21count].draw(); gl.glTranslatef(3, 0, 0); model_data4[scene21count2].draw(); gl.glPopMatrix(); model_data4[scene21count].disables() ; scene21count++; if(scene21count>=4)scene21count2++; if(scene21count>6)scene21count=6; if(scene21count2>6)scene21count2=6; break; } if(f_draw_wall) { gl.glPushMatrix(); model_data_wall.enables(1.0f) ; gl.glTranslatef(0, 0, 8); model_data_wall.draw() ; // model_data_wall.disables() ; /* model_data_rin.enables(1.0f) ; gl.glTranslatef(6, 0, 8); model_data_rin.draw() ; gl.glTranslatef(-12, 0, 0); gl.glRotatef(180,0, 1, 0); model_data_haku.enables(2.5f) ; model_data_haku.draw() ; model_data_rin.disables() ; */ gl.glPopMatrix(); } /* gl.glPushMatrix(); // gl.glTranslatef(objX, objY, objZ); // gl.glRotatef(objRX, 1,0,0); // gl.glRotatef(objRY, 0,1,0); // gl.glRotatef(objRZ, 0,0,1); gl.glTranslatef(3.05f, 0f,12.65f); gl.glRotatef(0, 1,0,0); gl.glRotatef(26, 0,1,0); gl.glRotatef(0, 0,0,1); model_data_laptop[0].enables(1.3f) ; model_data_laptop[0].draw() ; gl.glPopMatrix(); */ if(fft_mode==1) { gl.glPushMatrix(); if( fft_detect == 0 ) { gl.glTranslatef(-2.25, 0.2f, 0); model_data_buzz[0].enables(0.2f) ; model_data_buzz[0].draw() ; // model_data_buzz[0].disables() ; } else { gl.glTranslatef(-2.25, 0.2f, 0); model_data_buzz[1].enables(0.2f) ; model_data_buzz[1].draw() ; // model_data_buzz[1].disables() ; } gl.glPopMatrix(); int fft_tmp = fft.freqToIndex(fft_center-fft_range); int fft_tmp2 = fft.freqToIndex(fft_center+fft_range); float fft_disp_scale = 0.005f; float fft_draw_win_size =fft.specSize()*fft_disp_scale; float fft_power; gl.glPushMatrix(); gl.glTranslatef(2.25f, 0.2f, 0); gl.glBegin(GL.GL_LINES); gl.glColor3f(0,1,0); gl.glVertex3f(0, fft_border*fft_disp_scale, 0); gl.glVertex3f(fft_draw_win_size*fft_disp_scale, fft_border*fft_disp_scale, 0); for(int i = 0; i < fft.specSize(); i++) { fft_power = fft.getBand(i); if((i*1)>=(fft_tmp) && (i*1)<=fft_tmp2 && fft_power >= fft_border) { gl.glColor3f(1,0,0); } else gl.glColor3f(1,1,1); gl.glVertex3f((float)i*fft_disp_scale, 0, 0); gl.glVertex3f((float)i*fft_disp_scale, fft_power*fft_disp_scale, 0); } gl.glEnd(); gl.glPopMatrix(); gl.glPushMatrix(); gl.glTranslatef(-3.05f, 0f,12.65f); gl.glRotatef(0, 1,0,0); gl.glRotatef(26, 0,1,0); gl.glRotatef(0, 0,0,1); model_data_laptop[1].enables(1.3f) ; model_data_laptop[1].draw() ; gl.glTranslatef(-0.41f, 0.08f,0.36f); gl.glRotatef(19, 1,0,0); // gl.glTranslatef(objX, objY, objZ); // gl.glRotatef(objRX, 1,0,0); // gl.glRotatef(objRY, 0,1,0); // gl.glRotatef(objRZ, 0,0,1); gl.glBegin(GL.GL_LINES); gl.glColor3f(0,1,0); gl.glVertex3f(0, fft_border*fft_disp_scale, 0); gl.glVertex3f(250f*0.7f*fft_disp_scale, fft_border*fft_disp_scale, 0); // for(int i = 0; i < fft.specSize(); i++) for(int i = 0; i < 250; i++) { fft_power = fft.getBand(i); if((i*1)>=(fft_tmp) && (i*1)<=fft_tmp2 && fft_power >= fft_border) { gl.glColor3f(1,0,0); } else gl.glColor3f(1,1,1); gl.glVertex3f((float)i*fft_disp_scale*0.70, 0, 0); gl.glVertex3f((float)i*fft_disp_scale*0.70, (fft_power*fft_disp_scale>0.6f?0.6f:fft_power*fft_disp_scale), 0); } gl.glEnd(); gl.glPopMatrix(); } else { gl.glPushMatrix(); gl.glTranslatef(-3.05f, 0f,12.65f); gl.glRotatef(0, 1,0,0); gl.glRotatef(26, 0,1,0); gl.glRotatef(0, 0,0,1); model_data_laptop[0].enables(1.3f) ; model_data_laptop[0].draw() ; gl.glPopMatrix(); } model_data[0].disables() ; pgl.endGL(); // a += 0.5; a += hatyune_rotate_speed; play_frame += 1; } void mouseClicked() { if(f_animation == 0) { f_animation = 1; // player.resume(); if(player.isPlaying()==false) player.play(playhead); // if(player.isPlaying() == false)player.loop(); n_manual_swing++; n_total_manual_swing++; }else if(play_anim_no > 16) { f_animation += 1; n_manual_swing++; n_total_manual_swing++; } if(f_animation != 0) { if(millis() -p_playedtime2<100)f_hitention=0; else f_hitention=0; } } void SendSwingData() { // String[] lines = loadStrings("http://cgi.hyde-ysd.com/reco-memo/Proce55ing/sample/miku_swing_leak2/leakcounter1.cgi?n="+n_manual_swing); // n_total_manual_swing += n_manual_swing; n_manual_swing=0; } void keyPressed() { float deye = 10; switch(movemode) { case 1: switch(key) { case '7': if(abs(eyeX)<=30)deye=1; if(abs(eyeX)>=500)deye=100; eyeX += deye; break; case '9': if(abs(eyeX)<=30)deye=1; if(abs(eyeX)>=500)deye=100; eyeX -= deye; break; case '4': if(abs(eyeY)<=30)deye=1; if(abs(eyeY)>=500)deye=100; eyeY += deye; break; case '1': if(abs(eyeY)<=30)deye=1; if(abs(eyeY)>=500)deye=100; eyeY -= deye; break; case '5': if(abs(eyeZ)<=30)deye=1; if(abs(eyeZ)>=500)deye=100; eyeZ += deye; break; case '2': if(abs(eyeZ)<=30)deye=1; if(abs(eyeZ)>=500)deye=100; eyeZ -= deye; break; } break; //-------- case 2: switch(key) { case '7': if(abs(eyeX)<=30)deye=1; if(abs(eyeX)>=500)deye=100; vpX += deye; break; case '9': if(abs(eyeX)<=30)deye=1; if(abs(eyeX)>=500)deye=100; vpX -= deye; break; case '4': if(abs(eyeY)<=30)deye=1; if(abs(eyeY)>=500)deye=100; vpY += deye; break; case '1': if(abs(eyeY)<=30)deye=1; if(abs(eyeY)>=500)deye=100; vpY -= deye; break; case '5': if(abs(vpZ)<=30)deye=1; if(abs(vpZ)>=500)deye=100; vpZ += deye; break; case '2': if(abs(vpZ)<=30)deye=1; if(abs(vpZ)>=500)deye=100; vpZ -= deye; break; } break; //-------- case 3: switch(key) { case '7': objX -= 0.01f; break; case '9': objX += 0.01; break; case '4': objY += 0.01f; break; case '1': objY -= 0.01f; break; case '5': objZ += 0.01f; break; case '2': objZ -= 0.01f; break; } break; //-------- case 4: switch(key) { case '7': objRX -= 1f; break; case '9': objRX += 1f; break; case '4': objRY += 1f; break; case '1': objRY -= 1f; break; case '5': objRZ += 1f; break; case '2': objRZ -= 1f; break; } break; } switch(key) { case 'a': if(auto_mode == 1)auto_mode = 0; else auto_mode = 1; break; case 'f': if(fft_mode == 1)fft_mode = 0; else { fft_mode = 1; anim_speed = 300; if(player.isPlaying()==false) player.play(player.position()); } // return; break; case 'z': anim_speed -= 10; break; case 'c': anim_speed += 10; break; case 'r': hatyune_rotate_speed += 0.125; break; case 'R': hatyune_rotate_speed=0; break; case 'Q': a =0; eyeX =0; eyeY =0; eyeZ = 4; vpX =0; vpY =0; vpZ = 0; break; case 'm': if(player.isMuted()==true)player.unmute(); else player.mute(); break; /* case '1': case '2': case '3': case '4': case '5': case '6': case '7': camera_angle = int(key)-48; break; case '8': // anim_speed = 100; ddd = 0; camera_angle = 8; break; case '9': anim_speed = 350; break; */ case 'e': movemode++; // if(movemode>=5)movemode=1; if(movemode>=3)movemode=1; break; case 's': camera_angle++; if(camera_angle>=12)camera_angle=1; setCameraAngle(camera_angle); break; case 'S': if(camera_angle<20) camera_angle = 20; else camera_angle++; if(camera_angle>=28)camera_angle=20; setCameraAngle(camera_angle); break; case ']': camera_angle=11; setCameraAngle(camera_angle); break; case 'k': f_ddd=true; break; case 'l': f_ddd=false; break; case 'j': f_ddd=true; ddd=0; break; case 'h': println(player.position()); break; case '@': player.pause(); player.play(0); automode_pointer = 0; break; case 'b': if(f_draw_wall)f_draw_wall=false; else f_draw_wall = true; break; case 'K': automode_pointer = 0; player.pause(); switch(skipcount) { case 0: // player.play(40000); // player.play(80000); player.play(80000); break; case 1: player.play(130000); break; case 2: player.play(90000); break; } skipcount++; if(skipcount>1)skipcount=0; break; } } int p_playedtime = 0; int p_playedtime2 = 0; void animation_frame_up() { int playtime = millis(); int past_time; past_time = playtime - p_playedtime; if(past_time < 500) { anim_count += (past_time / (float)(1000/(float)n_anim))*anim_speed; // anim_count += anim_speed; } else { anim_count = int(anim_speed); } p_playedtime = playtime; p_playedtime2 = playtime; if(anim_count >= n_anim * 100) { anim_count %= n_anim * 100; f_animation -= 1; } play_anim_no = int(anim_count / 100); // if(play_anim_no>12)anim_speed *= .8; if(f_animation == 0) { if(auto_mode == 1) { /* int t_playhead = int(float(player.position()) / 33.333333f); if( (t_playhead >= 965 && t_playhead <= 990) || (t_playhead >= 0 && t_playhead <= 508) || (t_playhead >= 1445 && t_playhead <= 1970) || (t_playhead >= 2410 && t_playhead <= 2440) || (t_playhead >= 2920 && t_playhead <= 2926) || (t_playhead >= 3380 && t_playhead <= 3385) || (t_playhead >= 3863 && t_playhead <= 3873) ) { } else { f_animation += 1; } */ play_anim_no=0; p_playedtime = 0; } else { play_anim_no=0; p_playedtime = 0; } } } int fps_count = 1; int fps = 0; int p_t1 = 0; int getfps() { fps_count++; int tmp_t1; tmp_t1 = millis(); if(fps_count==24) { fps = 1000/((tmp_t1 - p_t1) / 24); fps_count=0; p_t1 = tmp_t1; } return fps; } void writeInstruction() { /* textFont(font2,12.0); fill(255,255,255); text("操作:",0,500); text("Mouse: L button: ネギ振り",600,520); text("振り終わりでタイミング良く押すと連続して振れます",600,520); text("Keyboard:",600,540); text("r: 回転",600,560); text("数字: 視点変更",600,560); // 実行時メモリ節約とローディング時間短縮のため英語表記にしています。 */ textFont(font,12.0); fill(255,255,255); int tmp_y_pos = 450; text("Instruction:",5,tmp_y_pos); text("Mouse: L button: Swinging leak",5,tmp_y_pos+16); text("If you push around end of animation, you can swing continuously",5,tmp_y_pos+32); text("'a' automode on/off (swing leak)",5,tmp_y_pos+48); text("r: rotaion, R:stop rotation",5,tmp_y_pos+64); text("number[1]-[7]: changing view",5,tmp_y_pos+80); text("number[8][9]: speed preset, 8:normal 9:3.5times faster",5,tmp_y_pos+96); text("z,c: change speed",5,tmp_y_pos+108); text("m: mute",5,tmp_y_pos+124); } void writeCopyrights() { // 実行時メモリ節約とローディング時間短縮のため英語表記にしています。 /* textFont(font2,12.0); fill(0,0,0); text("モデルデータ '三次元CG@七葉'",600,500); text("http://nanoha.kirara.st/3dcg/",600,520); text("モデル作成:ズサさん, モーションデータ:4169さん'",600,540); text("偉大なる元動画:VOCALOID2 初音ミクに「Ievan Polkka」を歌わせてみた",500,560); text("http://www.nicovideo.jp/watch/sm982882",600,580); */ textFont(font,12.0); fill(0,0,0); text("Model datas come form '3DCG@nanoha'",550,440); text("http://nanoha.kirara.st/3dcg/",550,456); text("Modeled by (Hatyune/Kagwamine)'Zusa' and reco(modified partly)",550,472); text("(Haku)....(RoadRoller)T@ka-P",550,486); text("Motion data createrd by '4169' and reco",550,520); text("Music: IevanPolkka(miku)",550,536); text("by Otomania(http://www.otomania.net/)",550,552); text("Respecting Original Movie:",500,568); text("VOCALOID2 Hatune Miku singing 'Ievan Polkka'",520,584); text("http://www.nicovideo.jp/watch/sm982882",540,600); } int timer_musicstop; void checkmusicstop() { if(auto_mode == 1 || fft_mode == 1) { if(player.isPlaying()==false) player.loop(1); return; } if(player.isPlaying()==true && player.isLooping() == false) { if(player.position() > player.length()-1500) { player.loop(1); SendSwingData(); automode_pointer = 0; } } if(f_animation !=0 || player.isPlaying()==false) { timer_musicstop = 0; return; } int pos = player.position(); if(timer_musicstop == 0 || getScene() == 20 || getScene() == 0) { timer_musicstop = millis(); } else { if(getScene() == 2) { if(pos > 49500 && pos <=64800) { timer_musicstop = millis(); return; } } if(millis() - timer_musicstop > 1500) { player.pause(); playhead = player.position(); timer_musicstop = 0; SendSwingData(); } } } void stop() { // always close Minim audio classes when you are done with them SendSwingData(); player.close(); // always stop Minim before exiting. minim.stop(); super.stop(); } int p_action = 0; int getScene() { int pos = player.position(); int pos_frame = int((float)pos / 33.33333f); int pos_frame1 = pos_frame - 0; int pos_frame2 = pos_frame + 1; int ret = 1; if(fft_mode != 1 && auto_mode != 1) { // if(int(pos / 1000) == 17)mouseClicked(); } int scene_action=0; if(auto_mode==1) { /* if(pos_frame >= 992 && pos_frame <= 994)mouseClicked(); if(pos_frame >= 1963 && pos_frame <= 1965)mouseClicked(); if(pos_frame >= 2442 && pos_frame <= 2445)mouseClicked(); if(pos_frame >= 2926 && pos_frame <= 2928)mouseClicked(); if(pos_frame >= 3387 && pos_frame <= 3389)mouseClicked(); if(pos_frame >= 3410 && pos_frame <= 3412)mouseClicked(); */ for(int i=automode_pointer;i= pos_frame1 && autodata[i] <= pos_frame2) { anim_speed = 225; if(i 10) { anim_speed = 225; } else { anim_speed = 450; } } mouseClicked(); // automode_pointer = i; break; } } } if(pos < 21500)ret=0; if(auto_mode==1) { for(int i=0;i pos_frame) { scene_action = autodatas2[i]; break; } } switch(scene_action) { case 0: //normal ret = 0; break; case 1: //sleep ret = 2; f_animation = 0; play_anim_no=0; p_playedtime = 0; break; case 2: //small case 3: //big ret = 301; break; case 4: //face_change_triangle ret = 3; break; case 5: //face_change_mayuge ret = 31; break; case 6: //up1 camera_angle = 5; setCameraAngle(camera_angle); break; case 7: //up2 camera_angle = 6; setCameraAngle(camera_angle); break; case 8: //up3 camera_angle = 6; setCameraAngle(camera_angle); break; case 9: //sleep2 ret = 20; break; case 10: ret = 21; break; case 11: camera_angle = 11; setCameraAngle(camera_angle); break; } if(pos > 98200 && pos < 100000) { ret=4; } if(pos >= 100000 && pos < 102400) { ret=5; } if(pos >= 102400 && pos <113000) { ret=6; } if(pos >= 113000 && pos <130000) { ret=7; hatyune_rotate_speed += 0.125; if(hatyune_rotate_speed > 1.5)hatyune_rotate_speed = 1.5; } /* if(pos > 49500 && pos <=64800)ret=2; if(pos > 64800 && pos <=64900)ret=301; // if(pos > 65000 && pos <81500) if(pos > 64900 && pos <81500) { ret=3; } if(pos > 49500 && pos <=64800)ret=2; if(pos >= 81500 && pos <98200) { ret=31; } int tmptarget = 97200; int tmptarget2 = tmptarget + 1000; if(pos > 98200 && pos < 100000) { ret=4; } if(pos >= 100000 && pos < 102400) { ret=5; } if(pos >= 102400 && pos <113000) { ret=6; } if(pos >= 113000 && pos <130000) { ret=7; hatyune_rotate_speed += 0.125; if(hatyune_rotate_speed > 1.5)hatyune_rotate_speed = 1.5; } */ /* if(pos >= 115000 && pos <129000) { camera_angle = 2; } */ } else{ if(f_sleep==1)ret=2; if(f_hitention==1)ret=3; } if(auto_mode!=1) { if(pos >= 130000 && pos <145600) { ret=20; scene21count = 0; scene21count2 = 0; } if(pos >= 145600) { ret=21; } } if(pos >= 134850) { hatyune_rotate_speed=0; a = 0; } if(auto_mode==1){ switch(ret) { case 3: anim_speed = 450; break; default: // anim_speed = 225; break; } if(pos_frame >= 2897 && pos_frame <= 2923)anim_speed = 350; if(f_draw_wall) { if(pos_frame >= 350 && pos_frame < 360) { ddd = 0;} if(pos_frame >= 360 && pos_frame < 508) { camera_angle = 8; f_ddd=true;} if(pos_frame >= 508 && pos_frame < 510) { camera_angle = 1; setCameraAngle(camera_angle);f_ddd=false;} if(pos_frame >= 1590 && pos_frame < 1600) { ddd = 0;} if(pos_frame >= 1600 && pos_frame < 1930) { camera_angle = 10;f_ddd=true;} if(pos_frame >= 1930 && pos_frame < 1940) { camera_angle = 1; setCameraAngle(camera_angle);f_ddd=false;} } } /* if(pos_frame >= 2901 && pos_frame < 2908) { camera_angle = 5; setCameraAngle(camera_angle);} if(pos_frame >= 2908 && pos_frame < 2915) { camera_angle = 6; setCameraAngle(camera_angle);} if(pos_frame >= 2915 && pos_frame < 2923) { camera_angle = 6; setCameraAngle(camera_angle);} if(pos_frame >= 2923 && pos_frame < 3000) { camera_angle = 1; setCameraAngle(camera_angle);} */ return ret; } void setCameraAngle(int camera_angle) { eyeX = 0.0f; eyeY = 0.0f; eyeZ = 3.0f; vpX = 0.0f; vpY = 0.0f; vpZ = 0.0f; switch(camera_angle) { case 2: //ちょっと上 eyeX = 0.0f; eyeY = -2.0f; eyeZ = 3.0f; // gl.glRotatef(-50, 1, 0, 0); break; case 3: //ちょっと上空 eyeX = 0.0f; eyeY = -80.0f; eyeZ = 80.0f; // gl.glTranslatef(0, 145, 1200); // gl.glRotatef(-70, 1, 0, 0); break; case 4: //どん引き eyeX = 0.0f; eyeY = 0.0f; eyeZ = 1800.0f; break; case 5: /// Up1 eyeX = -100.0f; eyeY = -50.0f; eyeZ = -180.0f; vpX = -100.0f; vpY = -50.0f; vpZ = -300.0f; // gl.glTranslatef(20, -80, -250); break; case 6: // gl.glTranslatef(50, -150, -370); // Up2 eyeX = -50.0f; eyeY = -160.0f; eyeZ = -390.0f; vpX = -50.0f; vpY = -160.0f; vpZ = -720.0f; break; case 7: // Low Angle eyeX = 0.0f; eyeY = -2.0f; eyeZ = 3.0f; // gl.glRotatef(20, 1, 0, 0); break; case 20: // haku eyeX = -181.0f; eyeY = -2.0f; eyeZ = -1300.0f; vpX = 77.0f; vpY = 0.0f; vpZ = -1200.0f; break; case 21: // rin1 eyeX = 1400.0f; eyeY = -111.0f; eyeZ = -121.0f; vpX = -1663.0f; vpY = 30.0f; vpZ = -1100.0f; break; case 22: // rin1 eyeX = 700f; eyeY = -81.0f; eyeZ = -600.0f; vpX = -1663.0f; vpY = 30.0f; vpZ = -1100.0f; break; case 23: // rin1 eyeX = 1400.0f; eyeY = -71.0f; eyeZ = -3100.0f; vpX = 1737.0f; vpY = 0.0f; vpZ = -3700.0f; break; case 24: // rin1 eyeX = -121.0f; eyeY = 131f; eyeZ = -1850.0f; vpX = -23f; vpY = 170f; vpZ = -2100.0f; break; case 25: // rin1 eyeX = 1700f; eyeY = 0f; eyeZ = -801.0f; vpX = 429f; vpY = 0f; vpZ = -7.0f; break; case 26: // rin1 eyeX = -331f; eyeY = -171f; eyeZ = -1501.0f; vpX = 589f; vpY = -50f; vpZ = -1901f; break; case 27: // rin1 eyeX = 2201f; eyeY = -171f; eyeZ = -3000.0f; vpX = 2059f; vpY = -50f; vpZ = -2900f; break; } } void ddd_count(int n) { if(f_ddd == false)return;; ddd++; if(ddd>=n)ddd=n; }