160 likes | 258 Views
Panorámy s priestorovým zvukom. Rastislav Kamenický Školiteľ: Matej Novotný. Špecifikácia. E ditor a P rehliadač fotografických panorám (nejedná sa o vytvorenie panoramatického obrazu) Vkladanie a prehrávanie zvuku Priestorový zvuk Rôzne štýly prehrávania Ukladanie vo formáte XML
E N D
Panorámy s priestorovým zvukom Rastislav Kamenický Školiteľ: Matej Novotný
Špecifikácia • Editor a Prehliadač fotografických panorám (nejedná sa o vytvorenie panoramatického obrazu) • Vkladanie a prehrávanie zvuku • Priestorový zvuk • Rôzne štýly prehrávania • Ukladanie vo formáte XML • Import a Export panorám zo servera
Čo to obnáša • Prehľad podobných programov • Načítanie a spracovanie obrazu • Namapovanie obrazu do 3D priestoru a pohyb v ňom • Prehrávanie zvuku v 3D priestore • Práca s XML • Posielanie a sťahovanie súborov skrz internet • Serverová časť (php) • Rozhranie, ktoré toto všetko podporí
Rozhodnutie • Desktopová Aplikácia • Problémy s kompatibilitou • Rozhranie Microsoft VC++ 2008 • A knižnice: OpenCV, OpenGL, Glut, OpenAl, FreeAlut, Wininet (?). • Nevyužité z dobrých dôvodov: WinSock, Glu, Alu, Alut, Xerces, GDImage a mnoho ďalších..
Základy • Rôzne typy panorám (Ktorý tu chýba?)
GUI • Čo očakávam že budem vedieť robiť • Vykreslenie Tvaru a Textúry • Rotácia • Zoom • Klikanie a pohyb myšov
1. Krok k vykresleniu GLUquadricObj *p = gluNewQuadric(); gluSphere(p, 1.0f, 20, 20); Mat Img = imread("test.jpg", CV_LOAD_IMAGE_COLOR); intrr = img.rows; intcc = img.cols; Mat top(rr/3, cc/4, img.type()); for(inti=0;i<rr/3;i++) for(intj=0;j<(cc*3)/4;j++) top.at<uchar>(i, j) = img.at<uchar>(i, j); • Vykreslenie Tvaru • Načítanie obrázku • Spracovanie obrázku
2. Krok k vykresleniu • Zoom • Rotácia č. 1 • Rotácia č. 2 • // zoom • glTranslatef(0.0f,0.0f,zoom); • //takto to fungovať nemôže • //glRotatef(X,1.0f,0.0f,0.0f); • //glRotatef(Y,0.0f,1.0f,0.0f); • // rotacia • floattmpx = -Xrot; • floattmpy = Yrot; • GetSphereCoordinates(tmpx, tmpy); • gluLookAt(0.0f, 0.0f, 0.0f, sin(tmpx)*cos(tmpy), sin(tmpy), cos(tmpx)*cos(tmpy), 0.0, 1.0, 0.0);
3. Krok k vykresleniu • Prevod z OpenCV do OpenGL • A konečne vykreslenie glGenTextures(1, m_ text); glBindTexture( GL_TEXTURE_2D, * m_ text ); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); gluBuild2DMipmaps( GL_TEXTURE_2D, 3, img.cols, img.rows, GL_BGR_EXT, GL_UNSIGNED_BYTE, img.data); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, *m_text); gluSphere(p, 1.0f, 20, 20); glDisable(GL_TEXTURE_2D);
Ďalšie komplikácie • Resize a Scale (neexistujuci okraj) • Pohyb myšov (WndProc a OpenGL jednotky) • Množstvo atribútov na menenie • VC++ umrelo • structView_Data { • intstartX; • intstartY; • intmaxX; • intmaxY; • intzoom; • intsensitivity; • intinvertX; • intinvertY; • } View; • structUser_Data { • stringtitle; • stringdescription; • stringauthor; • string info; • } User; • structSound_Data { • Sound_Typesmode; • floatlevel; • float ambient; //audible outside field at N% • int loop; // 0 - stale opakuje • int X; • int Y; • intXsize; • intYsize; • intscale; • stringsoundURL; • }; • vector<Sound_Data> Sound;
Práca s XML • namespaceSystem::Xml XmlTextWriter^ w = gcnewXmlTextWriter(filename, gcnew UTF8Encoding()); w->WriteStartElement("panorama"); w->WriteStartElement("Image_Data"); w->WriteAttributeString("type", System::Convert::ToString(int(XData.Image.type))); w->WriteAttributeString("imageURL", gcnewSystem::String(XData.Image.imageURL.c_str())); w->WriteEndElement(); w->WriteEndElement(); • Analogicky je k tomu aj Reader
Zvuky 1 • Inicializácia • Velocity alutInit(0, NULL); ALfloatlistenerPos[]={0.0,0.0,0.0}; ALfloatlistenerVel[]={0.0,0.0,0.0}; ALfloatlistenerOri[]={LX,LY,LZ, 0.0,1.0,0.0}; //LZ default 1, naopak ako v opengl ALfloat source0Pos[]={ X, Y, Z}; ALfloat source0Vel[]={ 0.0, 0.0, 0.0};
Zvuky 2 • Načítanie zvukovej stopy • Nastavenie prehrávania • Samotné prehranie alutLoadWAVFile("file1.wav",&format,&data,&size,&freq,&loop); alBufferData(buffer[0],format,data,size,freq); alutUnloadWAV(format,data,size,freq); alSourcef(source[0],AL_PITCH,1.0f); alSourcef(source[0],AL_GAIN,1.0f); alSourcefv(source[0],AL_POSITION,source0Pos); alSourcefv(source[0],AL_VELOCITY,source0Vel); alSourcei(source[0],AL_BUFFER,buffer[0]); alSourcei(source[0],AL_LOOPING,AL_TRUE); alSourcePlay(source[0]);
Zvuky 3 • Množstvo ďalších parametrov • AL_DOPPLER_FACTOR, AL_SPEED_OF_SOUND, AL_DISTANCE_MODEL; • AL_NONE, AL_INVERSE_DISTANCE, • AL_INVERSE_DISTANCE_CLAMPED, AL_LINEAR_DISTANCE, • AL_LINEAR_DISTANCE_CLAMPED, AL_EXPONENT_DISTANCE, and • AL_EXPONENT_DISTANCE_CLAMPED • (Inverse – max/min vzdialenosť pod ktoru zvuk neutišuje/nenaberá na sile)
Server TODO • PhP: move_uploaded_file($_FILES["uploadedfile"]["tmp_name"], "my_file"); • C++: HINTERNET hSession = InternetOpen(_T("MyApp"),INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); HINTERNET hConnect = InternetConnect(hSession, _T("localhost"),INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL); HINTERNET hRequest = HttpOpenRequest(hConnect, _T("POST"), _T("upload.php"), 0, 0, 0, INTERNET_FLAG_RELOAD, 0); BOOL sent= HttpSendRequest(hRequest, NULL, -1, frmdata, _tcslen(frmdata));