[vtkusers] visualizing NURBS++ surfaces (maybe a FAQ??)
Giancarlo Facoetti
faco1976 at gmail.com
Wed Aug 24 11:01:16 EDT 2011
Hi Bryn,
you have given me a great suggestion!
I didn't think about the simplest solution: using directly the OpenGL
rendering function into my VTK renderwindow. I think that this is the
easiest way.
Furthermore, I will implement the nurbs control points with a VTK
object, like a set of vertex or a vtkPolyData, in order to have the
possibility to manipulate the points inside the VTK framework.
After all, I need to render the nurbs surface only for visualization
purpose, the modify/manipulation of the surface will be done by control
points.
thank you!
Gaincarlo
> Well, I guess you might modify the gluNurbsSurface function, and use it to
> export the triangle mesh.
>
> Otherwise, you could visualize using NURBS directly into your VTK
> renderwindow using code like:
>
>
> #include <vtkgl.h>
>
> #include "vtkPolyData.h"
> #include "vtkPoints.h"
> #include "vtkCellArray.h"
> #include "vtkPolyDataMapper.h"
> #include "vtkProperty.h"
> #include "vtkActor.h"
> #include "vtkRenderWindow.h"
> #include "vtkRenderer.h"
> #include "vtkRenderWindowInteractor.h"
>
> #include "vtkProp3D.h"
> #include "vtkObjectFactory.h"
>
> #include "Options.h"
>
> #include "vtkSmartPointer.h"
> #define vtkNew(type,name) \
> vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
>
> // example code, replace e.g. by the NURBS++ "render" function
> void callOpenGLCode(double a[3], double b[3], double c[3])
> {
> glEnable(GL_COLOR_MATERIAL);
> glClearColor(0.7f, 0.9f, 1.0f, 1.0f);
> glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
>
> glEnable(GL_CULL_FACE);
> glCullFace(GL_FRONT);
>
> glBegin (GL_TRIANGLES);
> glVertex3f (a[0],a[1],a[2]);
> glVertex3f (b[0],b[1],b[2]);
> glVertex3f (c[0],c[1],c[2]);
> glEnd ();
>
> glCullFace(GL_BACK);
> glBegin (GL_TRIANGLES);
> glVertex3f (a[0],a[1],a[2]);
> glVertex3f (b[0],b[1],b[2]);
> glVertex3f (c[0],c[1],c[2]);
> glEnd ();
> }
>
> class vtkMyProp3D : public vtkProp3D
> {
> public:
> vtkTypeMacro(vtkMyProp3D,vtkProp3D);
> void PrintSelf(ostream& os, vtkIndent indent) {}
> static vtkMyProp3D *New();
>
> int RenderOpaqueGeometry(vtkViewport *)
> {
> int renderedSomething = 0;
> callOpenGLCode(a,b,c);
> return renderedSomething;
> }
> void setABC(double _a[3], double _b[3], double _c[3])
> {
> for(int i=0; i<3; i++)
> {
> a[i] = _a[i];
> b[i] = _b[i];
> c[i] = _c[i];
> }
> }
> double* GetBounds()
> {
> double *bounds = new double[6];
> for(int i=0; i<3; i++)
> {
> bounds[i*2] =
> vtkstd::min(vtkstd::min(a[i],b[i]),c[i]);
> bounds[i*2+1] =
> vtkstd::max(vtkstd::max(a[i],b[i]),c[i]);
> }
> return bounds;
> }
> double a[3];
> double b[3];
> double c[3];
> };
>
> vtkStandardNewMacro(vtkMyProp3D);
>
> int main (int argc, char **argv)
> {
>
> std::string iname;
> Options opt(argc,argv);
> opt.add("i",&iname,"input file");
> opt.parse();
>
> double a[] = {0,0,0};
> double b[] = {1,0,0};
> double c[] = {1,1,1};
> double z = 0.3;
>
> // create input
> vtkNew(vtkPolyData, pdata);
> vtkNew(vtkPoints, pts);
> vtkNew(vtkCellArray, cells);
> pdata->SetPoints(pts);
> pdata->SetPolys(cells);
> pdata->GetPoints()->InsertNextPoint(a[0],a[1],a[2]+z);
> pdata->GetPoints()->InsertNextPoint(b[0],b[1],b[2]+z);
> pdata->GetPoints()->InsertNextPoint(c[0],c[1],c[2]+z);
> vtkIdType ids[] = {0,1,2};
> cells->InsertNextCell(3, ids);
>
> // map to graphics library
> vtkNew(vtkPolyDataMapper, map);
> map->SetInput(pdata);
>
> // actor coordinates geometry, properties, transformation
> vtkNew(vtkActor, aSphere);
> aSphere->SetMapper(map);
> aSphere->GetProperty()->SetColor(0,0,1); // sphere color blue
>
> // a renderer and render window
> vtkNew(vtkRenderer, ren1);
> vtkNew(vtkRenderWindow, renWin);
> renWin->AddRenderer(ren1);
>
> // an interactor
> vtkNew(vtkRenderWindowInteractor, iren);
> iren->SetRenderWindow(renWin);
>
> // add the actor to the scene
> ren1->AddActor(aSphere);
> //ren1->SetBackground(1,1,1); // Background color white
>
> vtkNew(vtkMyProp3D,myprop);
> myprop->setABC(a,b,c);
> ren1->AddActor(myprop);
>
> // render an image (lights and cameras are created automatically)
> renWin->Render();
>
> // begin mouse interaction
> iren->Start();
>
> return 0;
> }
>
>
>
>
More information about the vtkusers
mailing list