Exemple #1
0
void MyCamera::rotateDn(float an){
	///////////////////////Anton
	glm::vec3 view_vec = viewC - eyePositionE;
	glm::vec3 crossV = glm::cross(view_vec,upVectorU);
	glm::mat4 rotm = glm::rotate(an,crossV);
	////////////////////////////
	glm::vec4 eyen(1.0);
	eyen[0]=eyePositionE[0];
	eyen[1]=eyePositionE[1];
	eyen[2]=eyePositionE[2];
	eyen[3]=1;
	eyen = rotm*eyen;
	glm::vec4 upn(1.0);
	upn[0]=upVectorU[0];
	upn[1]=upVectorU[1];
	upn[2]=upVectorU[2];
	upn[3]=1;
	upn = rotm*upn;
	eyePositionE[0]=eyen[0];
	eyePositionE[1]=eyen[1];
	eyePositionE[2]=eyen[2];
	upVectorU[0]=upn[0];
	upVectorU[1]=upn[1];
	upVectorU[2]=upn[2];

}
Exemple #2
0
void MyCamera::rotateY(float an){
	glm::mat4 rotm = glm::rotate(an, glm::vec3(0.0,1.0,0.0));

	glm::vec4 eyen(1.0);
	eyen[0]=eyePositionE[0];
	eyen[1]=eyePositionE[1];
	eyen[2]=eyePositionE[2];
	eyen[3]=1;
	eyen = rotm*eyen;
	glm::vec4 upn(1.0);
	upn[0]=upVectorU[0];
	upn[1]=upVectorU[1];
	upn[2]=upVectorU[2];
	upn[3]=1;
	upn = rotm*upn;
	eyePositionE[0]=eyen[0];
	eyePositionE[1]=eyen[1];
	eyePositionE[2]=eyen[2];
	upVectorU[0]=upn[0];
	upVectorU[1]=upn[1];
	upVectorU[2]=upn[2];

}
inline
void cal_campose(Eigen::MatrixXf XXc,Eigen::MatrixXf XXw,
                int n,Eigen::MatrixXf &R2,Eigen::VectorXf &t2)
{
    //A
    Eigen::MatrixXf X = XXw;
    //B
    Eigen::MatrixXf Y = XXc;
    Eigen::MatrixXf eyen(n,n);
    eyen = Eigen::MatrixXf::Identity(n,n);
    Eigen::MatrixXf ones(n,n);
    ones.setOnes();
    Eigen::MatrixXf K(n,n);
    K = eyen - ones/n;


    vfloat3 ux;
    for(int i =0; i < n; i++)
    {
        ux = ux + X.col(i);
    }
    ux = ux/n;
    vfloat3 uy;
    for(int i =0; i < n; i++)
    {
        uy = uy + Y.col(i);
    }
    uy = uy/n;
    Eigen::MatrixXf XK(3,n);
    XK = X*K;
    Eigen::MatrixXf XKarre(3,n);
    for(int i = 0 ; i < n ; i++)
    {
        XKarre(0,i) = XK(0,i)*XK(0,i);
        XKarre(1,i) = XK(1,i)*XK(1,i);
        XKarre(2,i) = XK(2,i)*XK(2,i);
    }
    Eigen::VectorXf sumXKarre(n);
    float sigmx2 = 0;
    for(int i = 0 ; i < n ; i++)
    {
        sumXKarre[i] = XKarre(0,i) + XKarre(1,i) + XKarre(2,i);
        sigmx2 += sumXKarre[i];
    }
    sigmx2 /=n;
    Eigen::MatrixXf SXY(3,3);
    SXY = Y*K*(X.transpose())/n;
    JacobiSVD<MatrixXf> svd(SXY, ComputeThinU | ComputeThinV);
    Eigen::MatrixXf S(3,3);
    S = Eigen::MatrixXf::Identity(3,3);

    if(SXY.determinant() < 0)
    {
        S(3,3) = -1;
    }

    R2 = svd.matrixU() * S * (svd.matrixV()).transpose();

    Eigen::MatrixXf D(3,3);
    D.setZero();

    for(int i = 0 ; i < svd.singularValues().size() ; i++)
    {
        D(i,i) = (svd.singularValues())[i];
    }

    float c2 = (D*S).trace()/sigmx2;
    t2 = uy - c2*R2*ux;

    vfloat3 Xx = R2.col(0);
    vfloat3 Yy = R2.col(1);
    vfloat3 Zz = R2.col(2);

    if((x_cross(Xx,Yy)-Zz).norm()>2e-2)
    {
        R2.col(2) = -Zz;
    }
}