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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

山东大学计算机图形学实验(Opengl实现):Loop Subdivision算法对模型进行细分

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 山东大学计算机图形学实验(Opengl实现):Loop Subdivision算法对模型进行细分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、實驗目標/要求:
The goal of this assignment is to try your hand at various mesh processing tasks. A half-edge mesh adjacency data structure is provided, along with a very simple .obj mesh parser. As you modify the triangle mesh, it is critical that the manifold properties of the input surface are maintained, and that the adjacency data structure remains consistent. Throughout this assignment you are asked to consider the efficiency of various mesh operations: is it quadratic, linear, logarithmic, constant, etc? It’s ok if you don’t always implement the most efficient strategy (which may require additional data structures).
(上面的的意思大概就是利用Loop Subdivision算法對簡單模型進行細分。)

二、實現效果:
第一組

第二組

第三組

三、實現方法/思路:

  • 先更新原來的舊頂點,根據舊頂點信息計算出新頂點位置信息并將計算的新位置信息和原來的點組成pair并儲存在一個新的vector中(即下面算法中的update)。(另:此處要注意內部頂點和邊界點的更新方式,公式不要出錯)
  • 分別根據內部邊和和邊界邊不同的處理方式算出插入的新點的位置信息,然后直接向原來的點vector(即vertices)中插入(用addVertex函數)新頂點。
  • 利用步驟1)中的vector(即update)來更新舊頂點的位置信息(用一個for循環和setPos函數即可)。
  • 新建一個臨時三角形面片的哈希表來存儲舊三角形面片信息(即下面算法中的tempTriangles),然后清除舊三角形面片信息(triangles.clear())和邊信息(edges.clear()),然后再利用臨時的三角形面片哈希表重構新的三角形面片信息和新的邊信息(邊信息是隨著三角形面片信息的更新而更新的,不用管)。
  • 修復一下這邊信息,即為原來crease值不為零的邊及其“衍生”的邊重新附上crease值。
  • 清空vertex_parents(這個玩意兒是通過一條邊的兩個端點去找邊上所產生的新點的,在插入新店的步驟(即步驟2)中進行準備,用在重構三角形面片信息的步驟(即步驟4中),為下一次細分做準備。

  • 算法代碼如下:
    (只包含算法部分的代碼,不包含其余部分的代碼,太多了,懶得整,嘿嘿)

    void Mesh::LoopSubdivision() {printf("Subdivide the mesh!\n");//store new position of old vertex in update.//(Traversal of all vertices)std::vector<std::pair<Vertex*, Vec3f>> update;for (edgeshashtype::iterator eIterator1 = edges.begin();eIterator1 != edges.end(); eIterator1++){Edge* e = eIterator1->second;Edge* temp = e->getNext();Vec3f newPosition(0, 0, 0);std::vector<Vertex*> neighborVertices;while (temp->getOpposite() != NULL && temp->getOpposite() != e){neighborVertices.push_back(temp->getEndVertex());temp = temp->getOpposite()->getNext();}if (temp->getOpposite() == NULL){neighborVertices.clear();Vertex* v1 = temp->getEndVertex();assert(temp->getStartVertex() == e->getEndVertex());temp = e;while (temp->getOpposite() != NULL){temp = temp->getOpposite()->getNext()->getNext();}Vertex* v2 = temp->getStartVertex();assert(temp->getEndVertex() == e->getEndVertex());newPosition = newPosition = 3.0 / 4.0 * e->getEndVertex()->getPos() + 1.0 / 8.0 * (v1->getPos() + v2->getPos());}else{//degree of current vertexint degree = neighborVertices.size();//beta is a constant used to get new inner vertex positionfloat beta = (5.0 / 8.0 - std::pow(3.0 / 8.0 + 1.0 / 4.0 * std::cos(2 * std::acos(-1) / degree), 2)) / degree;for (int k = 0; k < degree; k++)newPosition += beta * neighborVertices[k]->getPos();newPosition += (1.0 - degree * beta) * e->getEndVertex()->getPos();}update.push_back(std::make_pair(e->getEndVertex(), newPosition));}//add new verticesfor (edgeshashtype::iterator eIterator2 = edges.begin();eIterator2 != edges.end(); eIterator2++){Edge* e = eIterator2->second;Vec3f newVertexPos(0, 0, 0);if (e->getOpposite() != NULL){if (getChildVertex(e->getStartVertex(), e->getEndVertex()) != NULL) continue;//每條內部邊只加一個點newVertexPos = 3.0 / 8.0 * (e->getEndVertex()->getPos() + e->getStartVertex()->getPos())+ 1.0 / 8.0 * (e->getNext()->getEndVertex()->getPos() + e->getOpposite()->getNext()->getEndVertex()->getPos());}elsenewVertexPos = 1.0 / 2.0 * (e->getStartVertex()->getPos() + e->getEndVertex()->getPos());Vertex* newVertex = addVertex(newVertexPos);if (newVertex != NULL) setParentsChild(e->getStartVertex(), e->getEndVertex(), newVertex);}//refresh old vertex positionfor (int i = 0; i < update.size(); i++) update[i].first->setPos(update[i].second);//add triangle meshtriangleshashtype tempTriangles = triangles;triangles.clear();//clear old triangle meshesedges.clear();//clear information of old edgestriangleshashtype::iterator tIterator = tempTriangles.begin();for (; tIterator != tempTriangles.end(); tIterator++){Triangle* t = tIterator->second;Vertex* v1, * v2, * v3, * c12, * c23, * c13;v1 = (*t)[0]; v2 = (*t)[1]; v3 = (*t)[2];c12 = getChildVertex(v1, v2);c23 = getChildVertex(v2, v3);c13 = getChildVertex(v1, v3);if (c12 == NULL || c23 == NULL || c13 == NULL) break;addTriangle(c12, c23, c13);addTriangle(v1, c12, c13);addTriangle(v2, c23, c12);addTriangle(v3, c13, c23);}//set creasefor (edgeshashtype::iterator eIterator3 = edges.begin();eIterator3 != edges.end(); eIterator3++){Edge* e = eIterator3->second;std::pair<Vertex*, Vertex*> ePair = eIterator3->first;if (vertex_parents.find(ePair) == vertex_parents.end()) continue;if (e->getCrease()){Vertex* childVertex = vertex_parents.find(ePair)->second;assert(edges.find(std::make_pair(e->getStartVertex(), childVertex)) != edges.end());edges.find(std::make_pair(e->getStartVertex(), childVertex))->second->setCrease(e->getCrease());assert(edges.find(std::make_pair(childVertex, e->getEndVertex())) != edges.end());edges.find(std::make_pair(childVertex, e->getEndVertex()))->second->setCrease(e->getCrease());}}vertex_parents.clear(); }

    四、實驗感受與體會:
    原來的模型干干巴巴的,麻麻賴賴的,一點兒都不圓潤,盤它!

    總結

    以上是生活随笔為你收集整理的山东大学计算机图形学实验(Opengl实现):Loop Subdivision算法对模型进行细分的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 在线视频国产一区 | 韩国一二三区 | 久久精品国产亚洲AV高清综合 | 久久久久一区二区精码av少妇 | 欧洲日韩一区二区三区 | 亚洲一区二区小说 | 999xxxxx | 五月婷婷六月天 | 欧美久久久一区二区三区 | 人妻互换一二三区激情视频 | 不卡av电影在线观看 | 久久狠狠爱 | 丰满岳妇伦在线播放 | 影音先锋国产精品 | 视频免费1区二区三区 | 成人精品在线视频 | 亚州av网 | 日韩一区二区三区久久 | 中文字幕丝袜诱惑 | 麻豆av免费在线观看 | 亚洲综合视频在线 | 欧美日韩免费在线观看 | mm视频在线观看 | 欧洲精品久久一区二区 | 亚洲va在线观看 | 人妻少妇偷人精品久久性色 | 国产美女久久 | 小泽玛利亚一区二区三区视频 | 亚洲一区二区三区中文字幕 | 成人福利在线观看 | 国产精品永久免费观看 | 欧美特黄色片 | 亚洲精品黄| 亚洲天天操 | 国产精久 | av最新地址 | 99色在线| 国产情侣一区二区 | 欧美又粗又长又爽做受 | 亚洲欲色 | 狠狠综合久久 | 国产精品一区二区毛片 | 国产真人做爰毛片视频直播 | 久久avav | 免费 成 人 黄 色 | 国产夫妻视频 | 搞逼综合网 | 国产伦精品一区二区三区视频痴汉 | 午夜生活片 | 麻豆视| 18欧美性xxxx极品hd | 噼里啪啦国语电影 | 99re在线视频播放 | 国产免费91 | 久久国产精品系列 | 国产99久久久国产精品 | 中文字幕一区电影 | 麻豆视频传媒入口 | 国产精品一区二区三区免费视频 | 久99| 熟女人妻一区二区三区免费看 | 推特裸体gay猛交gay | 欧美福利在线视频 | 一级高清视频 | 欧美 日韩 国产 一区 | 国产chinese男男gaygay视频 | 欧美67194| 伊人院| 激情综合网五月 | 三级全黄做爰在线观看 | 国产精品毛片一区视频播 | 久草福利在线视频 | 亚洲欧美一区在线 | 中文字幕国产综合 | 骚虎免费视频 | 九热在线| 免费看日韩毛片 | 99色播| 99精品久久毛片a片 成人网一区 | 免费 成 人 黄 色 | 91美女片黄在线观看游戏 | 国产激情无码一区二区 | 四虎影| 亚洲精品国产欧美在线观看 | 色五婷婷 | 亚洲av无码一区二区三区dv | 黄色片在线视频 | 天天操天天射天天爽 | 成人免费在线视频观看 | www.超碰 | 免费看aaaaa级少淫片 | 国产丝袜在线视频 | 波多野结衣视频在线看 | 国产精品福利在线 | 骚黄网站| 日b视频在线观看 | 亚洲麻豆av | 国产在线免费视频 | 日韩性大片|