//---------------------------------------------------------------------------- void Rope::CreateRope () { // Create a quadratic spline using particles as control points. int numCtrlPoints = mModule->GetNumParticles(); Vector3f* ctrlPoints = mModule->Positions(); const int degree = 2; mSpline = new0 BSplineCurve3f(numCtrlPoints, ctrlPoints, degree, false, true); // Generate a tube surface whose medial axis is the spline. VertexFormat* vformat = VertexFormat::Create(2, VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0, VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0); Float2 tcoordMin(0.0f, 0.0f), tcoordMax(1.0f, 1.0f); mRope = new0 TubeSurface(mSpline, Radial, false, Vector3f::UNIT_Z, 64, 8, false, false, &tcoordMin, &tcoordMax, vformat); // Attach a texture for the rope. std::string path = Environment::GetPathR("Rope.wmtf"); Texture2D* texture = Texture2D::LoadWMTF(path); mRope->SetEffectInstance(Texture2DEffect::CreateUniqueInstance(texture, Shader::SF_LINEAR_LINEAR, Shader::SC_REPEAT, Shader::SC_REPEAT)); mTrnNode->AttachChild(mRope); }
//---------------------------------------------------------------------------- void WrigglingSnake::CreateSnakeBody () { // Create the B-spline curve for the snake body. Vector3f* ctrlPoints = new1<Vector3f>(mNumCtrlPoints); int i; for (i = 0; i < mNumCtrlPoints; ++i) { // Control points for a snake. float ratio = ((float)i)/(float)(mNumCtrlPoints - 1); float x = -1.0f + 2.0f*ratio; float xMod = 10.0f*x - 4.0f; ctrlPoints[i].X() = x; ctrlPoints[i].Y() = msRadius*(1.5f + Mathf::ATan(xMod)/Mathf::PI); ctrlPoints[i].Z() = 0.0f; // Sinusoidal motion for snake. mAmplitudes[i] = 0.1f + ratio*Mathf::Exp(-ratio); mPhases[i] = 1.5f*ratio*Mathf::TWO_PI; } // The control points are copied by the curve objects. mCenter = new0 BSplineCurve3f(mNumCtrlPoints, ctrlPoints, mDegree, false, true); delete1(ctrlPoints); // Generate a tube surface. VertexFormat* vformat = VertexFormat::Create(2, VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0, VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0); Float2 tcoordMin(0.0f, 0.0f), tcoordMax(1.0f, 16.0f); mSnakeBody = new0 TubeSurface(mCenter, Radial, false, Vector3f::UNIT_Y, 128, 32, false, false, &tcoordMin, &tcoordMax, vformat); // Attach a texture to the snake body. std::string path = Environment::GetPathR("Snake.wmtf"); Texture2D* texture = Texture2D::LoadWMTF(path); mSnakeBody->SetEffectInstance(Texture2DEffect::CreateUniqueInstance( texture, Shader::SF_LINEAR_LINEAR, Shader::SC_REPEAT, Shader::SC_REPEAT)); mSnakeRoot->AttachChild(mSnakeBody); }