www.pudn.com > tomohide_fur.03.13.02.zip > MeshFunc.h
//-----------------------------------------------------------------------------
// File: MeshFunc.h
//
// Copyright (C) 2001-2002 Tomohide Kano. All rights reserved.
//-----------------------------------------------------------------------------
#pragma once
// bivariate functions that represent C2 continuous regular surfaces.
// u and v range from 0 to 1.
//-----------------------------------------------------------------------------
// Torus
//-----------------------------------------------------------------------------
static D3DXVECTOR3 torus(float u, float v)
{
u *= 2*D3DX_PI;
v *= 2*D3DX_PI;
D3DXVECTOR3 vec;
vec.x = sin(u) * (2.1 + sin(v));
vec.y = cos(u) * (2.1 + sin(v));
vec.z = cos(v);
return vec;
}
//-----------------------------------------------------------------------------
// Deformed Torus
//-----------------------------------------------------------------------------
static D3DXVECTOR3 torus2(float u, float v)
{
u *= 2*D3DX_PI;
v *= 2*D3DX_PI;
float r = 1.0 + 0.12 * sin(6*u + 3*v) * (0.55 + 0.45*sin(v));
D3DXVECTOR3 vec;
vec.x = sin(u) * (2.1 + r*sin(v));
vec.y = cos(u) * (2.1 + r*sin(v));
vec.z = r*cos(v);
return vec;
}
//-----------------------------------------------------------------------------
// Mobius Strip
//-----------------------------------------------------------------------------
// one-sided strip with three half twists
static D3DXVECTOR3 _mobius(float t)
{
return D3DXVECTOR3(2.3*sin(t), 2.3*cos(t), 0);
}
static D3DXVECTOR3 mobius(float u, float v)
{
u *= 2*D3DX_PI;
v *= 2*D3DX_PI;
D3DXVECTOR3 T, B, N;
D3DXVec3Normalize(&T, &(_mobius(u+0.01) - _mobius(u-0.01)));
D3DXVec3Normalize(&B, D3DXVec3Cross(&B, &T, &D3DXVECTOR3(0,0,1)));
D3DXVec3Normalize(&N, D3DXVec3Cross(&N, &T, &B));
D3DXVECTOR3& b = cos(1.5*u)*B + sin(1.5*u)*N;
D3DXVECTOR3& n = -sin(1.5*u)*B + cos(1.5*u)*N;
return _mobius(u) + (1.0*sin(v+0.5*u)*b + 0.5*cos(v+0.5*u)*n);
}
//-----------------------------------------------------------------------------
// Knot
//-----------------------------------------------------------------------------
static D3DXVECTOR3 _knot(float t)
{
float r = 1.8 + 0.8 * cos(3*t);
float phi = 0.2*D3DX_PI * sin(3*t);
D3DXVECTOR3 vec;
vec.x = r * cos(phi) * sin(2*t);
vec.y = r * cos(phi) * cos(2*t);
vec.z = r * sin(phi);
return vec;
}
static D3DXVECTOR3 knot(float u, float v)
{
u *= 2*D3DX_PI;
v *= 2*D3DX_PI;
u += -0.2 * sin(3*u) + 0.05 * sin(6*u);
D3DXVECTOR3 T, B, N;
D3DXVec3Normalize(&T, &(_knot(u+0.01) - _knot(u-0.01)));
D3DXVec3Normalize(&B, D3DXVec3Cross(&B, &T, &D3DXVECTOR3(0,0,1)));
D3DXVec3Normalize(&N, D3DXVec3Cross(&N, &T, &B));
return _knot(u) + 0.55 * (sin(v)*B + cos(v)*N);
}
///////////////////////////////////////////////////////////////////////////////
// parameters to be passed to FurMesh::Init()
const FurMesh::PARAM s_MeshParams[] =
{
{ torus, 24, 15, 6, 3, "Torus" },
{ torus2, 30, 15, 7, 3, "Deformed Torus" },
{ mobius, 30, 15, 6, 3, "M\366bius Strip" },
{ knot, 50, 12, 12, 3, "Knot" },
};
const int NUM_MESHES = sizeof(s_MeshParams) / sizeof(FurMesh::PARAM);