Projet

Général

Profil

Gestion rotation de la camera

Ajouté par Anonyme il y a plus de 12 ans

code de mania drive

A reutilisé

// camera + drawing
tmp=raydium_ode_element_pos_get_name(cam);

if(vue==3)
    {
    dReal mpos[3];
    dReal *vel;
    dReal cam[3];
        dReal dist_vector[3];
    dReal car_to_cam_distance;

    // get drone position
    pos=raydium_ode_element_pos_get_name("corps");

    // get drone vector
    vel=raydium_ode_element_linearvelocity_get_name("corps");

    // get position of camera in world coords
    raydium_ode_element_RelPointPos_name("corps",-1,0,0,cam);

    // correct z pos (always at top of the car, for example)
    cam[2]=pos[2]+0.4;

    // on position du drone + son vecteur
    mpos[0]=pos[0]+vel[0];
    mpos[1]=pos[1]+vel[1];
    mpos[2]=pos[2]+vel[2];

    // calculate the alternate camera position
    dist_vector[0] = cam_pos[0]-pos[0];
    dist_vector[1] = cam_pos[1]-pos[1];
    dist_vector[2] = cam_pos[2]-pos[2];

    // find the distance from car to camera
    car_to_cam_distance = sqrt(dist_vector[0]*dist_vector[0] + dist_vector[1]*dist_vector[1] + dist_vector[2]*dist_vector[2]);

    // determine new camera position by scaling down the distance vector to be exactly 1 unit long,
    // and then using that vector as an offset from the car's position
    cam_pos[0] = pos[0] + (dist_vector[0]/car_to_cam_distance);
    cam_pos[1] = pos[1] + (dist_vector[1]/car_to_cam_distance);
    cam_pos[2] = pos[2] + (dist_vector[2]/car_to_cam_distance);

    if(camera_alternate) {
       cam[0] = cam_pos[0];
       cam[1] = cam_pos[1];
       cam[2] = cam_pos[2] + 0.4; // correct z pos (always at top of the car, for example)
    }

    // standard smooth lookat camera
    if(camera_lag)
      raydium_camera_smooth(cam[0],cam[1],cam[2],mpos[1],-mpos[2],mpos[0],
                            70,0,raydium_frame_time*camera_lag_speed);
    else
      raydium_camera_look_at(cam[0],cam[1],cam[2],pos[1],-pos[2],pos[0]);

    }