コード例 #1
0
ファイル: CameraFlight.cpp プロジェクト: Arnm7890/CryGame
void CCameraFlight::SetMoveSpeed(float fMpS /* = 4.0f */)
{
	CRY_ASSERT(fMpS > 0.0f);
	fMpS = max(fMpS, g_fCamError);

	if(m_cameraCourse.size() < 3)
	{
		m_fFlightSpeed = 1.0f;
		return;
	}

	//collect flight distance
	float fMoveDistance = max(0.01f, GetCourseLength());

	//compute speed per second
	float fFlightTime = fMoveDistance / fMpS;
	m_fFlightSpeed = 1.0f / fFlightTime;
	m_fMoveSpeedMps = fMpS;
}
コード例 #2
0
SCameraFlightPoint CCameraFlight::GetTrackPoint(float t)
{
	//clamp to 0..1 range
	CRY_ASSERT(t >= 0.0f && t <= 1.0f);
	t = clamp(t, 0.0f, 1.0f);

	float fLength = GetCourseLength();
	float fPositionOffset = fLength * t;

	CRY_ASSERT(!m_cameraCourse.empty());
	std::vector<SCameraFlightPoint>::const_iterator iter = m_cameraCourse.begin();
	// iterate to the second position
	++iter;
	std::vector<SCameraFlightPoint>::const_iterator end = m_cameraCourse.end();

	float fMoveDistance = 0.0f;
	float fLastMoveDistance = 0.0f;
	Vec3 vTempPos = m_cameraCourse[0].m_vCamPos;
	Vec3 vLastLookAt = m_cameraCourse[0].m_vCamLookAt;

	//compute track position for t
	for(; iter != end; ++iter)
	{
		fLastMoveDistance = fMoveDistance;
		Vec3 vEdge = iter->m_vCamPos - vTempPos;
		float fEdgeDistance = vEdge.len();
		fMoveDistance += fEdgeDistance;

		if(fMoveDistance > fPositionOffset)
		{
			float fEdgeDelta = fPositionOffset - fLastMoveDistance;
			Vec3 vLookDelta = (iter->m_vCamLookAt - vLastLookAt).normalized();
			return SCameraFlightPoint(vTempPos + fEdgeDelta * vEdge.normalized(), vLastLookAt + fEdgeDelta * vLookDelta) + m_vRefPos;
		}

		//update last Pos
		vLastLookAt = iter->m_vCamLookAt;
		vTempPos = iter->m_vCamPos;
	}

	//all points are relative to m_vRefPos (which can be ZERO)
	return m_cameraCourse[0] + m_vRefPos;
}