示例#1
0
osg::Camera* createRttCamera( int texWidth, int texHeight, const osg::BoundingSphere& bs )
{
    osg::ref_ptr<osg::Camera> rttCamera = new osg::Camera;
    rttCamera->setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    rttCamera->setReferenceFrame( osg::Transform::ABSOLUTE_RF );
    
    rttCamera->setViewport( 0, 0, texWidth, texHeight );
    rttCamera->setRenderOrder( osg::Camera::PRE_RENDER );
    rttCamera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
    
    double viewDistance = 2.0 * bs.radius();
    double znear = viewDistance - bs.radius();
    double zfar = viewDistance + bs.radius();
    float top = 0.6 * znear;
    float right = 0.8 * znear;
    rttCamera->setProjectionMatrixAsFrustum( -right, right, -top, top, znear, zfar );
    
    osg::Vec3d upDirection( 0.0,0.0,1.0 );
    osg::Vec3d viewDirection( 0.0,-1.0,0.0 );
    osg::Vec3d center = bs.center();
    osg::Vec3d eyePoint = center + viewDirection * viewDistance;
    rttCamera->setViewMatrixAsLookAt( eyePoint, center, upDirection );
    
    return rttCamera.release();
}
示例#2
0
文件: Camera.cpp 项目: AKS2346/Cinder
void Camera::getNearClipCoordinates( Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight ) const
{
	calcMatrices();

	Vec3f viewDirection( mViewDirection );
	viewDirection.normalize();

	*topLeft		= mEyePoint + (mNearClip * viewDirection) + (mFrustumTop * mV) + (mFrustumLeft * mU);
	*topRight		= mEyePoint + (mNearClip * viewDirection) + (mFrustumTop * mV) + (mFrustumRight * mU);
	*bottomLeft		= mEyePoint + (mNearClip * viewDirection) + (mFrustumBottom * mV) + (mFrustumLeft * mU);
	*bottomRight	= mEyePoint + (mNearClip * viewDirection) + (mFrustumBottom * mV) + (mFrustumRight * mU);
}
void PlayerCharacter::SetAcceleration()
{
	// 가속 시작 시점 기록 - 타임 스탬프로 문제 해결
	// 나중에는 타이머 만들어서 써볼까?
	m_AccelerationStart = timeGetTime();
	m_IsAccelerating = true;

	D3DXVECTOR3 normalVec( 0, 0, 0 );
	D3DXVECTOR3 viewDirection( GetViewDirection() );
	Physics::GetNormalVector( &viewDirection, &normalVec );

	// 조심해!
	// 가속도 가중치 하드 코딩 수정 할 것
	m_Acceleration += ( viewDirection * 1.0f );
}
示例#4
0
文件: Camera.cpp 项目: AKS2346/Cinder
void CameraStereo::getNearClipCoordinates( Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight ) const
{
	calcMatrices();

	Vec3f viewDirection( mViewDirection );
	viewDirection.normalize();

	Vec3f eye( getEyePointShifted() );

	float shift = 0.5f * mEyeSeparation * (mNearClip / mConvergence);
	shift *= (mIsStereo ? (mIsLeft ? 1.0f : -1.0f) : 0.0f);

	float left = mFrustumLeft + shift;
	float right = mFrustumRight + shift;

	*topLeft		= eye + (mNearClip * viewDirection) + (mFrustumTop * mV) + (left * mU);
	*topRight		= eye + (mNearClip * viewDirection) + (mFrustumTop * mV) + (right * mU);
	*bottomLeft		= eye + (mNearClip * viewDirection) + (mFrustumBottom * mV) + (left * mU);
	*bottomRight	= eye + (mNearClip * viewDirection) + (mFrustumBottom * mV) + (right * mU);
}
示例#5
0
文件: test.cpp 项目: gisair/EAView
	//--------------------------------
	osg::Camera* test::createBirdsEye(const osg::BoundingSphere& bs)
	{
		osg::ref_ptr<osg::Camera> camera=new osg::Camera;
		camera->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
		camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);

		double viewDistance=2.0*bs.radius();
		double znear=viewDistance-bs.radius();
		double zfar=viewDistance+bs.radius();
		float top=bs.radius();
		float right=bs.radius();
		camera->setProjectionMatrixAsOrtho(-right,right,-top,top,znear,zfar);

		osg::Vec3d upDirection(0,1,0);
		osg::Vec3d viewDirection(0,0,1);
		osg::Vec3d center=bs.center();
		osg::Vec3d eyePoint=center+viewDirection*viewDistance;
		camera->setViewMatrixAsLookAt(eyePoint,center,upDirection);

		return camera.release();
	}
