/*! \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); }
/*! 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; }
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; }
/*! \param lookDir * \param plump * \return an upVector */ SbVec3f kCamera::calcPerfectUpVector(const SbVec3f lookDir, const SbVec3f plump) { return lookDir.cross(plump.cross(lookDir)); }