示例#1
0
void TrackingCamera::TrackBody()
{
    if(solar_system_bodies != nullptr && !solar_system_bodies->empty())
    {
        try
        {
            solar_system_body_weak_ptr = solar_system_bodies->at(tracked_body_index);

            if(!solar_system_body_weak_ptr.expired())
            {
                solar_system_body_shared_ptr = solar_system_body_weak_ptr.lock();
                if(!calculated_min_max_distance_from_body_surface)
                {
                    minimum_distance_from_body_surface = solar_system_body_shared_ptr->GetRadius() * 5.0;
                    maximum_distance_from_body_surface = minimum_distance_from_body_surface + 5.0;
                    distance_from_body_surface = minimum_distance_from_body_surface + 2.5;
                    calculated_min_max_distance_from_body_surface = true;
                }

                tracked_body_position = solar_system_body_shared_ptr->GetDistanceFromSolarSystemOrigin();
                eye_position = tracked_body_position;
                vector_from_tracked_body_to_camera.x = 0.0;
                vector_from_tracked_body_to_camera.z = distance_from_body_surface;
                vector_from_tracked_body_to_camera = glm::rotate(vector_from_tracked_body_to_camera, M_PI * (x_rotation_degrees / 180.0), glm::dvec3(0.0, 1.0, 0.0));
                eye_position += vector_from_tracked_body_to_camera;

                solar_system_body_shared_ptr.reset();
                PositionCamera();
            }
            else
            {
                solar_system_bodies->erase(solar_system_bodies->begin() + tracked_body_index);
                calculated_min_max_distance_from_body_surface = false;

                std::size_t solar_system_body_count = solar_system_bodies->size();

                if(tracked_body_index >= solar_system_body_count)
                {
                    tracked_body_index = 0u;
                }
            }
        }
        catch(std::out_of_range &ex)
        {
            calculated_min_max_distance_from_body_surface = false;
            tracked_body_index = 0u;
        }
    }
}
示例#2
0
void MoveViewTimerCB(long,short,C_Base *control)
{
	if(gUIViewer == NULL)
		return;

	if(control->GetUserNumber(_UI95_TIMER_COUNTER_) < 1)
	{
		if(Recon.Direction == 0)// && TheLoader.LoaderQueueEmpty())
			return;

		Recon.Heading += Recon.Direction;
		if(Recon.Heading >= 360.0f)
			Recon.Heading-=360.0f;
		if(Recon.Heading < 0)
			Recon.Heading+=360.0f;

		PositionCamera(&Recon,control->Parent_,0);
		control->SetUserNumber(_UI95_TIMER_COUNTER_,control->GetUserNumber(_UI95_TIMER_DELAY_));
	}
	control->SetUserNumber(_UI95_TIMER_COUNTER_,control->GetUserNumber(_UI95_TIMER_COUNTER_)-1);
}
void Fenettre::RenderMe()
{
   #if FRAME_TIME <= 0
    sf::Clock clock;
    #endif
    bool run = false;
    PositionCamera();
    while(isOpen())
	{
        sf::Event event;
        while(pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                close();
            }
            else if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
            {
                close();
            }
            else if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space))
            {
                run = !run;
            }
            else if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::R))
            {
                camera->setPosition(btVector3(-100,50,0));
            }
            // Adjust the viewport when the window is resized
            else if (event.type == sf::Event::Resized)
            {
                glViewport(0, 0, event.size.width, event.size.height);
            }
            else if (run && event.type == sf::Event::MouseMoved)
            {
                camera->MouseMoved();
            }
            else if (run && event.type == sf::Event::MouseWheelMoved)
            {
                camera->MouseWheelMoved(event);
            }
            else if (run && event.type == sf::Event::MouseButtonPressed)
            {
                shootBox(camera->GetCible());
            }

        }

		// Clear color and depth buffer
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		// Update dynamics
		if (run)
		{
           #if FRAME_TIME <= 0
            World->stepSimulation(clock.GetElapsedTime());
            camera->animate(clock.GetElapsedTime());
            #else
            World->stepSimulation(1.0f/FRAME_TIME);
            camera->animate(1.0f/FRAME_TIME);
            #endif

            PositionCamera();
		}

		RenderScene();
		glFlush();
		display();
	}
};