日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图形处理(十二)拉普拉斯网格优化、最小二乘网格模型光顺

發(fā)布時間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图形处理(十二)拉普拉斯网格优化、最小二乘网格模型光顺 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

看這篇博文前,請先參考我的另外一篇博文《圖形處理(三)簡單拉普拉斯網(wǎng)格變形-Siggraph 2004》學習拉普拉斯坐標的相關(guān)理論知識。這里要分享的paper,是通過拉普拉斯的方法實現(xiàn)三角網(wǎng)格模型的優(yōu)化。如果你已經(jīng)非常熟悉三角網(wǎng)格曲面的拉普拉斯相關(guān)理論,實現(xiàn)這篇paper也就非常容易了。網(wǎng)格曲面的拉普拉斯坐標不但可以用于變形、光順,還可以用于優(yōu)化,總之好處多多,你只要學會了這一招,那么就可以學會這些算法了。


一、優(yōu)化原理


利用Laplacian?坐標重建的方法進行網(wǎng)格光順,原理很簡單,最簡單的就是只要把源網(wǎng)格模型Laplacian?坐標δ的模長縮小,方向不變,就可以然后進行Laplacian?網(wǎng)格重建,就可以實現(xiàn)簡單的光順效果。

然而如果要進行網(wǎng)格優(yōu)化呢?怎么實現(xiàn)?大牛們告訴我們一個比較規(guī)則的網(wǎng)格模型一個特點:當網(wǎng)格曲面上任意頂點的局部片中包含的所有三角面片都為等腰三角形時,該頂點的同一Laplacian?坐標和余切Laplacian?坐標相等。當將上述結(jié)論由某一個三角面片擴展到整個模型表面時可以發(fā)現(xiàn):如果所有的三角面片都接近于正三角形,所有頂點的同一Laplacian?坐標和余切Laplacian?坐標接近相等。

ok,上面的原理便是paper的思想,只要你懂得了抓住這個思想,那么算法實現(xiàn)起來就容易了。

在三角網(wǎng)格曲面上,頂點vi的拉普拉斯坐標定義為,vi點與其一鄰接頂點加權(quán)組合的差:


當然權(quán)重wij需要滿足歸一化


權(quán)值的選取很多,但比較常用的權(quán)值是均勻權(quán)、余切權(quán),其計算公式如下:



二、網(wǎng)格優(yōu)化算法實現(xiàn)

算法原理主要是:

1、通過先求解網(wǎng)格曲面余切權(quán)計算得到的Laplacian?坐標δ

2、構(gòu)建均勻權(quán)下的拉普拉斯矩陣A

3、然后求解AX=δ.

