btCollisionShape* VRPhysics::getConvexShape() { btConvexHullShape* shape = new btConvexHullShape(); OSG::Matrix m; OSG::Matrix M = vr_obj->getWorldMatrix(); M.invert(); vector<OSG::VRObject*> geos = vr_obj->getObjectListByType("Geometry"); for (auto g : geos) { OSG::VRGeometry* geo = (OSG::VRGeometry*)g; if (geo == 0) continue; if (geo->getMesh() == 0) continue; OSG::GeoVectorPropertyRecPtr pos = geo->getMesh()->getPositions(); if (pos == 0) continue; if (geo != vr_obj) { m = geo->getWorldMatrix(); m.multLeft(M); } for (unsigned int i = 0; i<pos->size(); i++) { OSG::Pnt3f p; pos->getValue(p,i); if (geo != vr_obj) m.mult(p,p); for (int i=0; i<3; i++) p[i] *= scale[i]; shape->addPoint(btVector3(p[0], p[1], p[2])); } } shape->setMargin(collisionMargin); //cout << "\nConstruct Convex shape for " << vr_obj->getName() << endl; return shape; }
// create the motion matrix for a light source at time t void makeMatrix(OSG::Real32 t, OSG::Matrix &result) { OSG::Matrix m; result.setTransform(OSG::Quaternion(OSG::Vec3f(0,0,1), -OSG::Pi / 2)); m.setTransform(OSG::Vec3f(1, 0, 0)); result.multLeft(m); m.setTransform(OSG::Quaternion(OSG::Vec3f(0,1,0), t / 1000.f)); result.multLeft(m); m.setTransform(OSG::Vec3f(2, 0, 0)); result.multLeft(m); m.setTransform(OSG::Quaternion(OSG::Vec3f(0,0,1), t / 3000.f)); result.multLeft(m); }
// // In case the clip plane data change this function is called // void updateClipPlanes(const VecClipPlaneData& vec) { int sz = vec.size(); for(int i = 0; i < iNumClipPlanes; ++i) { OSG::ClipPlaneChunk *clipPlaneChunk = vecClipPlaneDetails[i]._clipPlaneChunk; clipPlaneChunk->setEnable(false); if(i < sz) { const ClipPlaneData& data = vec[i]; // // Update the clip plane chunk // clipPlaneChunk->setEquation(data._equation); clipPlaneChunk->setEnable (data._enabled ); // // and the plane transform core // OSG::Matrix rotMat; OSG::Vec4f v1(0.f, 0.f, -1.f, 0.f); OSG::Quaternion q(OSG::Vec3f(v1), OSG::Vec3f(data._equation)); rotMat.setTransform(q); OSG::Matrix mat; OSG::Vec3f v2(0.0f, 0.0f, data._equation[3]); mat.setTranslate(v2); mat.multLeft(rotMat); vecClipPlaneDetails[i]._planeTrafoCore->setMatrix(mat); } } }