生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道59:图形基本操作进阶_纹理映射
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.紋理映射
紋理映射是將紋理空間中的紋理像素映射到屏幕空間中的像素的過程。紋理生成過程實質上是將所定義的紋理映射為某種三維物體表面的屬性,并參與后續(xù)的光照計算。在三維圖形中,紋理映射運用的十分廣泛,尤其是描述具有真實感的物體。
實現(xiàn)紋理映射主要是建立紋理空間與模型空間、模型空間與屏幕空間之間的映射關系,如上圖所示。其中紋理空間可以定義為u-v空間,每個坐標軸的范圍為(0,1)。對于一個紋理圖像,其左下角的坐標為(0,0),右上角坐標為(1,1)。 而對于簡單的參數(shù)模型,可以方便地建立模型與紋理空間的映射關系,例如球面、圓柱面等。 而根據(jù)圖形學三維空間變換容易實現(xiàn)模型空間到屏幕空間的變換,因此最終顯示在計算機屏幕的圖像及時紋理映射后的結果。 面對無參數(shù)化曲面的紋理映射技術,通常需要蔣雯麗空間到模型空間的映射分解為兩個簡單映射,需要引入一個包圍景物的中介映射媒介,只要步驟如下: 現(xiàn)將二維紋理空間映射為一個簡單的三維物體表面(球面圓柱面等);然后將該中介物體表面的紋理映射到模型表面(例如,以模型表面法線與中建模型的交點作為映射點),這就可以實現(xiàn)由紋理空間到模型空間映射。
2.VTK中實現(xiàn)紋理映射
VTK中定義了多個類實現(xiàn)紋理空間到模型空間的映射 - vtkTextureMapToPlane:通過一個平面建立紋理空間到模型空間的映射關系;
- vtkTextureToSphere:通過球面建立映射關系;
- vtkTextureMapToCylinder:通過圓柱面建立映射關系;
- vtkTexture:實現(xiàn)加載紋理;
- vtkTransformTextureCoords:實現(xiàn)紋理坐標的平移和縮放。
本實例使用vtkTextureMapToCylinder建立紋理映射,具體實現(xiàn)如下: #include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h>
#include <vtkBMPReader.h> //讀入紋理圖像
#include <vtkTexture.h> //加載紋理圖像
#include <vtkXMLPolyDataReader.h>//加載模型數(shù)據(jù)
#include <vtkTextureMapToCylinder.h>//采用圓柱作為中介
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkOrientationMarkerWidget.h>
#include <vtkAxesActor.h>
#include <vtkOrientationMarkerWidget.h>int main(int argc, char *argv[])
{vtkSmartPointer<vtkBMPReader> texReader =vtkSmartPointer<vtkBMPReader>::New();texReader->SetFileName("masonry.bmp");vtkSmartPointer<vtkTexture> texture =vtkSmartPointer<vtkTexture>::New();texture->SetInputConnection(texReader->GetOutputPort());vtkSmartPointer<vtkXMLPolyDataReader> modelReader =vtkSmartPointer<vtkXMLPolyDataReader>::New();modelReader->SetFileName("cow.vtp");//紋理映射vtkSmartPointer<vtkTextureMapToCylinder> texturemap =vtkSmartPointer<vtkTextureMapToCylinder>::New();texturemap->SetInputConnection(modelReader->GetOutputPort());/*******************************************************************/vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(texturemap->GetOutputPort());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);actor->SetTexture(texture); //加載紋理圖//設定坐標系vtkSmartPointer<vtkAxesActor> axes =vtkSmartPointer<vtkAxesActor>::New();vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(renderer);rw->SetSize(640, 480);rw->SetWindowName("TextureMap");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);/**********************************************************/vtkSmartPointer<vtkOrientationMarkerWidget> widget =vtkSmartPointer<vtkOrientationMarkerWidget>::New();widget->SetOutlineColor(1, 1, 1);widget->SetViewport(0, 0, 0.3,0.3);widget->SetOrientationMarker(axes);widget->SetInteractor(rwi);widget->SetEnabled(1);widget->InteractiveOn();/**********************************************************/renderer->ResetCamera();rw->Render();rwi->Start();return 0;
}
這個實例應用非常簡單,輸出結果如下:
3.參看資料:
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發(fā)進階[M]. 機械工業(yè)出版社, 2015.
總結
以上是生活随笔為你收集整理的VTK修炼之道59:图形基本操作进阶_纹理映射的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。