1. 程式人生 > >vtk讀取obj檔案和貼圖

vtk讀取obj檔案和貼圖

vtk主要處理的是網格模型,對資料進行處理等,處理貼圖和材質,以及渲染就不怎樣了,不過既然用了這個平臺,那麼就儘量來完善一下吧。

學過計算機圖形學都知道,模型的顯示是通過建立網格模型,並且用引數化方法(常規渲染模型處理軟體,比如3dmax等都不需要生成貼圖座標,直接選擇貼圖,貼圖方式,將自動生成貼圖座標),然後新增貼圖,通過顯示卡處理,就能直接顯示帶有貼圖的模型。

這樣就很自然的想到,將這些商業的建模軟體的obj檔案匯出,然後倒入vtk,豐富vtk真實感模型的顯示。真好,vtk也有obj reader, 也支援貼圖處理,但是仔細研究就會發現,vtkobjreader只能讀取幾何模型,並且會將整個模型合併成單個物體,這樣的結果非常糟糕,也不能識別那個模型用了那種材質,那種貼圖等。要想支援貼圖,看來並非那麼容易呀,於是網上找到一個非常不錯的obj處理程式碼,能夠很好的識別obj中的各物體,並且能夠獲得豐富的材質資訊,雖然其讀取的mtl檔案也並非非常完整,但是,能夠滿足ambient,specular,diffusion,normal等貼圖,這個已經很不錯了,當然,大家可以根據自己的需要繼續豐富其mtl讀取的方法。

其程式碼連結:https://github.com/syoyo/tinyobjloader

通過這個類,結合vtk的幾何模型構建與vtktexture,就能構建自己的objloader:

本文實現的結果:


顯示結果好像有點暗,於是新增光源:

 vtkSmartPointer<vtkLight> lightFront = vtkSmartPointer<vtkLight>::New();
  lightFront->SetLightTypeToSceneLight();
  lightFront->SetPosition(lightPosition[0], lightPosition[1] - l, lightPosition[2]);
  lightFront->SetPositional(true); // required for vtkLightActor below
  lightFront->SetConeAngle(30);
  lightFront->SetIntensity(5);
  lightFront->SetFocalPoint(lightFocalPoint[0], lightFocalPoint[1], lightFocalPoint[2]);
  lightFront->SetDiffuseColor(1,1,1);
  lightFront->SetAmbientColor(1,1,1);
  lightFront->SetSpecularColor(1,1,1);
需要注意的是 :add light必須在render之後,interact之前
 renderWindow->Render();

 renderer->AddLight(lightFront);

renderWindowInteractor->Start();

vtk對光源的支援也非常有限,不過anyway,既然用vtk了,就的知道怎樣調光源吧:

新增lightactor,就能顯示光源,這樣就能知道自己的光照是否設定準確。

vtkSmartPointer<vtkLightActor> lightActor = vtkSmartPointer<vtkLightActor>::New();
  lightActor->SetLight(lightFront);
  renderer->AddViewProp(lightActor);

目前支援的還是單個texture,多紋理的支援,還需要進一步的研究。