vtk讀取obj檔案和貼圖
阿新 • • 發佈:2019-02-09
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:
本文實現的結果:
顯示結果好像有點暗,於是新增光源:
需要注意的是 :add light必須在render之後,interact之前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);
renderWindow->Render();
renderer->AddLight(lightFront);
renderWindowInteractor->Start();
vtk對光源的支援也非常有限,不過anyway,既然用vtk了,就的知道怎樣調光源吧:
新增lightactor,就能顯示光源,這樣就能知道自己的光照是否設定準確。
vtkSmartPointer<vtkLightActor> lightActor = vtkSmartPointer<vtkLightActor>::New(); lightActor->SetLight(lightFront); renderer->AddViewProp(lightActor);
目前支援的還是單個texture,多紋理的支援,還需要進一步的研究。