示例#1
0
void
CGame::ShootMarble(CVector3 forward, CVector3 side, CVector3 aim)
{
	double yVel = aim.Magnitude()/30.0;
	if (yVel > 5.0) yVel = 10.0;
	m_p1Tolley->setVel(aim.x*1.3,yVel, aim.z*1.3);
	if (forward.Magnitude() != 0)
		m_p1Tolley->AddTorque(forward.x/10, forward.y/10, forward.z/10);
	if (side.Magnitude() != 0)
		m_p1Tolley->AddTorque(side.x/3, side.y/3, side.z/3);
	m_gameState = GS_DynamicsSettle;
}
void game_physics_engine::CParticalDrag::UpdateForce( CPartical* pPartical, const real duration )
{
	CVector3 force = pPartical->GetVelocity();
	real dragCoeff = force.Magnitude();
	dragCoeff = m_k1 * dragCoeff + m_k2 * dragCoeff * dragCoeff;
	force.Normalize();
	force *= -dragCoeff;
	pPartical->AddForce(force);
}
void game_physics_engine::CParticalAnchoredSpring::UpdateForce( CPartical* pOther, real fDuration )
{
	CVector3 force;
	force = pOther->GetPosition();
	force -= *m_pAnchor;

	real fMagnitude = force.Magnitude();
	//that is what written on the book, but I think it is wrong.
	//fMagnitude = real_abs(fMagnitude - m_fRestLength);
	fMagnitude = m_fRestLength - fMagnitude;
	fMagnitude *= m_fSpringConstant;

	force.Normalize();
	force *= -fMagnitude;
	pOther->AddForce(force);
}
void game_physics_engine::CParticalBungee::UpdateForce( CPartical* pPartical, const real duration )
{
	assert(pPartical != nullptr);
	if (pPartical == NULL)
	{
		return;
	}

	CVector3 force = pPartical->GetPosition();
	force -= m_pOther->GetPosition();
	real magnitude = force.Magnitude();
	if (magnitude <= m_fRestLength)
	{
		return;
	}

	magnitude -= m_fRestLength;
	magnitude *= m_fSpringConstant;
	force.Normalize();
	force *= -magnitude;
	pPartical->AddForce(force);
}
示例#5
0
文件: main.cpp 项目: poma-prs/summer
void Main()
{
	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);	
	glColor3f(1.0f, 1.0f, 1.0f);
	APP->Print(.7f, .9f, "FPS: %4.2f", APP->GetFPS());
	APP->Print(.7f, .8f, "Cubes: %d", vCubes.size());
	APP->Print(.7f, .7f, "Active: %d", i_ActiveCube);
	APP->Print(-1.f, .9f, "Position: %.2lf %.2lf %.2lf", g_Camera.m_vPosition.x, g_Camera.m_vPosition.y, g_Camera.m_vPosition.z);
	APP->Print(-1.f, .8f, "View: %.2lf %.2lf %.2lf", g_Camera.m_vView.x, g_Camera.m_vView.y, g_Camera.m_vView.z);
	APP->Print(-1.f, .7f, "Up: %.2lf %.2lf %.2lf", g_Camera.m_vUpVector.x, g_Camera.m_vUpVector.y, g_Camera.m_vUpVector.z);

	APP->Print(-1.f, .6f, "CameraRot: %.2lf", g_Camera.curRotY);
	if (APP->GetSet()->network)
		APP->Print(-1.f, .5f, "IP: %s", APP->GetSet()->ip_server);
	else
		APP->Print(-1.f, .5f, "IP: no");

	glLoadIdentity();

	EventKeysDown();

	if (i_ActiveCube >= 0 && i_ActiveCube < (int)vCubes.size())
	{
		if (changeActiveCube)
		{
			CVector3 vec = vCubes[i_ActiveCube]->GetCenter() - g_Camera.m_vView;

			float angle = vCubes[i_ActiveCube]->angleRotY - g_Camera.curRotY;
			if (g_Camera.curRotY > 0.0f && vCubes[i_ActiveCube]->angleRotY < 0.0f)
			{
				angle = minAbs(angle, 2.0f * Pi + vCubes[i_ActiveCube]->angleRotY - g_Camera.curRotY);
			}
			else if (g_Camera.curRotY < 0.0f && vCubes[i_ActiveCube]->angleRotY > 0.0f)
			{
				angle = minAbs(angle, -2.0f * Pi + vCubes[i_ActiveCube]->angleRotY - g_Camera.curRotY);
			}

			if (vec.Magnitude() <= 2.0f * MOVEMENT_SPEED)
			{
				if (abs(angle) <= MOVEMENT_ANGLE)
				{
					g_Camera.m_vView = vCubes[i_ActiveCube]->GetCenter();
					g_Camera.RotateAroundPoint(g_Camera.m_vView, angle, 0.0f, 1.0f, 0.0f);
					changeActiveCube = false;
				}
				else
				{
					if (angle > 0)
						g_Camera.RotateAroundPoint(g_Camera.m_vView, MOVEMENT_ANGLE, 0.0f, 1.0f, 0.0f);
					else
						g_Camera.RotateAroundPoint(g_Camera.m_vView, -MOVEMENT_ANGLE, 0.0f, 1.0f, 0.0f);
				}
			}
			else
			{
				float k = vec.Magnitude() / (2.0f * MOVEMENT_SPEED);

				if (k > 0.1f)
					g_Camera.RotateAroundPoint(g_Camera.m_vView, angle / k, 0.0f, 1.0f, 0.0f);

				vec.Normalize();
				vec *= 2.0f * MOVEMENT_SPEED;
				g_Camera.m_vView += vec;
				g_Camera.m_vPosition += vec;
			}
		}
		else
		{
			g_Camera.SetViewByMouse();

			vCubes[i_ActiveCube]->Set(g_Camera.m_vView.x, 0.0f, g_Camera.m_vView.z);
			vCubes[i_ActiveCube]->angleRotY = g_Camera.curRotY;
		}
	}

	gluLookAt(g_Camera.m_vPosition.x, g_Camera.m_vPosition.y, g_Camera.m_vPosition.z,
		g_Camera.m_vView.x,	  g_Camera.m_vView.y,	  g_Camera.m_vView.z,
		g_Camera.m_vUpVector.x, g_Camera.m_vUpVector.y, g_Camera.m_vUpVector.z);

	for (size_t i = 0; i < vCubes.size(); i++)
	{
		vCubes[i]->Render();
	}
}