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);
renderWindow->Render();
renderer->AddLight(lightFront);
renderWindowInteractor->Start();
vtk对光源的支持也非常有限,不过anyway,既然用vtk了,就的知道怎样调光源吧:
添加lightactor,就能显示光源,这样就能知道自己的光照是否设置准确。
vtkSmartPointer<vtkLightActor> lightActor = vtkSmartPointer<vtkLightActor>::New();
lightActor->SetLight(lightFront);
renderer->AddViewProp(lightActor);
目前支持的还是单个texture,多纹理的支持,还需要进一步的研究。