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