コード例 #1
0
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);
}
コード例 #2
0
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;

}
コード例 #3
0
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;
}
コード例 #4
0
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;

}
コード例 #5
0
ファイル: TerrainRender.cpp プロジェクト: Arpic/robogen
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);*/

	}

}
コード例 #6
0
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;

}