void BodyCallback::operator()(osg::Node* node, osg::NodeVisitor* nv) { osg::ref_ptr<osg::PositionAttitudeTransform> pat = node->asTransform()->asPositionAttitudeTransform(); pat->setAttitude(model_.lock()->getBodyAttitude(bodyId_)); pat->setPosition(fromOde(model_.lock()->getBodyPosition(bodyId_))); traverse(node, nv); }
bool TouchSensorRenderModel::initRenderModel() { bool meshLoadingA = this->partA_->loadMesh("../models/TouchSensor.stl"); if (!meshLoadingA) { std::cerr << "[TouchSensorRenderModel] Error loading model" << std::endl; return false; } if (isDebugActive()) { this->showDebugView(); return true; } // PART A osg::ref_ptr<osg::PositionAttitudeTransform> partA = this->partA_->getMesh(); partA->setAttitude(osg::Quat(osg::inDegrees(-90.0), osg::Vec3(0, 0, 1))); partA->setPosition( fromOde( osg::Vec3( TouchSensorModel::SENSOR_BASE_THICKNESS / 2 + TouchSensorModel::SENSOR_THICKNESS / 2 - 0.002, 0, 0))); partA_->setColor(osg::Vec4(1, 0, 0, 1)); osg::ref_ptr<osg::PositionAttitudeTransform> patPartA( new osg::PositionAttitudeTransform()); patPartA->addChild(partA); this->getRootNode()->addChild(patPartA.get()); patPartA->setUpdateCallback( new BodyCallback(this->getModel(), TouchSensorModel::B_SENSOR_BASE_ID)); return true; }
bool ActiveHingeRenderModel::initRenderModel() { bool meshLoadingA = this->partA_->loadMesh("../models/ActiveHinge_Frame.stl"); if (!meshLoadingA) { std::cerr << "[ActiveHingeRenderModel] Error loading model" << std::endl; return false; } bool meshLoadingB = this->partB_->loadMesh( "../models/ActiveCardanHinge_Servo_Holder.stl"); if (!meshLoadingB) { std::cerr << "[ActiveHingeRenderModel] Error loading model" << std::endl; return false; } if (isDebugActive()) { this->showDebugView(); } // PART A osg::ref_ptr<osg::PositionAttitudeTransform> frame = this->partA_->getMesh(); partA_->setColor(osg::Vec4(1, 0, 0, 0.5)); partB_->setColor(osg::Vec4(0, 1, 0, 0.5)); // x = 0 is midpoint of slot, so -SLOT_THICKNESS/2 is edge of frame // and frame is (FRAME_LENGTH + SLOT_THICKNESS) long // so (FRAME_LENGTH + SLOT_THICKNESS)/2 -SLOT_THICKNESS/2 = // FRAME_LENGTH/2 frame->setPosition( fromOde( osg::Vec3( ActiveHingeModel::FRAME_LENGTH / 2, ActiveHingeModel::SERVO_POSITION_OFFSET, 0))); frame->setAttitude(osg::Quat(osg::inDegrees(180.0), osg::Vec3(1, 0, 0))); osg::ref_ptr<osg::PositionAttitudeTransform> patFrame( new osg::PositionAttitudeTransform()); patFrame->addChild(frame); this->getMeshes()->addChild(patFrame.get()); patFrame->setUpdateCallback( new BodyCallback(this->getModel(), ActiveHingeModel::B_SLOT_A_ID)); // PART B //float servoMeshCorrection = inMm(3.2); // x = 0 is midpoint of slot so SLOT_THICKNESS/2 is edge of servo // and servo is SERVO_LENGTH + SLOT_THICKNESS long // so -(SERVO_LENGTH + SLOT_THICKNESS)/2 + SLOT_THICKNESS/2 // = -(SERVO_LENGTH)/2 osg::ref_ptr<osg::PositionAttitudeTransform> servo = this->partB_->getMesh(); servo->setPosition( fromOde( osg::Vec3(-(ActiveHingeModel::SERVO_LENGTH) / 2, 0, 0))); servo->setAttitude(osg::Quat(osg::inDegrees(270.0), osg::Vec3(1, 0, 0))); osg::ref_ptr<osg::PositionAttitudeTransform> patServo( new osg::PositionAttitudeTransform()); patServo->addChild(servo.get()); this->getMeshes()->addChild(patServo.get()); patServo->setUpdateCallback( new BodyCallback(this->getModel(), ActiveHingeModel::B_SLOT_B_ID)); if(isDebugActive()) { this->activateTransparency(patFrame->getOrCreateStateSet()); this->activateTransparency(patServo->getOrCreateStateSet()); } return true; }
bool ActiveCardanRenderModel::initRenderModel() { bool meshLoadingA = this->partA_->loadMesh( "../models/ActiveCardanHinge_Servo_Holder.stl"); if (!meshLoadingA) { std::cerr << "[ActiveCardanRenderModel] Error loading model" << std::endl; return false; } bool meshLoadingB = this->partB_->loadMesh( "../models/ActiveCardanHinge_Servo_Holder.stl"); if (!meshLoadingB) { std::cerr << "[ActiveCardanRenderModel] Error loading model" << std::endl; return false; } bool meshLoadingC = this->patCross_->loadMesh( "../models/ActiveCardan_CrossShaft.stl"); if (!meshLoadingC) { std::cerr << "[ActiveCardanRenderModel] Error loading model" << std::endl; return false; } if (isDebugActive()) { this->showDebugView(); } float meshCorrection = inMm(0.5); // PART A osg::ref_ptr<osg::PositionAttitudeTransform> partA = this->partA_->getMesh(); partA_->setColor(osg::Vec4(1, 0, 0, 1)); partB_->setColor(osg::Vec4(0, 1, 0, 1)); partA->setPosition( osg::Vec3( fromOde(meshCorrection + ActiveCardanModel::SLOT_THICKNESS + ActiveCardanModel::CONNNECTION_PART_LENGTH / 2), 0, 0)); partA->setAttitude(osg::Quat(osg::inDegrees(90.0), osg::Vec3(0, 0, 1)) * osg::Quat(osg::inDegrees(90.0), osg::Vec3(1, 0, 0))); osg::ref_ptr<osg::PositionAttitudeTransform> patPartA( new osg::PositionAttitudeTransform()); patPartA->addChild(partA); this->getRootNode()->addChild(patPartA.get()); patPartA->setUpdateCallback( new BodyCallback(this->getModel(), ActiveCardanModel::B_SLOT_A_ID)); //attachAxis(patPartA); // Cross osg::ref_ptr<osg::PositionAttitudeTransform> cross = this->patCross_->getMesh(); osg::ref_ptr<osg::PositionAttitudeTransform> patCross( new osg::PositionAttitudeTransform()); patCross->addChild(cross.get()); this->getRootNode()->addChild(patCross.get()); patCross->setUpdateCallback( new BodyCallback(this->getModel(), ActiveCardanModel::B_CROSS_PART_A_ID)); //attachAxis(patCross); // PART B osg::ref_ptr<osg::PositionAttitudeTransform> partB = this->partB_->getMesh(); partB->setPosition( fromOde( osg::Vec3( -(meshCorrection + ActiveCardanModel::SLOT_THICKNESS + ActiveCardanModel::CONNNECTION_PART_LENGTH / 2), 0, 0))); osg::Quat rotateY(osg::inDegrees(90.0), osg::Vec3(0, 1, 0)); osg::Quat rotateServoX(osg::inDegrees(90.0), osg::Vec3(1, 0, 0)); partB->setAttitude(rotateServoX * rotateY * osg::Quat(osg::inDegrees(90.0), osg::Vec3(1, 0, 0))); osg::ref_ptr<osg::PositionAttitudeTransform> patPartB( new osg::PositionAttitudeTransform()); patPartB->addChild(partB.get()); this->getRootNode()->addChild(patPartB.get()); patPartB->setUpdateCallback( new BodyCallback(this->getModel(), ActiveCardanModel::B_SLOT_B_ID)); //attachAxis(patPartB); return true; }
TerrainRender::TerrainRender(boost::shared_ptr<Terrain> terrain) { rootNode_ = osg::ref_ptr<osg::PositionAttitudeTransform>( new osg::PositionAttitudeTransform); if (terrain->isFlat()) { // Generate a flat terrain osg::ref_ptr<osg::Shape> shape( new osg::Box(osg::Vec3(0, 0, -2.5), fromOde(terrain->getWidth()), fromOde(terrain->getDepth()), 5)); osg::ref_ptr<osg::ShapeDrawable> osgPlaneDrawable( new osg::ShapeDrawable(shape.get())); osg::ref_ptr<osg::Geode> osgGroundGeode(new osg::Geode()); osgGroundGeode->addDrawable(osgPlaneDrawable.get()); rootNode_->addChild(osgGroundGeode); } else { // Generate terrain from height field // 1) Load the height field unsigned int xPointsCount = terrain->getHeightFieldData()->s(); unsigned int yPointsCount = terrain->getHeightFieldData()->t(); osg::ref_ptr<osg::HeightField> heightField(new osg::HeightField); heightField->allocate(xPointsCount, yPointsCount); heightField->setOrigin(osg::Vec3(0, 0, 0)); heightField->setXInterval(fromOde(terrain->getWidth()) / xPointsCount); heightField->setXInterval(fromOde(terrain->getDepth()) / yPointsCount); heightField->setSkirtHeight(1.0f); // Copy height information to the glfloat array for (unsigned int i = 0; i < xPointsCount; ++i) { for (unsigned int j = 0; j < yPointsCount; ++j) { heightField->setHeight(i, j, ((*terrain->getHeightFieldData()->data(i, j)) / 255.0) * fromOde(terrain->getHeightFieldHeight())/2); } } // Create a terrain tile osg::ref_ptr<osgTerrain::Locator> terrainTileLocator( new osgTerrain::Locator()); terrainTileLocator->setCoordinateSystemType( osgTerrain::Locator::PROJECTED); terrainTileLocator->setTransformAsExtents(-fromOde(terrain->getWidth())/2, -fromOde(terrain->getDepth())/2, fromOde(terrain->getWidth())/2, fromOde(terrain->getDepth())/2); osg::ref_ptr<osgTerrain::HeightFieldLayer> heightFieldLayer = new osgTerrain::HeightFieldLayer(heightField.get()); heightFieldLayer->setLocator(terrainTileLocator); osg::ref_ptr<osgTerrain::GeometryTechnique> terrainGeomTechnique( new osgTerrain::GeometryTechnique()); osg::ref_ptr<osgTerrain::TerrainTile> terrainTile( new osgTerrain::TerrainTile()); terrainTile->setElevationLayer(heightFieldLayer.get()); terrainTile->setTerrainTechnique(terrainGeomTechnique.get()); // Generate an OSG terrain object osg::ref_ptr<osgTerrain::Terrain> osgTerrain(new osgTerrain::Terrain()); osgTerrain->setSampleRatio(1.0f); osgTerrain->addChild(terrainTile.get()); rootNode_->addChild(osgTerrain.get()); // Uncomment to debug terrain /*double minX, minY, minZ, maxX, maxY, maxZ; terrain->getBB(minX, maxX, minY, maxY, minZ, maxZ); std::cout << "Terrain AABB(minX, maxX, minY, maxY, minZ, maxZ) (" << minX << ", " << maxX << ", " << minY << ", " << maxY << ", " << minZ << ", " << maxZ << ")" << std::endl; osg::ref_ptr<osg::Shape> shape( new osg::Box(osg::Vec3(fromOde(minX + (maxX-minX)/2), fromOde(minY + (maxY-minY)/2), fromOde(minZ +(maxZ-minZ))/2), fromOde(maxX-minX), fromOde(maxY-minY), fromOde(maxZ-minZ))); osg::ref_ptr<osg::ShapeDrawable> osgPlaneDrawable( new osg::ShapeDrawable(shape.get())); osg::ref_ptr<osg::Geode> osgGroundGeode(new osg::Geode()); osgGroundGeode->addDrawable(osgPlaneDrawable.get()); rootNode_->addChild(osgGroundGeode);*/ } }
bool ActiveHingeRenderModel::initRenderModel() { bool meshLoadingA = this->partA_->loadMesh("../models/ActiveHinge_Frame.stl"); if (!meshLoadingA) { std::cerr << "[ActiveHingeRenderModel] Error loading model" << std::endl; return false; } bool meshLoadingB = this->partB_->loadMesh( "../models/ActiveCardanHinge_Servo_Holder.stl"); if (!meshLoadingB) { std::cerr << "[ActiveHingeRenderModel] Error loading model" << std::endl; return false; } if (isDebugActive()) { this->showDebugView(); return true; } // PART A osg::ref_ptr<osg::PositionAttitudeTransform> frame = this->partA_->getMesh(); partA_->setColor(osg::Vec4(1, 0, 0, 1)); partB_->setColor(osg::Vec4(0, 1, 0, 1)); frame->setPosition( fromOde( osg::Vec3( ActiveHingeModel::FRAME_LENGTH / 2 - ActiveHingeModel::SLOT_THICKNESS, 0, 0))); frame->setAttitude(osg::Quat(osg::inDegrees(90.0), osg::Vec3(1, 0, 0))); osg::ref_ptr<osg::PositionAttitudeTransform> patFrame( new osg::PositionAttitudeTransform()); patFrame->addChild(frame); this->getRootNode()->addChild(patFrame.get()); patFrame->setUpdateCallback( new BodyCallback(this->getModel(), ActiveHingeModel::B_SLOT_A_ID)); // PART B float servoMeshCorrection = inMm(2.2); osg::ref_ptr<osg::PositionAttitudeTransform> servo = this->partB_->getMesh(); servo->setPosition( fromOde( osg::Vec3( -(ActiveHingeModel::SERVO_LENGTH / 2) - servoMeshCorrection, 0, 0))); servo->setAttitude(osg::Quat(osg::inDegrees(90.0), osg::Vec3(0, 0, 1)) * osg::Quat(osg::inDegrees(180.0), osg::Vec3(0, 1, 0))); osg::ref_ptr<osg::PositionAttitudeTransform> patServo( new osg::PositionAttitudeTransform()); patServo->addChild(servo.get()); this->getRootNode()->addChild(patServo.get()); patServo->setUpdateCallback( new BodyCallback(this->getModel(), ActiveHingeModel::B_SLOT_B_ID)); return true; }