图形学|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:


本文实现的结果:


图形学|vtk读取obj文件和贴图
文章图片




显示结果好像有点暗,于是添加光源:


【图形学|vtk读取obj文件和贴图】

vtkSmartPointer lightFront = vtkSmartPointer::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读取obj文件和贴图
文章图片


vtk对光源的支持也非常有限,不过anyway,既然用vtk了,就的知道怎样调光源吧:
添加lightactor,就能显示光源,这样就能知道自己的光照是否设置准确。



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


图形学|vtk读取obj文件和贴图
文章图片




目前支持的还是单个texture,多纹理的支持,还需要进一步的研究。



    推荐阅读