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);