剪裁NURBS曲面

/*---------------------------------------------------------------- * This example creates and displays a Bezier Surface * with trim curves. The surface is identical to the * surface in example 08.3.BezSurf. The SoNurbsProfile * class is used to define the trims. * * One trim curve makes a counter-clockwise square around * the whole surface. Two other trim curves are combined * end to end to cut a hole from the surface. The outside * trim curve and the first inside trim curve are both * order 2 curves and are therefore sets of straight lines * in parameter space. The second inside curve is a * Bezier curve. *----------------------------------------------------------------*/ #include <Inventor/SoDB.h> #include <Inventor/SoInput.h> #include <Inventor/Win/SoWin.h> #include <Inventor/Win/viewers/SoWinExaminerViewer.h> #include <Inventor/nodes/SoBaseColor.h> #include <Inventor/nodes/SoCamera.h> #include <Inventor/nodes/SoComplexity.h> #include <Inventor/nodes/SoCoordinate3.h> #include <Inventor/nodes/SoDrawStyle.h> #include <Inventor/nodes/SoLightModel.h> #include <Inventor/nodes/SoMaterial.h> #include <Inventor/nodes/SoNurbsProfile.h> #include <Inventor/nodes/SoNurbsSurface.h> #include <Inventor/nodes/SoProfileCoordinate2.h> #include <Inventor/nodes/SoRotation.h> #include <Inventor/nodes/SoScale.h> #include <Inventor/nodes/SoSeparator.h> #include <Inventor/nodes/SoTexture2.h> #include <Inventor/nodes/SoTranslation.h> // Maximum length of Microsoft string literal is 2048 bytes!!!! // Break it into 2 pieces. // Also change path for texture image files to relative path. static char * floorData1 = "#Inventor V2.0 ascii/n" "Separator {/n" " SpotLight {/n" " cutOffAngle 0.9/n" " dropOffRate 0.2/n" " location 6 12 2/n" " direction 0 -1 0/n" " }/n" " ShapeHints {/n" " faceType UNKNOWN_FACE_TYPE/n" " }/n" " Texture2Transform {/n" " #rotation 1.57/n" " scaleFactor 8 8/n" " }/n" " Texture2 {/n" " filename ../data/oak.gif/n" " }/n" " NormalBinding {/n" " value PER_PART/n" " }/n" " Material { diffuseColor 1 1 1 specularColor 1 1 1 shininess 0.4 }/n" " DEF FloorPanel Separator {/n" " DEF FloorStrip Separator {/n" " DEF FloorBoard Separator {/n" " Normal { vector 0 1 0 }/n" " TextureCoordinate2 {/n" " point [ 0 0, 0.5 0, 0.5 2, 0.5 4, 0.5 6,/n" " 0.5 8, 0 8, 0 6, 0 4, 0 2 ] }/n" " Coordinate3 {/n" " point [ 0 0 0, .5 0 0, .5 0 -2, .5 0 -4, .5 0 -6,/n" " .5 0 -8, 0 0 -8, 0 0 -6, 0 0 -4, 0 0 -2, ]/n" " }/n" " FaceSet { numVertices 10 }/n" " BaseColor { rgb 0.3 0.1 0.0 }/n" " Translation { translation 0.125 0 -0.333 }/n" " Cylinder { parts TOP radius 0.04167 height 0.002 }/n" " Translation { translation 0.25 0 0 }/n" " Cylinder { parts TOP radius 0.04167 height 0.002 }/n" " Translation { translation 0 0 -7.333 }/n" " Cylinder { parts TOP radius 0.04167 height 0.002 }/n" " Translation { translation -0.25 0 0 }/n" " Cylinder { parts TOP radius 0.04167 height 0.002 }/n"; static char * floorData2 = " }/n" " Translation { translation 0 0 8.03 }/n" " USE FloorBoard/n" " Translation { translation 0 0 8.04 }/n" " USE FloorBoard/n" " }/n" " Translation { translation 0.53 0 -0.87 }/n" " USE FloorStrip/n" " Translation { translation 0.53 0 -2.3 }/n" " USE FloorStrip/n" " Translation { translation 0.53 0 1.3 }/n" " USE FloorStrip/n" " Translation { translation 0.53 0 1.1 }/n" " USE FloorStrip/n" " Translation { translation 0.53 0 -0.87 }/n" " USE FloorStrip/n" " Translation { translation 0.53 0 1.7 }/n" " USE FloorStrip/n" " Translation { translation 0.53 0 -0.5 }/n" " USE FloorStrip/n" " }/n" " Translation { translation 4.24 0 0 }/n" " USE FloorPanel/n" " Translation { translation 4.24 0 0 }/n" " USE FloorPanel/n" "}"; static char *floorData; // CODE FOR The Inventor Mentor STARTS HERE // The array of trim coordinates const float tpts[12][2] = { { 0.0f, 0.0f }, { 1.0f, 0.0f }, { 1.0f, 1.0f }, { 0.0f, 1.0f }, { 0.2f, 0.2f }, { 0.2f, 0.7f }, { 0.9f, 0.7f }, { 0.9f, 0.2f }, { 0.7f, 0.0f }, { 0.4f, 0.8f } }; // The 16 coordinates defining the Bezier surface. const float pts[16][3] = { {-4.5f,-2.0f, 8.0f}, {-2.0f, 1.0f, 8.0f}, { 2.0f,-3.0f, 6.0f}, { 5.0f,-1.0f, 8.0f}, {-3.0f, 3.0f, 4.0f}, { 0.0f,-1.0f, 4.0f}, { 1.0f,-1.0f, 4.0f}, { 3.0f, 2.0f, 4.0f}, {-5.0f,-2.0f,-2.0f}, {-2.0f,-4.0f,-2.0f}, { 2.0f,-1.0f,-2.0f}, { 5.0f, 0.0f,-2.0f}, {-4.5f, 2.0f,-6.0f}, {-2.0f,-4.0f,-5.0f}, { 2.0f, 3.0f,-5.0f}, { 4.5f,-2.0f,-6.0f} }; // The 3 knot vectors for the 3 trim curves. float tknots1[7] = { 0.0f, 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 4.0f }; float tknots2[6] = { 0.0f, 0.0f, 1.0f, 2.0f, 3.0f, 3.0f }; float tknots3[8] = { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f }; // The Bezier knot vector for the surface. // This knot vector is used in both the U and // V directions. float knots[8] = { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f }; // Create the nodes needed for the Bezier patch // and its trim curves. SoSeparator * makeSurface() { SoSeparator *surfSep = new SoSeparator(); surfSep->ref(); // Define the Bezier surface including the control // points, trim curve, and a complexity. SoComplexity *complexity = new SoComplexity; SoCoordinate3 *controlPts = new SoCoordinate3; SoNurbsSurface *surface = new SoNurbsSurface; complexity->value = 0.7f; controlPts->point.setValues(0, 16, pts); surface->numUControlPoints.setValue(4); surface->numVControlPoints.setValue(4); surface->uKnotVector.setValues(0, 8, knots); surface->vKnotVector.setValues(0, 8, knots); surfSep->addChild(complexity); surfSep->addChild(controlPts); SoProfileCoordinate2 *trimPts = new SoProfileCoordinate2; SoNurbsProfile *nTrim1 = new SoNurbsProfile; SoNurbsProfile *nTrim2 = new SoNurbsProfile; SoNurbsProfile *nTrim3 = new SoNurbsProfile; int32_t trimInds[5]; trimPts->point.setValues(0, 12, tpts); trimInds[0] = 0; trimInds[1] = 1; trimInds[2] = 2; trimInds[3] = 3; trimInds[4] = 0; nTrim1->index.setValues(0, 5, trimInds); nTrim1->knotVector.setValues(0, 7, tknots1); trimInds[0] = 4; trimInds[1] = 5; trimInds[2] = 6; trimInds[3] = 7; nTrim2->linkage.setValue(SoProfile::START_NEW); nTrim2->index.setValues(0, 4, trimInds); nTrim2->knotVector.setValues(0, 6, tknots2); trimInds[0] = 7; trimInds[1] = 8; trimInds[2] = 9; trimInds[3] = 4; nTrim3->linkage.setValue(SoProfile::ADD_TO_CURRENT); nTrim3->index.setValues(0, 4, trimInds); nTrim3->knotVector.setValues(0, 8, tknots3); surfSep->addChild(trimPts); surfSep->addChild(nTrim1); surfSep->addChild(nTrim2); surfSep->addChild(nTrim3); surfSep->addChild(surface); surfSep->unrefNoDelete(); return surfSep; } // CODE FOR The Inventor Mentor ENDS HERE int main(int, char **argv) { floorData = new char[strlen(floorData1)+strlen(floorData2)+1]; strcpy(floorData,floorData1); strcat(floorData,floorData2); // Initialize Inventor and Win HWND appWindow = SoWin::init(argv[0]); if (appWindow == NULL) exit(1); SoSeparator *root = new SoSeparator; root->ref(); SoRotation *rot = new SoRotation; rot->rotation.setValue(SbRotation(SbVec3f(0.0f, 1.0f, 0.0f), (float)(M_PI/2.0f))); root->addChild(rot); // Create the scene graph for the carpet; SoSeparator *carpet = new SoSeparator; SoSeparator *surf = makeSurface(); SoTexture2 *tex = new SoTexture2; tex->ref(); tex->filename.setValue("../data/diamondRug.rgb"); carpet->addChild(tex); carpet->addChild(surf); root->addChild(carpet); // Create the scene graph for the floor SoSeparator *floor = new SoSeparator; SoTranslation *xlate = new SoTranslation; SoScale *scale = new SoScale; SoInput in; SoNode *result; in.setBuffer(floorData, strlen(floorData)); SoDB::read(&in, result); xlate->translation.setValue(SbVec3f(-12.0f, -5.0f, -5.0f)); scale->scaleFactor.setValue(SbVec3f(2.0f, 1.0f, 2.0f)); floor->addChild(xlate); floor->addChild(scale); floor->addChild(result); root->addChild(floor); // Create the scene graph for the carpet's shadow SoSeparator *shadow = new SoSeparator; SoLightModel *shmdl = new SoLightModel; SoMaterial *shmtl = new SoMaterial; SoBaseColor *shclr = new SoBaseColor; SoTranslation *shxl = new SoTranslation; SoScale *shscl = new SoScale; shmdl->model = SoLightModel::BASE_COLOR; shclr->rgb.setValue(SbColor(0.21f, 0.15f, 0.09f)); shmtl->transparency = 0.3f; shxl->translation.setValue(SbVec3f(0.0f, -4.9f, 0.0f)); shscl->scaleFactor.setValue(SbVec3f(1.0f, 0.0f, 1.0f)); shadow->addChild(shmtl); shadow->addChild(shmdl); shadow->addChild(shclr); shadow->addChild(shxl); shadow->addChild(shscl); shadow->addChild(surf); root->addChild(shadow); // Initialize an Examiner Viewer SoWinExaminerViewer *viewer = new SoWinExaminerViewer(appWindow); viewer->setSceneGraph(root); viewer->setTitle("Trimmed Nurbs Surface"); SoCamera *cam = viewer->getCamera(); cam->position.setValue(SbVec3f(-8.5f, 13.0f, 23.0f)); cam->pointAt(SbVec3f(-2.0f, -2.0f, -4.0f)); viewer->show(); SoWin::show(appWindow); SoWin::mainLoop(); delete floorData; return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值