예제 #1
0
	void cPhysicsBodyNewton::AddImpulse(const cVector3f &a_vImpulse)
	{
		cVector3f vMassCentre = GetMassCentre();
		if (vMassCentre != cVector3f(0,0,0))
		{
			cVector3f vCentreOffset = cMath::MatrixMul(GetWorldMatrix().GetRotation(), vMassCentre);

			cVector3f vWorldPosition = GetWorldPosition() + vCentreOffset;
			NewtonBodyAddImpulse(m_pNewtonBody, a_vImpulse.v, vWorldPosition.v);
		}
		else
			NewtonBodyAddImpulse(m_pNewtonBody, a_vImpulse.v, GetWorldPosition().v);
	}
예제 #2
0
	void cPhysicsBodyNewton::AddForceAtPosition(const cVector3f &a_vForce, const cVector3f &a_vPos)
	{
		m_vTotalForce += a_vForce;

		cVector3f vLocalPos = a_vPos - GetLocalPosition();
		cVector3f vMassCentre = GetMassCentre();
		if (vMassCentre != cVector3f(0,0,0))
		{
			vMassCentre = cMath::MatrixMul(GetLocalMatrix().GetRotation(), vMassCentre);
			vLocalPos -= vMassCentre;
		}

		cVector3f vTorque = cMath::Vector3Cross(vLocalPos, a_vPos);

		m_vTotalTorque += vTorque;
		SetEnabled(true);
	}
예제 #3
0
	void cPhysicsBodyNewton::AddForceAtPosition(const cVector3f &avForce, const cVector3f &avPos)
	{
		mvTotalForce += avForce;

		cVector3f vLocalPos = avPos - GetLocalPosition();
		cVector3f vMassCentre = GetMassCentre();
		if(vMassCentre != cVector3f(0,0,0))
		{
			vMassCentre = cMath::MatrixMul(GetLocalMatrix().GetRotation(),vMassCentre);
			vLocalPos -= vMassCentre;
		}

		cVector3f vTorque = cMath::Vector3Cross(vLocalPos, avForce);

		mvTotalTorque += vTorque;
		SetEnabled(true);

		//Log("Added force %s\n",avForce.ToString().c_str());
	}