void QmitkViewInitializationView::OnApply()
{
  mitk::SliceNavigationController::ViewDirection viewDirection(mitk::SliceNavigationController::Axial);
  if (m_Controls->rbAxial->isChecked())
    viewDirection = mitk::SliceNavigationController::Axial;

  else if (m_Controls->rbFrontal->isChecked())
    viewDirection = mitk::SliceNavigationController::Frontal;

  else if (m_Controls->rbSagittal->isChecked())
    viewDirection = mitk::SliceNavigationController::Sagittal;

  vtkRenderWindow *renderwindow = this->GetSelectedRenderWindow();
  if (renderwindow != NULL)
  {
    mitk::BaseRenderer::GetInstance(renderwindow)
      ->GetSliceNavigationController()
      ->Update(viewDirection,
               m_Controls->cbTop->isChecked(),
               m_Controls->cbFrontSide->isChecked(),
               m_Controls->cbRotated->isChecked());
    mitk::BaseRenderer::GetInstance(renderwindow)->GetCameraController()->Fit();
  }
}
示例#7
0
//--------------------------------------------------------------------------------------
// Processes an inbox message that the manoeuvre received.
// Param1: A pointer to the message to process.
//--------------------------------------------------------------------------------------
void GuardedFlagCapture::ProcessMessage(Message* pMessage)
{
	switch(pMessage->GetType())
	{
	case FlagDroppedMessageType:
	{
		FlagDroppedMessage* pMsg = reinterpret_cast<FlagDroppedMessage*>(pMessage);
		if(pMsg->GetData().m_flagOwner != GetTeamAI()->GetTeam())
		{
			// The flag was dropped, the manoeuvre failed
			SetFailed(true);
		}
		break;
	}
	case ScoreUpdateMessageType:
	{
		ScoreUpdateMessage* pMsg = reinterpret_cast<ScoreUpdateMessage*>(pMessage);
		if(pMsg->GetData().m_team == GetTeamAI()->GetTeam())
		{
			// The flag was captured -> the manoeuvre succeeded
			SetSucceeded(true);
		}
		break;
	}
	case EntityKilledMessageType:
	{
		EntityKilledMessage* pMsg = reinterpret_cast<EntityKilledMessage*>(pMessage);
		if(IsParticipant(pMsg->GetData().m_id) && pMsg->GetData().m_team == GetTeamAI()->GetTeam())
		{
			// Participants that get killed, drop out of the manoeuvre
			m_pTeamAI->ReleaseEntityFromManoeuvre(pMsg->GetData().m_id);
		}
		break;
	}
	case AttackedByEnemyMessageType:
	{
		AttackedByEnemyMessage* pMsg = reinterpret_cast<AttackedByEnemyMessage*>(pMessage);

		if(pMsg->GetData().m_entityId == m_flagCarrierId)
		{
			// The flag carrier is being attacked, protect him.

			// Get the attack direction
			XMFLOAT2 viewDirection(0.0f, 0.0f);
			XMStoreFloat2(&viewDirection, XMLoadFloat2(&pMsg->GetData().m_attackPosition) - XMLoadFloat2(&GetParticipant(pMsg->GetData().m_entityId)->GetPosition()));

			// Send all protectors to the position of the attacker to protect the carrier
			for(std::vector<Entity*>::iterator it = m_participants.begin(); it != m_participants.end(); ++it)
			{
				if((*it)->GetId() != m_flagCarrierId)
				{
					// Change the movement target in the orders for the entities
					reinterpret_cast<MoveOrder*>(m_activeOrders[(*it)->GetId()])->SetTargetPosition(pMsg->GetData().m_attackPosition);
				}
			}

		}

		break;
	}
	case UpdateOrderStateMessageType:
	{
	// Cancel old order, Send Follow-Up Orders, finish manoeuvre etc
	UpdateOrderStateMessage* pMsg = reinterpret_cast<UpdateOrderStateMessage*>(pMessage);
	if(IsParticipant(pMsg->GetData().m_entityId))
	{
		if(pMsg->GetData().m_orderState == SucceededOrderState)
		{
			// Let the entity wait for the next movement update (switch to defend?)
		}else if(pMsg->GetData().m_orderState == FailedOrderState)
		{
			m_pTeamAI->ReleaseEntityFromManoeuvre(pMsg->GetData().m_entityId);
		}
	}
	break;
	}
	default:
		TeamManoeuvre::ProcessMessage(pMessage);
	}
}