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,多紋理的支持,還需要進一步的研究。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章