예제 #1
0
Quat	&Quat::operator= (const Vec3f &RV)
{
	Float	_w=RV.GetNorm();
	if (_w<Float_Eps)
	{
		xyzw().SetDefault();
		return *this;
	}

	Vec2f	Toto;
	SinCos(Toto,_w*0.5f);
	xyz()=RV*(Toto.x/_w);
	w=Toto.y;
	return *this;
}
예제 #2
0
/*inline*/ void	Quat::SetEular(const Vec4f &Eular)
{
	Vec2f	sincos;
	Quat	QWork;

	// Rotation en Z.
	Vec4f vSin = VEC4F_NULL; 
	Vec4f vCos = VEC4F_NULL;
	Vec4f vHalfEular = VecFloatMul( Eular, VEC4F_HALF );
	VecFloatSinCos( vSin, vCos, vHalfEular);
	xyzw().Set( 0.f, 0.f, vSin.z, vCos.z );
	// Rotation en Y.
	QWork.xyzw().Set( 0.f, vSin.y, 0.f, vCos.y );
	(*this) *= QWork;
	// Rotation en X.
	QWork.xyzw().Set( vSin.x, 0.f, 0.f, vCos.x );
	(*this) *= QWork;
}
예제 #3
0
파일: shader.c 프로젝트: timsjostrand/lodge
void shader_uniforms_think(struct shader *s, float delta_time)
{
	glUseProgram(s->program);

	for(int i=0; i<UNIFORMS_MAX; i++) {
		struct uniform *u = s->uniforms[i];

		if(u == NULL) {
			continue;
		}

		switch(u->datatype) {
		case TYPE_VEC_1F: {
			glUniform1f(u->id, *((GLfloat *) u->data));
			break;
		}
		case TYPE_VEC_2F: {
			float *v = u->data;
			glUniform2f(u->id, v[0], v[1]);
			break;
		}
		case TYPE_VEC_3F: {
			glUniform3f(u->id, xyz(((float *) u->data)));
			break;
		}
		case TYPE_VEC_4F: {
			glUniform4f(u->id, xyzw(((float *) u->data)));
			break;
		}
		case TYPE_MAT_4F: {
			glUniformMatrix4fv(u->id, 1, GL_FALSE, (float *) u->data);
			break;
		}
		case TYPE_VEC_1I: {
			glUniform1i(u->id, *((GLint*)u->data));
			break;
		}
		default:
			shader_debug("Unknown datatype for uniform \"%s\"\n", u->name);
			break;
		}
	}
}
예제 #4
0
void Triangulator::triangulateFromVp(cv::Mat &vp, cv::Mat &xyz){

    // Solve for xyzw using determinant tensor
    cv::Mat C = determinantTensor;
    std::vector<cv::Mat> xyzw(4);
    for(unsigned int i=0; i<4; i++){
//        xyzw[i].create(vp.size(), CV_32F);
        xyzw[i] = C.at<float>(cv::Vec4i(i,0,1,1)) - C.at<float>(cv::Vec4i(i,2,1,1))*uc - C.at<float>(cv::Vec4i(i,0,2,1))*vc -
                C.at<float>(cv::Vec4i(i,0,1,2))*vp + C.at<float>(cv::Vec4i(i,2,1,2))*vp.mul(uc) + C.at<float>(cv::Vec4i(i,0,2,2))*vp.mul(vc);
    }

    // Convert to non homogenous coordinates
    for(unsigned int i=0; i<3; i++)
        xyzw[i] /= xyzw[3];

    // Merge
    cv::merge(std::vector<cv::Mat>(xyzw.begin(), xyzw.begin()+3), xyz);

}
예제 #5
0
Quat::Quat(const Vec3f &V1,const Vec3f &V2)
{
	Quat	q;

	// normer les 2 vecteurs et sortir si un vecteur est trop petit et qu'on a pas r�ussi � normer

	Float	n1=V1.GetNorm();
	Float	n2=V2.GetNorm();
	if ((n1<Float_Eps) || (n2<Float_Eps))
	{
		// Error Quat !!!
		xyzw().SetDefault();
		Normalize();
		return;
	}

	Vec3f	v1=V1* (1.f/n1);
	Vec3f	v2=V2* (1.f/n2);

	if (v1*v2 >= 0.f)
	{
		// Angle < 90
		Vec3f	v3=v1+v2;

		v3.Normalize();
		v = v1^v3;
		Float	Sin2 = v*v;

		//Should be Float_Eps*Float_Eps? 
		if (Sin2 < Float_Eps)
		{
			// Pas de rotation
			xyzw().SetDefault();
			Normalize();
			return;
		}

		Float	tempf=1.f-Sin2;
		if (tempf<0.f) tempf=0.f;
		if (tempf>1.f) tempf=1.f;
		w = Sqrt(tempf);
		Normalize();
		return;
	}

	// Angle > 90
	
	// On travaille avec le vecteur oppos�.

	Vec3f	v3=v2-v1;

	v3.CNormalize();
	v = v1^v3;
	Float	Sin2 = v*v;

	if (Sin2 < Float_Eps)
	{
		// Rotation 180.

		Float x = Abs(v1.x);
		Float y = Abs(v1.y);
		Float z = Abs(v1.z);

		if ((v1.y > -0.707106f) && (v1.y < 0.707106f))
//		if ((y < x) && (y < z))
		{
			v3.x = v1.z;
			v3.y = v1.y;
			v3.z = v1.x;
		}
		else
		{
			v3.x = v1.z;
			v3.y = v1.x;
			v3.z = v1.y;
		}

		v = v1^v3;
		v.CNormalize();
		w=0.f;
		Normalize();
		return;
	}

	w = Sqrt(Sin2);
	if (w)
		v *= Sqrt(1.f-Sin2) / w;

	Normalize();
}