青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

OpenCASCADE Texture Mapping

Posted on 2018-05-09 20:47 eryar 閱讀(1913) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE Texture Mapping

eryar@163.com

Abstract. 紋理貼圖技術的出現和流行是圖形顯示技術的一個非常重要的里程碑,直接影響3D技術從工業進入娛樂領域。本文結合OpenCASCADE中紋理貼圖的源碼,來說明紋理貼圖在OpenCASCADE中實現。

Key Words. OpenCASCADE 紋理貼圖, Texture Mapping

1.Introduction

紋理貼圖技術的出現和流行是圖形顯示技術的一個非常重要的里程碑,直接影響了3D技術從工業界進入娛樂領域。在OpenGL中面片的著色方法很有限,只能在頂點設定顏色,每個面片上像素的顏色使用各個頂點顏色的插值。這就導致了顯示的圖像不真實。可以想象畫一個有磚墻,每個磚面都需要用一個多邊形表示,磚與磚連接的水泥也要用多邊形表示,并且設計者要精心擺放這些多邊形,還要為不同的多邊形設定各自的顏色。即使工作量如此之大,也不能更加真實地繪制出磚面上的裂紋、凹槽等更加豐富的細節。

wps_clip_image-14862

Figure 1. Textured Box in OpenCASCADE Viewer

而有了紋理貼圖一切就簡單了,設計者只需要準備好一小磚面的圖片,然后畫一個矩形表示墻面,就可以將圖片貼到矩形面上。這個磚塊的圖片文件稱為紋理或者紋理圖像。因為這個方法核心思想就是把圖片和圖形對應起來,所以也稱為紋理映射(Texture Mapping)。

本文主要介紹OpenCASCADE中紋理映射的實現。理解了其實現原理,就可以理解其優勢和局限性,在此基礎上便于去擴展,實現一些個性化的功能。

2.Texture Mapping

Texture mapping is a method for defining high frequency detail, surface texture or color information on a computer-generated graphic or 3d mode. Its application to 3d graphics was pioneered by Edwin Catmull in 1974. Texture mapping originally  referred to a method that simply wrapped and mapped pixels from a texture to a 3d surface.

A texture map is an image applied(mapped) to the surface of a shape or polygon. This may be a bitmap image or procedural texture.

They may have 1~3 dimensions, although 2 dimensions are most common for visible surfaces.

以上內容來自wikipedia,原文鏈接:https://en.wikipedia.org/wiki/Texture_mapping

紋理映射的原理就是將二維的圖片映射到三維的面上去。這個過程和參數曲面類似,就是一個二元函數,則紋理坐標就與參數曲面的參數u,v的含義一致了。

wps_clip_image-8831

Figure 2. Applying a 2d texture to a quad

3.OpenCASCADE Texture Mapping

OpenCASCADE中提供類AIS_TexturedShape來實現帶紋理的模型,通過構造函數來設置模型,通過函數SetTextureFileName()來指定紋理貼圖。當紋理貼圖的文件名是個數字時,則使用內置的貼圖文件,也就是如下enum定義的標準紋理貼圖:

//! Types of standard textures.
enum Graphic3d_NameOfTexture2D
{
Graphic3d_NOT_2D_MATRA,
Graphic3d_NOT_2D_ALIENSKIN,
Graphic3d_NOT_2D_BLUE_ROCK,
Graphic3d_NOT_2D_BLUEWHITE_PAPER,
Graphic3d_NOT_2D_BRUSHED,
Graphic3d_NOT_2D_BUBBLES,
Graphic3d_NOT_2D_BUMP,
Graphic3d_NOT_2D_CAST,
Graphic3d_NOT_2D_CHIPBD,
Graphic3d_NOT_2D_CLOUDS,
Graphic3d_NOT_2D_FLESH,
Graphic3d_NOT_2D_FLOOR,
Graphic3d_NOT_2D_GALVNISD,
Graphic3d_NOT_2D_GRASS,
Graphic3d_NOT_2D_ALUMINUM,
Graphic3d_NOT_2D_ROCK,
Graphic3d_NOT_2D_KNURL,
Graphic3d_NOT_2D_MAPLE,
Graphic3d_NOT_2D_MARBLE,
Graphic3d_NOT_2D_MOTTLED,
Graphic3d_NOT_2D_RAIN,
Graphic3d_NOT_2D_CHESS,
Graphic3d_NOT_2D_UNKNOWN
};