[cpp]?view plaincopy
  • void?CMeshOptimize::OptimizeMesh(TriMesh*Tmesh)??
  • {??
  • ????Tmesh->need_neighbors();??
  • ????int?vn=Tmesh->vertices.size();??
  • ????//拉普拉斯矩陣設(shè)置??
  • ????int?count0=0;??
  • ????vector<int>begin_N(vn);??
  • ????for?(int?i=0;i<vn;i++)??
  • ????{?????
  • ????????begin_N[i]=count0;??
  • ????????count0+=Tmesh->neighbors[i].size()+1;??
  • ????}??
  • ????typedef?Eigen::Triplet<double>?T;??
  • ????std::vector<T>?tripletList(count0+vn);??
  • ????for(int?i=0;i<vn;i++)??
  • ????{??
  • ????????int?nei_n=Tmesh->neighbors[i].size();??
  • ????????tripletList[begin_N[i]]=T(i,i,-1.0*nei_n);??
  • ????????for?(int?k?=?0;k<nei_n;++k)???
  • ????????{??
  • ????????????tripletList[begin_N[i]+k+1]=T(i,Tmesh->neighbors[i][k],1);??
  • ????????}??
  • ????}??
  • ????//約束矩陣設(shè)置??
  • ????m_boundary_wieght=100*m_contrain_weight;??
  • ????for?(int?i=0;i<vn;i++)??
  • ????{??
  • ????????if(Tmesh->is_bdy(i))tripletList[count0+i]=T(vn+i,i,m_boundary_wieght);??
  • ????????else?tripletList[count0+i]=T(vn+i,i,m_contrain_weight);??
  • ????}??
  • ??
  • ????SparseMatrixType?Ls(2*vn,vn);???
  • ????Ls.setFromTriplets(tripletList.begin(),?tripletList.end());??
  • ??
  • ????//最小二乘解超靜定方程組??
  • ????SparseMatrixType?ls_transpose=Ls.transpose();??
  • ????SparseMatrixType?LsLs?=ls_transpose*?Ls;??
  • ????vector<Eigen::VectorXd>?RHSPos;//超靜定方程組右邊??
  • ????Compute_RHS(RHSPos);??
  • ????Eigen::SimplicialCholesky<SparseMatrixType>MatricesCholesky(LsLs);??
  • ????#pragma?omp?parallel?for??
  • ????for?(int?i=0;i<3;i++)??
  • ????{??
  • ????????Eigen::VectorXd?xyzRHS=ls_transpose*RHSPos[i];??
  • ????????Eigen::VectorXd?xyz=MatricesCholesky.solve(xyzRHS);??
  • ????????for(int?j=0;j<vn;j++)??
  • ????????{??
  • ????????????Tmesh->vertices[j][i]=xyz[j];??
  • ????????}??
  • ????}??
  • ??????
  • }??
  • //設(shè)置方程組右邊項??
  • void?CMeshOptimize::Compute_RHS(vector<Eigen::VectorXd>?&RHSPos)??
  • {??
  • ????int?vn=m_OptimizeMesh->vertices.size();??
  • ????m_OptimizeMesh->need_neighbors();??
  • ????m_OptimizeMesh->need_adjacentfaces();??
  • ????RHSPos.clear();??
  • ????RHSPos.resize(3);??
  • ????for?(int?i=0;i<3;i++)??
  • ????{??
  • ????????RHSPos[i].resize(2*vn);??
  • ????????RHSPos[i].setZero();??
  • ????}??
  • ??
  • ????int?fn=m_OptimizeMesh->faces.size();??
  • ????m_OptimizeMesh->need_adjacentedges();??
  • ????#pragma?omp?parallel?for??
  • ????for?(int?i=0;i<vn;i++)??
  • ????{?????
  • ????????vector<float>CotWeight;??
  • ????????float?SumWeight;??
  • ????????CotangentWeights(m_OptimizeMesh,i,CotWeight,SumWeight);??
  • ????????int?nei_n=m_OptimizeMesh->neighbors[i].size();??
  • ????????//歸一化??
  • ????????vector<int>&a=m_OptimizeMesh->neighbors[i];??
  • ????????vec?ls;??
  • ????????for?(int?j=0;j<nei_n;j++)??
  • ????????{?????
  • ????????????ls=ls+CotWeight[j]*m_OptimizeMesh->vertices[a[j]];??
  • ????????}??
  • ????????ls=ls-SumWeight*m_OptimizeMesh->vertices[i];??
  • ????????for?(int?j=0;j<3;j++)??
  • ????????{??
  • ????????????RHSPos[j][i]=ls[j];??
  • ????????}??
  • ????}??
  • ????for?(int?i=vn;i<2*vn;i++)??
  • ????{??
  • ????????for?(int?j=0;j<3;j++)??
  • ????????{?????
  • ????????????if(m_OptimizeMesh->is_bdy(i-vn))RHSPos[j][i]=m_OptimizeMesh->vertices[i-vn][j]*m_boundary_wieght;??
  • ????????????else?RHSPos[j][i]=m_OptimizeMesh->vertices[i-vn][j]*m_contrain_weight;??
  • ????????}??
  • ????}??
  • ??
  • ??
  • }??
  • //計算一階鄰近點的各自cottan權(quán)重??
  • void?CMeshOptimize::CotangentWeights(TriMesh*TMesh,int?vIndex,vector<float>&vweight,float?&WeightSum)??
  • {?????
  • ????int?NeighborNumber=TMesh->neighbors[vIndex].size();??
  • ????vweight.resize(NeighborNumber);??
  • ????WeightSum=0;??
  • ????vector<int>&NeiV=TMesh->neighbors[vIndex];??
  • ????for?(int?i=0;i<NeighborNumber;i++)??
  • ????{??
  • ????????int?j_nei=NeiV[i];??
  • ????????vector<int>tempnei;??
  • ????????Co_neighbor(TMesh,vIndex,j_nei,tempnei);??
  • ????????float?cotsum=0.0;??
  • ????????for?(int?j=0;j<tempnei.size();j++)??
  • ????????{??
  • ????????????vec?vivo=TMesh->vertices[vIndex]-TMesh->vertices[tempnei[j]];??
  • ????????????vec?vjvo=TMesh->vertices[j_nei]-TMesh->vertices[tempnei[j]];??
  • ????????????float?dotvector=vivo?DOT?vjvo;??
  • ????????????dotvector=dotvector/sqrt(len2(vivo)*len2(vjvo)-dotvector*dotvector);??
  • ????????????cotsum+=dotvector;??
  • ????????}??
  • ????????vweight[i]=cotsum/2.0;??
  • ????????WeightSum+=vweight[i];??
  • ????}??
  • ????for?(int?k=0;k<NeighborNumber;++k)??
  • ????{??
  • ????????vweight[k]=NeighborNumber*vweight[k]/WeightSum;??
  • ????}??
  • ????WeightSum=NeighborNumber;??
  • ??
  • }??
  • void?CMeshOptimize::Co_neighbor(TriMesh?*Tmesh,int?u_id,int?v_id,vector<int>&co_neiv)??
  • {??
  • ????Tmesh->need_adjacentedges();??
  • ????vector<int>&u_id_ae=Tmesh->adjancetedge[u_id];???
  • ????int?en=u_id_ae.size();??
  • ????Tedge?Co_Edge;??
  • ????for?(int?i=0;i<en;i++)??
  • ????{??
  • ????????Tedge?&ae=Tmesh->m_edges[u_id_ae[i]];??
  • ????????int?opsi=ae.opposite_vertex(u_id);??
  • ????????if?(opsi==v_id)??
  • ????????{??
  • ????????????Co_Edge=ae;??
  • ????????????break;??
  • ????????}??
  • ????}??
  • ????for?(int?i=0;i<Co_Edge.m_adjacent_faces.size();i++)??
  • ????{??
  • ????????TriMesh::Face?af=Tmesh->faces[Co_Edge.m_adjacent_faces[i]];??
  • ????????for?(int?j=0;j<3;j++)??
  • ????????{??
  • ????????????if((af[j]!=u_id)&&(af[j]!=v_id))??
  • ????????????{??
  • ????????????????co_neiv.push_back(af[j]);??
  • ????????????}??
  • ????????}??
  • ????}??
  • }??
  • 至此三角網(wǎng)格的優(yōu)化可以說算法講完了。因為算法比較簡答,本篇文章篇幅比較小,所以在這篇博文中順便講一下最小二乘網(wǎng)格的相關(guān)概念。

    參考文獻:Laplacian Mesh Optimization

    三、最小二乘網(wǎng)格相關(guān)理論

    這邊順便講一下最小二乘網(wǎng)格,最小二乘網(wǎng)格最初的概念來源于paper《Least-squares Meshes》,我最初看到最小二乘網(wǎng)格這個概念是在paper《基于最小二乘網(wǎng)格的模型變形算法》中看到的,因為之前學習微分域的網(wǎng)格變形算法的時候,基本上對每種變形算法都有看過相關(guān)的paper,用最小二乘網(wǎng)格的方法實現(xiàn)網(wǎng)格變形,其實跟基于多分辨率的網(wǎng)格變形算法是一樣的,都是對低頻空間中的網(wǎng)格模型進行變形操作。

    最小二乘網(wǎng)格模型又稱為全局的拉普拉斯光順網(wǎng)格,就是通過把網(wǎng)格模型的拉普拉斯坐標設(shè)置為0,然后求解拉普拉斯方程:


    即:


    其中權(quán)重wij為:



    這樣重建求解的網(wǎng)格即為最小二乘網(wǎng)格,也是一個光順后的網(wǎng)格模型,因為該模型的拉普拉斯坐標全部為0。

    當然求解上面的方程還需要控制頂點,控制頂點的個數(shù)對效果的影響還是蠻大的,可以看一下下面這個圖:


    總之就是控制頂點的個數(shù)越少,越是光順。

    在paper《Least-squares Meshes》中還演示了通過給定的拓撲鏈接關(guān)系,進行網(wǎng)格補洞,與原網(wǎng)格模型的區(qū)別。


    本文地址:http://blog.csdn.net/hjimce/article/details/46505863?? ? 作者:hjimce ? ? 聯(lián)系qq:1393852684 ??更多資源請關(guān)注我的博客:http://blog.csdn.net/hjimce? ? ? ? ? ? ? ? 原創(chuàng)文章,版權(quán)所有,轉(zhuǎn)載請保留本行信息。

    參考文獻:

    1、《Least-squares Meshes》

    2、《Laplacian Mesh Optimization》

    3、《基于最小二乘網(wǎng)格的模型變形算法》

    總結(jié)

    以上是生活随笔為你收集整理的图形处理(十二)拉普拉斯网格优化、最小二乘网格模型光顺的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产黄色片在线免费观看 | 久久韩日| 黑人借宿巨大中文字幕 | 欧美精品18videosex性欧美 | 日本色偷偷 | 欧美视频导航 | 日本熟妇成熟毛茸茸 | 亚洲乱码电影 | 99成人精品视频 | 亚洲国产高清国产精品 | 看片免费黄在线观看入口 | 涩涩视频在线观看免费 | 久久成人在线观看 | 中文在线天堂网 | 永久免费在线播放 | www.黄色一片| 黑人激情视频 | 亚洲一区二区在线电影 | 久久美女免费视频 | 欧美激情综合色综合啪啪五月 | 日韩污视频在线观看 | www.四虎影视.com | 国产一级视频免费观看 | 成人动漫亚洲 | 日韩在线视频一区二区三区 | 国产日韩一区 | 久久精精品久久久久噜噜 | 玩弄丰满少妇xxxxx性多毛 | 中文字幕一区av | 综合av| 欧美精品一二三四区 | 国产成人精品免费在线观看 | 在线播放国产一区 | 免费av在线电影 | 丁香婷婷激情五月 | 成人在线视频网站 | 人人曰 | 日日摸夜夜添夜夜添高潮喷水 | 91精品系列 | 色97| 欧美一区二区在线视频 | 国产免费色视频 | 最新av观看 | 青娱乐97 | 精品午夜久久久 | 好吊色这里只有精品 | 精品国产一区二区三区久久久蜜臀 | 成人亚洲精品 | 国产精品美乳在线观看 | 天堂在线 | 亚洲第一黄色网 | mm131国产精品 | 久一在线 | 国模无码视频一区 | 日韩免费一区 | 影音av资源 | 亚洲国产精品激情在线观看 | 国产精品视频网址 | 99久久精品日本一区二区免费 | 亚洲精品xxx | 免费人成自慰网站 | 欧美日韩亚 | 亚洲永久无码7777kkk | 精品国产一区二区在线观看 | 一本—道久久a久久精品蜜桃 | 中文在线a√在线8 | 干爹你真棒插曲免费 | 国外成人在线视频 | 五月天婷婷在线视频 | 91成人在线免费 | 福利精品 | 免费观看a毛片 | 黄色国产视频网站 | 午夜丰满寂寞少妇精品 | 宿舍女女闺蜜调教羞辱 | 麻豆av网 | 国产精品成 | 37p粉嫩大胆色噜噜噜 | 羞辱狗奴的句子有哪些 | 国产精品另类 | 毛色毛片| 久久精品国产熟女亚洲AV麻豆 | 国产精品一级视频 | 成人高潮片免费 | 国产在线观看黄 | 九九久久视频 | 欧美日韩一| 欧美日韩一区二区久久 | 天天在线观看 | 国产精品无 | av官网在线观看 | 亚洲精品综合 | 伦av综合一区 | av免费观| 国产在线精 | 在线免费黄色网址 | 中文字幕在线视频一区 | 欧美一级爱爱 | 亚洲国产精品成人久久蜜臀 |