freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

頭部跟蹤系統(tǒng)設(shè)計(jì)在虛擬聽(tīng)覺(jué)的應(yīng)用-資料下載頁(yè)

2025-05-18 15:40本頁(yè)面

【導(dǎo)讀】頭部跟蹤系統(tǒng)設(shè)計(jì)。在虛擬聽(tīng)覺(jué)的應(yīng)用。完成年月:20xx年06月。上海大學(xué)畢業(yè)論文(設(shè)計(jì))

  

【正文】 光有 HRTF 是不足夠的,因?yàn)?HRTF 只是記錄了聲音的方位信息,對(duì)于一個(gè) 具體的場(chǎng)景,聲音不僅有方向,聲音還會(huì)在場(chǎng)景中反射、折射, 聲源 離 聽(tīng)者的距離也會(huì)不固定。 于是,我們提 出 使用光線 追蹤 來(lái)模擬聲音 的傳播 , 并 模擬 聲線與聽(tīng)者的碰撞, 碰撞時(shí)記錄每個(gè)聲線此時(shí)的傳播時(shí)間、強(qiáng)度和方位, 最終使用這些信息,生成 雙耳 房間沖擊響應(yīng) BRIR。通過(guò) BRIR 與 原始 聲音的卷積,我們可以 模擬 在房間里,從聲源到聽(tīng)者 發(fā)出的聲音。 這樣方式產(chǎn)生的聲音 可以給用戶更加的沉浸感, 3D聲音聽(tīng)起來(lái)也越真實(shí)。 上 海 大 學(xué) 畢 業(yè) 論 文 (設(shè) 計(jì) ) 27 光線追蹤 算法 光線追蹤( Ray tracing),又稱為光線跟蹤,來(lái)自于幾何光學(xué)的一項(xiàng)通用技術(shù),它通過(guò)跟蹤與光學(xué)表面發(fā)生交互作用的光線從而得到光線經(jīng)過(guò)路徑的模型 [6]。 光線追蹤 廣泛 用于計(jì)算機(jī)圖形學(xué)中,使用這樣的方法,可以比光柵化圖像生成 達(dá)到 更加 好的光學(xué) 的效果。 同時(shí),光線追蹤 對(duì)于折射和反射都有非常好的效果,所以在對(duì)圖像質(zhì)量要求高的場(chǎng)合,例如電源渲染中,常常會(huì)采用這種方法。 圖 32 光線追蹤示例 在實(shí)際應(yīng)用中,可以將各種電磁波或者微小粒子看成光線 , 我們可以 利用光線追跡來(lái)計(jì)算 微小粒子 在介質(zhì)中傳播的情況。首先發(fā)射一條光線到空間中,當(dāng)光線碰撞到障礙物時(shí),原光線傳播方向改變 ,沿著反射角 方向傳播 。 聲音是波,不過(guò)考慮到聲波的 波 長(zhǎng) 遠(yuǎn)小于房間 中墻壁的尺寸, 我們認(rèn)為使用光線追蹤這樣粒子性較強(qiáng)的算法是合適的。 每個(gè)聲線在 房間 中傳播,遇到 墻壁會(huì)反射,在空氣中傳播會(huì)有損耗, 最終會(huì)撞上聽(tīng)者的聲音是我們所需要關(guān)注的 ,使用這些聲音的方位、時(shí)延、強(qiáng)度,我們可以獲得 BRIR。 要實(shí)現(xiàn)光線追蹤,首先需要定義幾個(gè)類: Primitive:場(chǎng)景的基元,本質(zhì)上是 一個(gè)三角形, 類中有檢測(cè)碰撞、求交、渲染三角形等功能 。 Ray:聲線 ,類中記錄 聲線的起點(diǎn)、方向、 強(qiáng)度、傳播距離等信息。 Scene:場(chǎng)景類,是 Primitive 的集合, 包含讀取 Obj 模型、整個(gè)場(chǎng)景渲染等功能。 Vector:向量類 Plane:平面類 ,包含法相 N和距離 D 上 海 大 學(xué) 畢 業(yè) 論 文 (設(shè) 計(jì) ) 28 光線追蹤偽代碼: 對(duì)于每一個(gè)基元 { 如果光線與該基元碰撞 { 光線強(qiáng)度根據(jù)光線起點(diǎn)到碰撞位置的距離衰減 將原光線的設(shè)為反射的方向 光線強(qiáng)度再減去碰撞的衰減 } 如果光線的強(qiáng)度為 0,將光線設(shè)為不活躍狀態(tài) } 重復(fù)上面過(guò)程直到活躍光線數(shù)目為 0 在 Primitive 類中,主要的計(jì)算是: ( 1) 根據(jù)三個(gè)頂點(diǎn)計(jì)算平面方程 ;( 2) 光線與三角形求交。 根據(jù)三個(gè)頂點(diǎn)計(jì)算平面方程: 設(shè)有三個(gè)點(diǎn) p1,p2,p3, p12 = p1? p2, p23 = p2 ?p3,則平面的法相量為 normal = p12 p23 平面方程的 D參數(shù)為: D = normal ?p3 代碼示意: vector3 p12,p23。 p12=p1p2。 p23=p2p3。 vector3 normal = (p23)。 ()。 float D = DOT( normal, p3 )。 =normal。 =D。 上 海 大 學(xué) 畢 業(yè) 論 文 (設(shè) 計(jì) ) 29 光線與三角形求交 分為 2步 ,計(jì)算距離 對(duì)于 1, 設(shè)有光線 P = ??0 + ????,平面 P? N +d = 0,約掉 P,則有 (??0 +tV) ?N + d = 0 其 解為: t = ?(??0 ?N +d)/(V? N) 示例代碼: float dist = DOT((()),)/(DOT((),))。 圖 33 三角形與光線碰撞示例 之后檢測(cè)交點(diǎn)是否在三角形內(nèi)部 , 對(duì)于三角形的每一條邊, ??1 = ??1? ?? ??2 = ??2? ?? ??1 = ??1??2 ??????????????????(??1) ?? = ???0 ???1 如果對(duì)每條邊 (?? ???1+ ??1) 0,則交點(diǎn)在三角形內(nèi)部 。 示例代碼: if (dist 0) { if (dist distance) { 上 海 大 學(xué) 畢 業(yè) 論 文 (設(shè) 計(jì) ) 30 if(isInside(()+()*dist)) { distance = dist。 return HIT。 } } } bool Primitive::isInside(vector3 p) { if (sameSide(p, p1, p2, p3) amp。amp。 sameSide(p,p2, p1, p3) amp。amp。 sameSide(p, p3, p1, p2)) return true。 else return false。 } bool Primitive::sameSide(vector3 p1,vector3 p2,vector3 a,vector3 b) { vector3 cp1 = (ba).Cross(p1a)。 vector3 cp2 = (ba).Cross(p2a)。 if (DOT(cp1, cp2) = 0) return true。 else return false。 } Scene 類 主要存儲(chǔ)了一個(gè) Primitive 列表 std::vectorPrimitive primList。 當(dāng)聲線 Ray做碰撞檢測(cè)時(shí)都是訪問(wèn) Scene里的 intersect接口進(jìn)行碰撞檢測(cè) , Scene里的 intersect負(fù)責(zé)返回被碰撞的 Primitive 的 id與從聲線起點(diǎn)到該 Primitive 的距離。 同時(shí) Scene 負(fù)責(zé) Primitive 的產(chǎn)生。 為了使系統(tǒng)支持復(fù)雜的場(chǎng)景, Scene 可以讀取 OBJ模型,并將 OBJ 中的三角片面轉(zhuǎn)換成系統(tǒng)所需要的 Primitive 列表 。 OBJ 模型文件是Wavefront Technologies 為 Advanced Visualizer animation package 開(kāi)發(fā)的幾何定義文件。這種文件格式是開(kāi)放的,被很多 3D圖像開(kāi)發(fā)商使用,這是一種被廣泛接受的 3D文件格式。OBJ 文件由一行行文本組成,注釋行以符號(hào) “”為開(kāi)頭。 每行開(kāi)頭都會(huì)有個(gè)關(guān)鍵字表明此行數(shù)據(jù)的類型 。 對(duì)于我們的系統(tǒng),主要用到的 OBJ 中的數(shù)據(jù)有: 關(guān)鍵詞 V: vertex頂點(diǎn)信息 關(guān)鍵詞 F: face 片面信息 Scene中的 bool Scene::loadObj(std::string filename)首先讀取 OBJ的頂點(diǎn)信息,然后再讀取片面信息,之后根據(jù)片面和頂點(diǎn)坐標(biāo)重新生成 基于 Primitive的 場(chǎng)景 。 Scene也負(fù)責(zé)場(chǎng)景的渲染, Scene::render()中,函數(shù)循環(huán)調(diào)用每個(gè) Primitive的渲染函數(shù),從而將整個(gè)場(chǎng)景渲染出來(lái)。 為了讓場(chǎng)景看起來(lái)更方便直觀,渲染時(shí)候 開(kāi)起來(lái) OpenGL的混上 海 大 學(xué) 畢 業(yè) 論 文 (設(shè) 計(jì) ) 31 合模式, Blending可以 從 Fragment Shader中取出渲染結(jié)果并且將其用于 混合 新的 場(chǎng)景 。 首先把場(chǎng)景不透明的部分渲染出來(lái),之后 開(kāi)啟混合模式并關(guān)閉深度測(cè)試,再渲染透明的場(chǎng)景 。 代碼示例: glEnable(GL_BLEND)。 glDepthMask(GL_FALSE)。 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)。 ()。 glDepthMask(GL_TRUE)。 glDisable(GL_BLEND)。 Ray類主要是記錄聲線信息 ,其包含以下成員 float strength:聲線的強(qiáng)度 bool active:該條聲線是否活躍,不活躍的聲線不會(huì)用來(lái)做光線追蹤 int microseconds:該條聲線已經(jīng)傳播的時(shí)間 float totalDist:該條聲線已經(jīng)傳播的距離,此項(xiàng)與上一項(xiàng)等價(jià) std::vectorfloat distList:使用 vector 記錄每次碰撞 時(shí) 所經(jīng)過(guò)的距離 vector3 m_Origin:聲線的起點(diǎn)位置 vector3 m_Direction:聲線的方向 Ray還包含以下幾個(gè)函數(shù) void SetOrigin( vector3amp。 a_Origin ) { m_Origin = a_Origin。 }//設(shè)置起點(diǎn) void SetDirection( vector3amp。 a_Direction ) { m_Direction = a_Direction。 }//設(shè)置方向 vector3amp。 GetOrigin() { return m_Origin。 }//獲取起點(diǎn) vector3amp。 GetDirection() { return m_Direction。 }//獲取方向 圖 34 球坐標(biāo)中的 theta和 phi 首先, 系統(tǒng)會(huì)在聲源位置 產(chǎn)生 theta方向 60份, phi 方向 60份,一共 60*60=3600條的光線, 這 3600條光線在場(chǎng)景中傳播、碰撞,其中一部分會(huì)最終撞上聽(tīng)者,此時(shí),這個(gè)聲線就是代表可以被聽(tīng)者聽(tīng)到的一份聲音能量 ,并且具有聲源的位置信息。 當(dāng) Ray碰撞到物體時(shí),首先把 Ray的方向設(shè)為原來(lái)方向關(guān)于反射面的反射方向,然后,上 海 大 學(xué) 畢 業(yè) 論 文 (設(shè) 計(jì) ) 32 將聲強(qiáng)衰減去碰撞的損失 ,同時(shí),把起點(diǎn)位置到物體的距離加到 totalDist里,把這個(gè)距離也 push到 distList向量中 。 vector 向量類 對(duì)常用向量計(jì)算封裝 ,包含 向 量的點(diǎn)乘、取模、歸一化、叉乘、向量加法、向量減法、向量乘法等。 房間沖擊響應(yīng)計(jì)算 正如 , 3D聲音渲染本質(zhì)是拿原始聲音與沖擊響應(yīng)做卷積, 于是生成 房間的沖擊響應(yīng)是 3D聲音渲染中的關(guān)鍵 。 HRTF 數(shù)據(jù)庫(kù)介紹 MIT的 KEMAR HRTF數(shù)據(jù)庫(kù) 是 MIT開(kāi) 發(fā) 的一個(gè) HRTF數(shù)據(jù)庫(kù) 。 MIT使用 DSP卡 輸出通過(guò)放大器去驅(qū)動(dòng)揚(yáng)聲器 , 在 一個(gè)稱為 KEMAR 的 假人 模型 (僅包含頭部和軀 干 ) 的頭內(nèi)放置麥克風(fēng) 。 揚(yáng)聲器 中播放沖擊,麥克風(fēng)記錄沖擊響應(yīng), 麥克風(fēng)和前置放大器的輸出通過(guò)DSP卡的輸入端子輸入到計(jì)算機(jī)中。 圖 35 消聲室中的 KEMAR假人模型 MIT將 KEMAR假人放置在消音室中,圍繞著假人模型把 架設(shè)用于移動(dòng)揚(yáng)聲器的軌道,用電腦可以控制揚(yáng)聲器所在的位置 。 測(cè)量某方位的 HRTF時(shí),首先把揚(yáng)聲器移動(dòng)到期望的仰角,然后轉(zhuǎn)動(dòng) KEMAR假人, 以獲取不同的水平角方向。 具體 MIT KEMAR測(cè)量了 哪 些方位上的 HRTF信息請(qǐng)參見(jiàn)下表: 上 海 大 學(xué) 畢 業(yè) 論 文 (設(shè) 計(jì) ) 33 表 31 KEMAR每個(gè)方向上的采樣信息 MIT媒體實(shí)驗(yàn)室提供了兩套數(shù)據(jù) : (1) Full Data Full Data是 MIT測(cè)量的完整數(shù)據(jù), 每個(gè)目錄都以“ elev”開(kāi)頭跟上一個(gè)數(shù)值,這個(gè)數(shù)值代表的是 仰角值。 在每個(gè)目錄里都有多個(gè)形如 “ ”的文件,這些都是沖擊響應(yīng)的錄音。 文件名中的“ L”指的是左聲道,相應(yīng)的如果這個(gè)數(shù)值為“ R”,那么指的是右聲道。 “ 10e”指的是仰角是 10 度。 “ 005a”指的是偏轉(zhuǎn)角為 5 度?!?”這個(gè)文件所描述的就是左耳聽(tīng)到的來(lái)自 10度仰角 5度偏角方向的沖擊的響應(yīng)。 在 這些 wav 文件中, 采樣頻率 44100Hz, 采樣點(diǎn)數(shù)是 512 個(gè),每個(gè)采樣點(diǎn)是 位長(zhǎng) 16bit的有符號(hào)整數(shù) , 為 單聲道文件 。 (2) Compact Data Compact Data 中也是每個(gè)目錄以仰角方位分開(kāi)。與 Full Data 不同的地方是 Compact Data里每個(gè) wav文件都是雙聲道的,即同時(shí)包含某方位的左右耳響應(yīng) 。另一個(gè)區(qū)別是Compact Data 中每個(gè)聲道中的采樣點(diǎn)數(shù)是 128個(gè),是 Full 版的 1/4。 上 海 大 學(xué) 畢 業(yè) 論 文 (設(shè) 計(jì) ) 34 圖 36 HRTF數(shù)據(jù)庫(kù)中 某角度的沖擊響應(yīng) 本
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1