Example #1
0
/*! \param upVec
 *  \param dir
 *  \return orientation
 */
SbRotation kCamera::calcOrientation(const SbVec3f upVec, const SbVec3f dir)
{
	// from comp.graphics.api.inventor ... "Setting SoCamera orientation"
	SbVec3f z = -dir;
	SbVec3f y = upVec;
	z.normalize();
	y.normalize();
	SbVec3f x = y.cross(z);

	// recompute y to create a valid coordinate system
	y	= z.cross(x);

	// create a rotation matrix
	SbMatrix rot = SbMatrix::identity();
	rot[0][0] = x[0];
	rot[0][1] = x[1];
	rot[0][2] = x[2];

	rot[1][0] = y[0];
	rot[1][1] = y[1];
	rot[1][2] = y[2];

	rot[2][0] = z[0];
	rot[2][1] = z[1];
	rot[2][2] = z[2];

	// convert matrix into rotation
	return SbRotation(rot);
}
void ViewProviderMeasureDistance::updateData(const App::Property* prop)
{
    if (prop->getTypeId() == App::PropertyVector::getClassTypeId() ||
        prop == &Mirror || prop == &DistFactor) {
        if (strcmp(prop->getName(),"P1") == 0) {
            Base::Vector3d v = static_cast<const App::PropertyVector*>(prop)->getValue();
            pCoords->point.set1Value(0, SbVec3f(v.x,v.y,v.z));
        }
        else if (strcmp(prop->getName(),"P2") == 0) {
            Base::Vector3d v = static_cast<const App::PropertyVector*>(prop)->getValue();
            pCoords->point.set1Value(1, SbVec3f(v.x,v.y,v.z));
        }

        SbVec3f pt1 = pCoords->point[0];
        SbVec3f pt2 = pCoords->point[1];
        SbVec3f dif = pt1-pt2;

        float length = fabs(dif.length())*DistFactor.getValue();
        if (Mirror.getValue())
            length = -length;


        if (dif.sqrLength() < 10.0e-6f) {
            pCoords->point.set1Value(2, pt1+SbVec3f(0.0f,0.0f,length));
            pCoords->point.set1Value(3, pt2+SbVec3f(0.0f,0.0f,length));
        }
        else {
            SbVec3f dir = dif.cross(SbVec3f(1.0f,0.0f,0.0f));
            if (dir.sqrLength() < 10.0e-6f)
                dir = dif.cross(SbVec3f(0.0f,1.0f,0.0f));
            if (dir.sqrLength() < 10.0e-6f)
                dir = dif.cross(SbVec3f(0.0f,0.0f,1.0f));
            dir.normalize();
            if (dir.dot(SbVec3f(0.0f,0.0f,1.0f)) < 0.0f)
                length = -length;
            pCoords->point.set1Value(2, pt1 + length*dir);
            pCoords->point.set1Value(3, pt2 + length*dir);
        }

        SbVec3f pos = (pCoords->point[2]+pCoords->point[3])/2.0f;
        pTranslation->translation.setValue(pos);

        std::stringstream s;
        s.precision(3);
        s.setf(std::ios::fixed | std::ios::showpoint);
        s << dif.length();
        pLabel->string.setValue(s.str().c_str());
    }

    ViewProviderDocumentObject::updateData(prop);
}
Example #3
0
/*! Returns the dot-product (1 = parallel, 0 = right angle, -1 = opposite)
 *  \param lookDir
 *  \param upVec
 *  \return dotproduct ( +1 = parallel, 0 = orthogonal, -1 = 180 deg )
 */
float kCamera::getUpVecAngleDir(const SbVec3f lookDir, const SbVec3f upVec)
{
	SbVec3f perfectUpVec = calcPerfectUpVector(lookDir,NormPlump);
	perfectUpVec.normalize();

	SbVec3f crossproduct;
	crossproduct = upVec.cross(perfectUpVec);
	crossproduct.normalize();

	float dotproduct = crossproduct.dot(lookDir);

	//SoDebugError::postInfo("_____________________     MASTER-WINKEL: ",kBasics::FloatToString(angleDiff).c_str());

	return dotproduct;
}
Example #4
0
double
angleBetweenVectors( const SbVec3f& u, const SbVec3f& v, const SbVec3f& normal )
{
	double cosAngle = v.dot( u ) / ( u.length() * v.length() );
	float     angle = acos( cosAngle );

	// FIXME: Check if this is required
	//
	SbVec3f cross  = u.cross( v );
	
	if( cross.dot( normal ) < 0 )
		angle = 2 * M_PI - angle;
	//

	return angle;
}
float calcArea (const SbVec3f& v1, const SbVec3f& v2, const SbVec3f& v3)
{
    SbVec3f a = v2-v1;
    SbVec3f b = v3-v1;
    return a.cross(b).length()/2.0f;
}
Example #6
0
/*! \param lookDir
 *  \param plump
 *  \return an upVector
 */
SbVec3f kCamera::calcPerfectUpVector(const SbVec3f lookDir, const SbVec3f plump)
{
	return lookDir.cross(plump.cross(lookDir));
}