www.pudn.com > 3Dtableball.zip > mySphere.cpp


// Billiard ball simulator 
// Created by Nelis Franken 
// ----------------------------------------------------------- 
// Sphere (billiard ball) implementation file 
// ----------------------------------------------------------- 
 
#include  
#include  
#include "mySphere.h" 
 
mySphere::mySphere() { 
	resetValuesToZero(); 
} 
 
mySphere::mySphere(float posX, float posY, float posZ) { 
	resetValuesToZero(); 
	position = vector3(posX, posY, posZ); 
} 
 
void mySphere::resetValuesToZero() { 
	weight = 0.0; 
	mass = 0.0; 
	radius = 0.0; 
	fC = 0.0; 
	accellSize = 0.0; 
	forceSize = 0.0; 
	speedSize = 0.0; 
	speedDif = 0.0; 
	rotation = 0.0; 
	speed = vector3(0.0,0.0,0.0); 
	position = vector3(0.0,24.9,0.0); 
	accell = vector3(0.0,0.0,0.0); 
	force = vector3(0.0,0.0,0.0); 
	reflected = vector3(0.0,0.0,0.0); 
	collided = false; 
	inPlay = true; 
} 
 
void mySphere::setDefaults() { 
 
	speedSize = 0.0; 
	mass = 0.0001; 
	weight = mass * 9.81; 
	fC = 0.00004; 
	speedDif = 10000.0; 
	radius = 1.5; 
 
	collided = false; 
	inPlay = true; 
	force = speed; 
	forceSize = sqrt((force.x)*(force.x) + (force.y)*(force.y) + (force.z)*(force.z)); 
 
	if (forceSize != 0) { 
		force = force * ((1.0 / forceSize) * (fC * weight)); 
  	} 
 
	accell = (force * (1.0/mass)) * (-1.0); 
	accellSize = fC * 170.0; 
	accell = accell * accellSize; 
} 
 
void mySphere::setPos(float posX, float posY, float posZ) { 
	position = vector3(posX, posY, posZ); 
} 
 
void mySphere::setSpeed(float speedX, float speedY, float speedZ) { 
	speed = vector3(speedX, speedY, speedZ); 
} 
 
bool mySphere::roll() { 
 
	updateSpeedSize(); 
	speed = speed + accell; 
	speedDif = speedSize - sqrt((speed.x)*(speed.x) + (speed.y)*(speed.y) + (speed.z)*(speed.z)); 
 
	if (speedDif >= 0.0000001) { 
		position = position + speed; 
		return true; 
	} else { 
		accell = accell*0.0; 
		speedSize = 0.0; 
		return false; 
	} 
} 
 
void mySphere::updateSpeedSize() { 
	speedSize = sqrt((speed.x)*(speed.x) + (speed.y)*(speed.y) + (speed.z)*(speed.z)); 
} 
 
float mySphere::getSpeedSize() { 
	speedSize = (sqrt((speed.x)*(speed.x) + (speed.y)*(speed.y) + (speed.z)*(speed.z))); 
	return speedSize; 
} 
 
float mySphere::determineDistance(mySphere testBall) { 
	return (sqrt((position.x - testBall.position.x)*(position.x - testBall.position.x) + (position.y - testBall.position.y)*(position.y - testBall.position.y) + (position.z - testBall.position.z)*(position.z - testBall.position.z) )); 
} 
 
bool mySphere::collides(mySphere testBall) { 
 
	float distance = determineDistance(testBall); 
 
	if (distance >= (2.0*radius)) { 
		return false; 
	} else { 
		//position = position + (position - testBall.position)*0.1; 
		position = position - (testBall.position - position)*(2.0*radius - distance); 
		//position = position - speed*1.4; 
 
		return true; 
	} 
 
}