這些enum變量分別對應環境變量CSF_MDTVTexturesDirectory文件夾中的那些以2d開頭的rgb文件。如下圖所示:

wps_clip_image-14544

Figure 3. OpenCASCADE Standard Textures

在類AIS_TexturedShape的函數Compute()中通過類StdPrs_ShadedShape來計算紋理坐標UV,相關代碼如下:

StdPrs_ShadedShape::Add (thePrs, myshape, myDrawer,
                                   Standard_True,
                                   myIsCustomOrigin ? myUVOrigin : gp_Pnt2d (0.0, 0.0),
                                   myUVRepeat,
                                   myToScale        ? myUVScale  : gp_Pnt2d (1.0, 1.0));
          updateAttributes (thePrs);

在類StdPrs_ShadedShape中有個靜態函數fillTriangles()來生成顯示數據,其中計算紋理坐標相關的代碼列出如下所示:

if (theHasTexels)
      {
        BRepTools::UVBounds (aFace, aUmin, aUmax, aVmin, aVmax);
        dUmax = (aUmax - aUmin);
        dVmax = (aVmax - aVmin);
      }
      const Standard_Integer aDecal = anArray->VertexNumber();
      for (Standard_Integer aNodeIter = aNodes.Lower(); aNodeIter <= aNodes.Upper(); ++aNodeIter)
      {
        aPoint = aNodes (aNodeIter);
        const Standard_Integer anId = 3 * (aNodeIter - aNodes.Lower());
        gp_Dir aNorm (aNormArr[anId + 0], aNormArr[anId + 1], aNormArr[anId + 2]);
        if (aFace.Orientation() == TopAbs_REVERSED)
        {
          aNorm.Reverse();
        }
        if (!aLoc.IsIdentity())
        {
          aPoint.Transform (aTrsf);
          aNorm.Transform (aTrsf);
        }
        if (theHasTexels && aUVNodes.Upper() == aNodes.Upper())
        {
          const gp_Pnt2d aTexel = gp_Pnt2d ((-theUVOrigin.X() + (theUVRepeat.X() * (aUVNodes (aNodeIter).X() - aUmin)) / dUmax) / theUVScale.X(),
                                            (-theUVOrigin.Y() + (theUVRepeat.Y() * (aUVNodes (aNodeIter).Y() - aVmin)) / dVmax) / theUVScale.Y());
          anArray->AddVertex (aPoint, aNorm, aTexel);
        }
        else
        {
          anArray->AddVertex (aPoint, aNorm);
        }
      }

從上述代碼中可以看到,OpenCASCADE中計算紋理UV坐標的方法就是對Shape的每個面,取出其幾何參數曲面,并將曲面的參數空間單位化后作為紋理坐標。

4.Draw Test Harness

OpenCASCADE在Draw Test Harness中提供了命令vtexture來生成紋理貼圖的模型。如本文開始的那個地板貼圖的長方體可以用如下命令來實現:

box b 1 2 3
vdisplay b
vtexture b 11

 

wps_clip_image-9246

Figure 4. OpenCASCADE Standard Texture

當貼圖使用數字時,使用的是opencascade內置的貼圖文件。也可以指定自定義的貼圖文件,如下所示:

psphere ps 100
vdisplay ps
vtexture ps d:/earth.jpg

 

其中d:/earth.jpg為D盤的一個貼圖文件。

wps_clip_image-16358

Figure 5. Map world texture to Sphere

5.Conclusion

OpenGL的紋理貼圖可以理解為參數曲面的參數空間,即是一個二維UV空間,通過參數UV可以計算出曲面上對應的三維點,即將二維的貼圖映射到三維的曲面上去。

OpenCASCADE中紋理貼圖使用類AIS_TexturedShape,其對紋理坐標UV的計算使用類StdPrs_ShadedShape,就是將Shape中每個面對應的幾何參數曲面的參數空間單位化后作為紋理坐標。

