diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp index 41cd623299606278356805e5933c4afc57fc7d4c..a15a8d64e906dd9027cd91ab460992f914b3ac89 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp @@ -51,15 +51,14 @@ BulletObject::BulletObject(VirtualRobot::SceneObjectPtr o) if (o->getName() != "Floor") { - - std::vector<VisualizationNode::PrimitivePtr> primitives = colModel->getVisualization()->primitives; + std::vector<VisualizationFactory::PrimitivePtr> primitives = colModel->getVisualization()->primitives; if (primitives.size() == 1) { collisionShape.reset(getShapeFromPrimitive(primitives[0])); } else if (primitives.size() > 1) { - std::vector<VisualizationNode::PrimitivePtr>::iterator it; + std::vector<VisualizationFactory::PrimitivePtr>::iterator it; btCompoundShape *compoundShape = new btCompoundShape(); for (it = primitives.begin(); it != primitives.end(); it++) { compoundShape->addChildShape(BulletEngine::getPoseBullet((*it)->transform), getShapeFromPrimitive(*it)); @@ -151,18 +150,18 @@ BulletObject::~BulletObject() } -btCollisionShape* BulletObject::getShapeFromPrimitive(VirtualRobot::VisualizationNode::PrimitivePtr primitive) +btCollisionShape* BulletObject::getShapeFromPrimitive(VirtualRobot::VisualizationFactory::PrimitivePtr primitive) { btCollisionShape* result; - if (primitive->type == VisualizationNode::Box::TYPE) + if (primitive->type == VisualizationFactory::Box::TYPE) { - VisualizationNode::Box* box = boost::dynamic_pointer_cast<VisualizationNode::Box>(primitive).get(); + VisualizationFactory::Box* box = boost::dynamic_pointer_cast<VisualizationFactory::Box>(primitive).get(); btBoxShape *boxShape = new btBoxShape(btVector3(box->width / 1000.f, box->height / 1000.f, box->depth / 1000.f)); result = boxShape; } - else if (primitive->type == VisualizationNode::Sphere::TYPE) + else if (primitive->type == VisualizationFactory::Sphere::TYPE) { - VisualizationNode::Sphere* sphere = boost::dynamic_pointer_cast<VisualizationNode::Sphere>(primitive).get(); + VisualizationFactory::Sphere* sphere = boost::dynamic_pointer_cast<VisualizationFactory::Sphere>(primitive).get(); btSphereShape *sphereShape = new btSphereShape(btScalar(sphere->radius / 1000.f)); result = sphereShape; } diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h index 79a70048c652f6c3ca527b8c7564f61892f13056..972cdab553be244d0f1934fd64ef3aee46fd6873 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h @@ -84,7 +84,7 @@ public: protected: void setPoseIntern(const Eigen::Matrix4f &pose); - btCollisionShape* getShapeFromPrimitive(VirtualRobot::VisualizationNode::PrimitivePtr primitive); + btCollisionShape* getShapeFromPrimitive(VirtualRobot::VisualizationFactory::PrimitivePtr primitive); btConvexHullShape* createConvexHullShape(VirtualRobot::TriMeshModelPtr trimesh); diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp index db98a6c24178cc407e6ffea1d251f5ce726c16e5..b423324baa7197c81acdcc2d5ee59015b668d292 100644 --- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp +++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp @@ -68,6 +68,77 @@ namespace VirtualRobot { { } + /** + * This method creates a VirtualRobot::CoinVisualizationNode from a given vector of \p primitives. + * An instance of VirtualRobot::VisualizationNode is returned in case of an occured error. + * + * \param primitives vector of primitives to create the visualization from. + * \param boundingBox Use bounding box instead of full model. + * \return instance of VirtualRobot::CoinVisualizationNode upon success and VirtualRobot::VisualizationNode on error. + */ + VisualizationNodePtr CoinVisualizationFactory::getVisualizationFromPrimitives(std::vector<PrimitivePtr> primitives, bool boundingBox) + { + VisualizationNodePtr visualizationNode = VisualizationNodePtr(new VisualizationNode()); + SoSeparator *coinVisualization = new SoSeparator(); + coinVisualization->ref(); + + Eigen::Matrix4f currentTransform = Eigen::Matrix4f::Identity(); + for (std::vector<PrimitivePtr>::iterator it = primitives.begin(); it != primitives.end(); it++) + { + PrimitivePtr p = *it; + currentTransform *= p->transform; + SoSeparator *soSep = new SoSeparator(); + SoNode *pNode = GetNodeFromPrimitive(p, boundingBox); + soSep->addChild(getMatrixTransformScaleMM2M(currentTransform)); + soSep->addChild(pNode); + coinVisualization->addChild(soSep); + } + + if (boundingBox) + { + SoSeparator* bboxVisu = CreateBoundingBox(coinVisualization, false); + bboxVisu->ref(); + coinVisualization->unref(); + coinVisualization = bboxVisu; + } + + // create new CoinVisualizationNode if no error occurred + visualizationNode.reset(new CoinVisualizationNode(coinVisualization)); + + coinVisualization->unref(); + + return visualizationNode; + } + + SoNode* CoinVisualizationFactory::GetNodeFromPrimitive(PrimitivePtr primitive, bool boundingBox) + { + SoNode *coinVisualization; + if (primitive->type == Box::TYPE) + { + Box *box = boost::dynamic_pointer_cast<Box>(primitive).get(); + SoCube *soBox = new SoCube; + soBox->width = box->width / 1000.f; + soBox->height = box->height / 1000.f; + soBox->depth = box->depth / 1000.f; + coinVisualization = soBox; + } else if (primitive->type == Sphere::TYPE) + { + Sphere *sphere = boost::dynamic_pointer_cast<Sphere>(primitive).get(); + SoSphere *soSphere = new SoSphere; + soSphere->radius = sphere->radius / 1000.f; + coinVisualization = soSphere; + } + + if (boundingBox && coinVisualization) + { + SoSeparator* bboxVisu = CreateBoundingBox(coinVisualization, false); + bboxVisu->ref(); + coinVisualization->unref(); + coinVisualization = bboxVisu; + } + + return coinVisualization; + } /** * This method creates a VirtualRobot::CoinVisualizationNode from a given \p filename. diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h index 0dc8f0a5266242c7c352ac05166af81eaf0d73bf..5ccefbc82f352214c33b89b28e7e1c708107e938 100644 --- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h +++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h @@ -59,10 +59,11 @@ public: CoinVisualizationFactory(); virtual ~CoinVisualizationFactory(); + virtual VisualizationNodePtr getVisualizationFromPrimitives(std::vector<PrimitivePtr> primitives, bool boundingBox = false); virtual VisualizationNodePtr getVisualizationFromFile(const std::string& filename, bool boundingBox = false); virtual VisualizationNodePtr getVisualizationFromFile(const std::ifstream& ifs, bool boundingBox = false); virtual VisualizationNodePtr getVisualizationFromString(const std::string& modelString, bool boundingBox = false); - virtual VisualizationNodePtr createBox(float width, float height, float depth, float colorR, float colorG, float colorB); + virtual VisualizationNodePtr createBox(float width, float height, float depth, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f); virtual VisualizationNodePtr createLine(const Eigen::Vector3f &from, const Eigen::Vector3f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f); virtual VisualizationNodePtr createLine(const Eigen::Matrix4f &from, const Eigen::Matrix4f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f); virtual VisualizationNodePtr createSphere(float radius, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f); @@ -299,6 +300,7 @@ public: */ virtual void cleanup(); protected: + static SoNode* GetNodeFromPrimitive(PrimitivePtr primitive, bool boundingBox); static void GetVisualizationFromSoInput(SoInput& soInput, VisualizationNodePtr& visualizationNode, bool bbox = false); static inline char IVToolsHelper_ReplaceSpaceWithUnderscore(char input) { if ( ' ' == input ) return '_'; else return input; } diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp index 4e93095f217c58d05d3afa6962190bbb385b8e04..a1b619bc6826519abae30c6d570d4e5e2c790547 100644 --- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp +++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp @@ -6,6 +6,7 @@ #include "CoinVisualizationNode.h" #include "CoinVisualizationFactory.h" +#include "../../MathTools.h" #include "../TriMeshModel.h" #include "../../VirtualRobotException.h" #include "../../XML/BaseIO.h" @@ -22,6 +23,7 @@ #include <Inventor/actions/SoWriteAction.h> #include <boost/filesystem.hpp> +#include <boost/foreach.hpp> namespace VirtualRobot { @@ -131,15 +133,91 @@ TriMeshModelPtr CoinVisualizationNode::getTriMeshModel() */ void CoinVisualizationNode::createTriMeshModel() { - THROW_VR_EXCEPTION_IF(!visualization, "CoinVisualizationNode::createTriMeshModel(): no Coin model present!"); + THROW_VR_EXCEPTION_IF(!visualization, "CoinVisualizationNode::createTriMeshModel(): no Coin model present!"); if (triMeshModel) triMeshModel->clear(); else triMeshModel.reset(new TriMeshModel()); - SoCallbackAction ca; - ca.addTriangleCallback(SoShape::getClassTypeId(), &CoinVisualizationNode::InventorTriangleCB, triMeshModel.get()); - ca.apply(visualization); + +// if (primitives.size() != 0 && !visualization) +// { +// std::vector<PrimitivePtr>::iterator it; +// Eigen::Matrix4f currentTransform = Eigen::Matrix4f::Identity(); +// SoNode* newVis = new SoSeparator; +// newVis->ref(); +// for (it = primitives.begin(); it != primitives.end(); it++) { +// PrimitivePtr p = *it; +// VisualizationNodePtr visNode; +// CoinVisualizationFactory vf; + +// if (p->type == Box::TYPE) +// { +// Box* box = boost::dynamic_pointer_cast<Box>(p).get(); +// visNode = vf.createBox(box->width, box->height, box->depth); +//// triMesh = visNode->getTriMeshModel(); +// } else if (p->type == Sphere::TYPE) +// { +// Sphere* sphere = boost::dynamic_pointer_cast<Sphere>(p).get(); +// visNode = vf.createSphere(sphere->radius); +//// triMesh = visNode->getTriMeshModel(); +// } else +// { +// VR_ERROR << "Unknown primitive" << std::endl; +// } + +// if (visNode) +// newVis->addChild(vf.getCoinVisualization(visNode)); +// } +// visualization = newVis; +// std::vector<PrimitivePtr>::iterator it; +// Eigen::Matrix4f currentTransform = Eigen::Matrix4f::Identity(); +// for (it = primitives.begin(); it != primitives.end(); it++) { +// PrimitivePtr p = *it; +// currentTransform *= p->transform; +// VisualizationNodePtr visNode; +// TriMeshModelPtr triMesh; + +// CoinVisualizationFactory vf; +// if (p->type == Box::TYPE) +// { +// Box* box = boost::dynamic_pointer_cast<Box>(p).get(); +// visNode = vf.createBox(box->width, box->height, box->depth); +// triMesh = visNode->getTriMeshModel(); +// } else if (p->type == Sphere::TYPE) +// { +// Sphere* sphere = boost::dynamic_pointer_cast<Sphere>(p).get(); +// visNode = vf.createSphere(sphere->radius); +// triMesh = visNode->getTriMeshModel(); +// } + +// if (visNode) +// { +// std::vector<MathTools::TriangleFace> faces = triMesh->faces; +// std::vector<Eigen::Vector3f> vertices = triMesh->vertices; + +// for (std::vector<Eigen::Vector3f>::iterator it = vertices.begin(); it != vertices.end(); it++) +// { +// Eigen::Vector4f v; +// v << (*it).x(), (*it).y(), (*it).z(), 1.f; +// v = currentTransform * v; +// (*it) = v.head(3); +// } + +// for (std::vector<MathTools::TriangleFace>::iterator it = faces.begin(); it != faces.end(); it++) +// { +// triMeshModel->addTriangleWithFace(vertices[it->id1], vertices[it->id2], vertices[it->id3]); +// } +// } +// } +// } + +// if (visualization) +// { + SoCallbackAction ca; + ca.addTriangleCallback(SoShape::getClassTypeId(), &CoinVisualizationNode::InventorTriangleCB, triMeshModel.get()); + ca.apply(visualization); +// } } @@ -300,6 +378,7 @@ VirtualRobot::VisualizationNodePtr CoinVisualizationNode::clone(bool deepCopy, f p->attachVisualization(i->first, attachedClone); i++; } + p->primitives = primitives; return p; } diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h index c23984fe0b7d6b0443fd2239d8d119ebcbc15b1e..faddb9acd39603c5b8377d748978f0f189926851 100644 --- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h +++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h @@ -44,7 +44,7 @@ class VIRTUAL_ROBOT_IMPORT_EXPORT CoinVisualizationNode : virtual public Visuali { friend class CoinVisualizationFactory; public: - CoinVisualizationNode(SoNode* visualizationNode); + CoinVisualizationNode(SoNode* visualizationNode); ~CoinVisualizationNode(); virtual TriMeshModelPtr getTriMeshModel(); diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h index 4835a5ac7de20894d4bf739e2e708d165a820a9a..909dfbfda1f2614a27905ea6b51c6fd211bf8e83 100644 --- a/VirtualRobot/Visualization/VisualizationFactory.h +++ b/VirtualRobot/Visualization/VisualizationFactory.h @@ -57,7 +57,7 @@ public: struct PhongMaterial { - PhongMaterial(){}; + PhongMaterial(){} Color emission; Color ambient; Color diffuse; @@ -70,15 +70,42 @@ public: float refractionIndex; }; + struct Primitive { + static const int TYPE = 0; + Primitive() : type(TYPE), transform(Eigen::Matrix4f::Identity()) {} + virtual ~Primitive() {} //needed for dynamic cast to work + Eigen::Matrix4f transform; + const int type; + protected: + Primitive(int type) : type(type) {} + }; + + struct Box : public Primitive { + static const int TYPE = 1; + Box() : Primitive(TYPE) {} + float width; + float height; + float depth; + }; + + struct Sphere : public Primitive { + static const int TYPE = 2; + Sphere() : Primitive(TYPE) {} + float radius; + }; + + typedef boost::shared_ptr<Primitive> PrimitivePtr; + VisualizationFactory() {;} virtual ~VisualizationFactory() {;} + virtual VisualizationNodePtr getVisualizationFromPrimitives(std::vector<PrimitivePtr> primitives, bool boundingBox = false){return VisualizationNodePtr();} virtual VisualizationNodePtr getVisualizationFromFile(const std::string& filename, bool boundingBox = false){return VisualizationNodePtr();} virtual VisualizationNodePtr getVisualizationFromFile(const std::ifstream& ifs, bool boundingBox = false){return VisualizationNodePtr();}; /*! A box, dimensions are given in mm. */ - virtual VisualizationNodePtr createBox(float length, float height, float width, float colorR, float colorG, float colorB){return VisualizationNodePtr();} + virtual VisualizationNodePtr createBox(float width, float height, float depth, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();} virtual VisualizationNodePtr createLine(const Eigen::Vector3f &from, const Eigen::Vector3f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();} virtual VisualizationNodePtr createLine(const Eigen::Matrix4f &from, const Eigen::Matrix4f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();} virtual VisualizationNodePtr createSphere(float radius, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();} diff --git a/VirtualRobot/Visualization/VisualizationNode.h b/VirtualRobot/Visualization/VisualizationNode.h index 5bd62722c5670eb0f60ac1cd04c81ce8bf551d33..7fb5ec71484dbf9d769ae7d5385d972cf4db75fc 100644 --- a/VirtualRobot/Visualization/VisualizationNode.h +++ b/VirtualRobot/Visualization/VisualizationNode.h @@ -39,33 +39,7 @@ class VIRTUAL_ROBOT_IMPORT_EXPORT VisualizationNode public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW - struct Primitive { - static const int TYPE = 0; - Primitive() : type(TYPE), transform(Eigen::Matrix4f::Identity()) {} - virtual ~Primitive() {} //needed for dynamic cast to work - Eigen::Matrix4f transform; - const int type; - protected: - Primitive(int type) : type(type) {} - }; - - struct Box : public Primitive { - static const int TYPE = 1; - Box() : Primitive(TYPE) {} - float width; - float height; - float depth; - }; - - struct Sphere : public Primitive { - static const int TYPE = 2; - Sphere() : Primitive(TYPE) {} - float radius; - }; - - typedef boost::shared_ptr<Primitive> PrimitivePtr; - - std::vector<PrimitivePtr> primitives; + std::vector<VisualizationFactory::PrimitivePtr> primitives; /*! Constructor diff --git a/VirtualRobot/XML/BaseIO.cpp b/VirtualRobot/XML/BaseIO.cpp index 37025ac1802f61b09e1aa1159404de2b5ba0a8a0..937d19edb9cf02d5c8f6cca89b69d45a65c44467 100644 --- a/VirtualRobot/XML/BaseIO.cpp +++ b/VirtualRobot/XML/BaseIO.cpp @@ -712,7 +712,7 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v std::string visuFileType = ""; std::string visuFile = ""; rapidxml::xml_attribute<> *attr; - std::vector<VisualizationNode::PrimitivePtr> primitives; + std::vector<VisualizationFactory::PrimitivePtr> primitives; VisualizationNodePtr visualizationNode; if (!visuXMLNode) @@ -741,7 +741,7 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v if (VisualizationFactory::first(NULL)) visuFileType = VisualizationFactory::first(NULL)->getDescription(); else - VR_WARNING << "No visualization present..." << endl; + VR_WARNING << "No visualization present..." << endl; } else visuFileType = attr->value(); @@ -754,13 +754,14 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v rapidxml::xml_node<> *visuPrimitivesXMLNode = visuXMLNode->first_node("primitives",0,false); if (visuPrimitivesXMLNode) { + THROW_VR_EXCEPTION_IF(visuFileXMLNode, "Multiple visualization sources defined (file and primitives)" << endl) rapidxml::xml_node<> *primitiveXMLNode = visuPrimitivesXMLNode->first_node(); while (primitiveXMLNode) { //extract info std::string pName = primitiveXMLNode->name(); - VisualizationNode::PrimitivePtr primitive; + VisualizationFactory::PrimitivePtr primitive; float lenFactor = 1.f; if (hasUnitsAttribute(primitiveXMLNode)) @@ -774,14 +775,14 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v if (pName == "Box") { - VisualizationNode::Box *box = new VisualizationNode::Box; + VisualizationFactory::Box *box = new VisualizationFactory::Box; box->width = convertToFloat(primitiveXMLNode->first_attribute("width",0,false)->value()) * lenFactor; box->height = convertToFloat(primitiveXMLNode->first_attribute("height",0,false)->value()) * lenFactor; box->depth = convertToFloat(primitiveXMLNode->first_attribute("depth",0,false)->value()) * lenFactor; primitive.reset(box); } else if (pName == "Sphere") { - VisualizationNode::Sphere *sphere = new VisualizationNode::Sphere; + VisualizationFactory::Sphere *sphere = new VisualizationFactory::Sphere; sphere->radius = convertToFloat(primitiveXMLNode->first_attribute("radius",0,false)->value()) * lenFactor; primitive.reset(sphere); } else @@ -807,9 +808,13 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v if (visualizationFactory) { visualizationNode = visualizationFactory->getVisualizationFromFile(visuFile); - visualizationNode->primitives = primitives; } else VR_WARNING << "VisualizationFactory of type '" << visuFileType << "' not present. Ignoring Visualization data in Node <" << tagName << ">" << endl; + } else if (primitives.size() != 0) + { + VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL); + visualizationNode = visualizationFactory->getVisualizationFromPrimitives(primitives); + visualizationNode->primitives = primitives; } diff --git a/VirtualRobot/data/objects/PrimitivesExample.xml b/VirtualRobot/data/objects/PrimitivesExample.xml index a30b44492564b6ac24ca384d73117a752856befb..aa94cecf51234a2cee57d1fafa522d5eb767df48 100644 --- a/VirtualRobot/data/objects/PrimitivesExample.xml +++ b/VirtualRobot/data/objects/PrimitivesExample.xml @@ -1,15 +1,22 @@ <ManipulationObject name='Vitalis'> <Visualization> + <!-- only file OR primitives is allowed --> <Primitives> <Box width="136" height="190" depth="40"/> <!-- primitive-specific parameters, default unit is mm --> - <Sphere radius="0.2" unitslength="m"> + <Sphere radius="0.15" unitslength="m"> <Transform> <!-- transform is relative to previous primitive --> - <Translation x="0" y="20" z="0"/> + <Translation x="0" y="170" z="0"/> </Transform> </Sphere> + <Box width="136" height="190" depth="40"> + <Transform> <!-- transform is relative to previous primitive --> + <Translation x="0" y="-355" z="0"/> + <rpy roll="0" pitch="1.41" yaw="0" unitsAngle="radian"/> + </Transform> + </Box> <!-- other primitives --> </Primitives> - <File type='inventor'>iv/vitalis.iv</File> + <!--File type='inventor'>iv/vitalis.iv</File--> <UseAsCollisionModel/> </Visualization> </ManipulationObject> diff --git a/VirtualRobot/data/objects/VitalisWithPrimitives.xml b/VirtualRobot/data/objects/VitalisWithPrimitives.xml index 4a816cf3b0d81ca4db34dd4677e46a6b951c4b76..a240b945bd37e307b7245fea47593862e82b6b14 100644 --- a/VirtualRobot/data/objects/VitalisWithPrimitives.xml +++ b/VirtualRobot/data/objects/VitalisWithPrimitives.xml @@ -3,7 +3,7 @@ <Primitives> <Box width="136" height="190" depth="40"/> </Primitives> - <File type='inventor'>iv/vitalis.iv</File> + <!--File type='inventor'>iv/vitalis.iv</File--> <UseAsCollisionModel/> </Visualization> </ManipulationObject>