[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