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