在Draw Test Harness中有命令vtexture來生成紋理貼圖。當紋理貼圖文件是數字時,會使用OpenCASCADE內置的貼圖文件,也可以指定自定義的貼圖文件。

在OpenCASCADE的官網論壇上有個關于紋理貼圖的問題:

https://www.opencascade.com/comment/20458 將其中KGV的答復摘出如下:

You shape consists of 3 Faces (see attached screenshot from CAD Assistant).

Standard presentation builder StdPrs_ShadedShape (used by AIS_TexturedShape) defines texture mapping UV coordinates from Surface parametric space individually for each Face.

To achieve desired result, either you have to create a single Face instead of 3 Faces in this specific place (I don't know if you are going to texture other shapes and in which way),

or compute UV texture coordinates manually using some alternative mapping logic (like projecting triangle nodes onto plane).

In general case (complex shape definition), you might need creating a mesh Unfolding to be able generating a texture coordinates considering seam edges:

https://www.opencascade.com/content/unfolding-library

There are also visualization-only solutions for generating texture UV coordinates on GPU, depending on what you are trying to achieve

(Graphic3d_Texture2Dplane/Graphic3d_TextureEnv, though these are rarely used due to limited use cases where such mapping makes sense).

其中也提到OpenCASCADE中紋理坐標的生成方式。

其實紋理坐標UV的處理是三維軟件的一個功能,像Blender中就專門有UV Editing來編輯UV坐標,以實現個性化的要求。

wps_clip_image-23081

wps_clip_image-28289

Figure 7. UV Editing in Blender

6.References

1. https://www.opencascade.com/comment/20458

2. https://www.bilibili.com/video/av18054281?from=search&seid=231681022662274909

3. https://en.wikipedia.org/wiki/World_map

4. OpenGL Programming Guide

5. OpenGL Super Bible


為了方便大家在移動端也能看到我的博文和討論交流,現已注冊微信公眾號,歡迎大家掃描下方二維碼關注。
Shing Liu(eryar@163.com)

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲韩日在线| 亚洲清纯自拍| 嫩草国产精品入口| 久久爱另类一区二区小说| 午夜精品国产| 久久精品1区| 久久久久国产精品一区三寸 | 欧美亚洲视频在线观看| 亚洲欧美日韩视频二区| 午夜日韩福利| 奶水喷射视频一区| 亚洲欧洲一区二区天堂久久| 亚洲每日在线| 久久精品国产欧美亚洲人人爽| 久久天堂成人| 欧美视频中文字幕| 国产一区二区三区在线观看视频 | 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 美日韩精品免费| 国产精品一区毛片| 韩国在线一区| 一区二区av在线| 午夜精品久久久| 欧美国产视频在线| 亚洲四色影视在线观看| 久久精品麻豆| 国产精品大全| 91久久精品美女| 久久国产精品亚洲77777| 欧美高清视频一区二区三区在线观看| 亚洲精品一区二区三区在线观看 | 久久久国际精品| 欧美日韩国产限制| 99成人在线| 欧美久久久久久蜜桃| 亚洲欧美视频一区二区三区| 久久精品国产91精品亚洲| 欧美成人一区二区三区| 亚洲男人第一网站| 欧美精品一区二区高清在线观看| 国产色产综合色产在线视频| 99精品99| 亚洲第一黄色网| 久久国产日韩| 国产精品爽黄69| 中文一区二区| 亚洲人被黑人高潮完整版| 久久久一本精品99久久精品66| 国产精品久久久久久久久| 亚洲精品国产精品久久清纯直播| 久久黄色级2电影| 亚洲一区免费在线观看| 欧美日韩免费高清一区色橹橹| 亚洲国产91| 蜜臀a∨国产成人精品| 久久国产福利| 国语自产精品视频在线看抢先版结局 | 国产亚洲精品久久久久久| 亚洲欧美成人一区二区三区| 亚洲理论在线观看| 欧美日韩国产精品一区二区亚洲| 最新中文字幕亚洲| 亚洲第一页中文字幕| 久久深夜福利免费观看| 在线日韩中文字幕| 欧美激情久久久久久| 欧美成人日韩| 亚洲精品在线一区二区| 亚洲欧洲另类国产综合| 欧美日韩国产一区精品一区 | 国产一区二区av| 久久久噜噜噜久久| 久久影院亚洲| 亚洲免费高清| 亚洲图片在区色| 黑人巨大精品欧美一区二区小视频 | 国产精品久久久久国产a级| 性一交一乱一区二区洋洋av| 欧美一区二区在线视频| 亚洲电影免费在线观看| 亚洲欧洲日产国产网站| 国产精品高清免费在线观看| 久久精品国产99国产精品| 麻豆freexxxx性91精品| 一区二区三区四区蜜桃| 欧美一级一区| 欧美系列亚洲系列| 欧美福利在线| 亚洲一区国产| 午夜久久久久| 亚洲国产片色| 亚洲视频香蕉人妖| 永久555www成人免费| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久久九九九九| 日韩一级精品| 校园春色综合网| 亚洲日本理论电影| 亚洲无限av看| 亚洲激情一区二区| 亚洲资源av| 亚洲人成毛片在线播放| 亚洲欧美日韩综合国产aⅴ| 亚洲国产高潮在线观看| 亚洲午夜精品在线| 亚洲精品亚洲人成人网| 国产一区二区主播在线| 免费视频一区| 麻豆精品视频在线观看| 亚洲欧美久久久久一区二区三区| 久久蜜臀精品av| 西瓜成人精品人成网站| 欧美国产日韩在线| 美腿丝袜亚洲色图| 国产美女在线精品免费观看| 亚洲精品乱码久久久久久| 激情五月婷婷综合| 亚洲欧美日韩在线不卡| 一本大道久久a久久综合婷婷| 久久精品色图| 久久久久久夜| 国产视频久久| 亚洲欧美日韩中文视频| 亚洲欧美日韩爽爽影院| 欧美日韩网站| 亚洲精品中文字幕女同| 亚洲日本va午夜在线电影| 久久精品日韩| 久久蜜臀精品av| 国产日韩亚洲欧美综合| 亚洲免费在线精品一区| 亚洲欧美文学| 国产精品欧美日韩| 亚洲视频精品在线| 亚洲女与黑人做爰| 欧美视频在线免费| 中文精品在线| 香蕉av福利精品导航| 国产精品香蕉在线观看| 亚洲欧美激情视频在线观看一区二区三区| 亚洲视频中文| 国产精品免费一区二区三区观看| 亚洲天堂成人在线观看| 午夜精品久久久久久久久| 欧美亚韩一区| 亚洲欧美美女| 一区二区三区在线免费视频| 国内精品一区二区| 亚洲每日更新| 老司机成人网| 亚洲免费高清视频| 欧美日韩小视频| 免费观看亚洲视频大全| 亚洲主播在线| 欧美一区二区三区视频在线 | 亚洲黄网站在线观看| 久久精品视频在线| 久久综合福利| 亚洲日韩欧美视频一区| 欧美另类高清视频在线| 一区二区三区视频观看| 性欧美videos另类喷潮| 国产偷久久久精品专区| 久久久精品动漫| 亚洲精品裸体| 羞羞色国产精品| 亚洲国产高潮在线观看| 欧美色网一区二区| 欧美一级夜夜爽| 亚洲欧洲精品成人久久奇米网| 午夜精品国产更新| 亚洲国产美女| 国产欧美一区二区白浆黑人| 欧美jizz19性欧美| 亚洲一区二区伦理| 亚洲国产一区二区a毛片| 欧美一区二区私人影院日本 | 欧美日本不卡高清| 欧美一区二区三区喷汁尤物| 欧美激情麻豆| 久久不射2019中文字幕| 日韩午夜激情av| 韩日在线一区| 国产精品第一区| 欧美大片一区二区| 欧美亚洲一区三区| 日韩特黄影片| 欧美激情影院| 久久香蕉国产线看观看av| 亚洲在线一区二区| 日韩视频中文字幕| 亚洲高清二区| 红桃视频欧美| 国产精品视频不卡| 欧美日韩中国免费专区在线看| 蜜桃av噜噜一区| 久久久久久精| 欧美一级淫片aaaaaaa视频| 在线性视频日韩欧美| 99在线精品视频在线观看|