예제 #1
0
int main()
{
	// Sample Program to explain all Functionalities

	
	// First Step: Set paths to all key files generated by script using .obj Mesh 	
	std::string pathCoordinates = "D:\\GSOC-Kinect\\Characters\\GirlTest\\LabelFileGeneration\\GirlOne_BrokenMesh.coords";
	std::string pathLabels = "D:\\GSOC-Kinect\\Characters\\GirlTest\\LabelFileGeneration\\GirlOne_BrokenMesh.labels";
	std::string pathFaces = "D:\\GSOC-Kinect\\Characters\\GirlTest\\LabelFileGeneration\\GirlOne_UnbrokenMesh.faces";
	
	// Set path to the mapping file
	std::string pathMapping = "C:\\Work\\src\\Labelling\\Dependencies\\Mapping.reduce";
	
	// Create a Mesh from the .obj file
	Mesh aMesh(pathCoordinates,pathFaces,pathLabels);
	
	// Remap Mesh to get labelling of vertices of your choice
	aMesh.remapMesh(pathMapping);
	
	// fix knees to make the labelling cylinderical rather then on the front only
	aMesh.fixJoint("Left-Knee","Y");
	aMesh.fixJoint("Right-Knee","Y");
	
	// adding missing joint this way
	aMesh.addJoint("Left-Arm-Upper","Left-Arm-Lower",0.1,"Left-Elbow");
	aMesh.addJoint("Right-Arm-Upper","Right-Arm-Lower",0.1,"Right-Elbow");
	
	// adding another joint that i need for completing my representation
	aMesh.addJoint("Left-Arm-Lower","Left-Hand",0.1,"Left-Wrist");
	aMesh.addJoint("Right-Arm-Lower","Right-Hand",0.1,"Right-Wrist");
	
	// now referring to the files generated by the mhx file
	
	// set paths for these files
	std::string pathCoordinatesMHX = "D:\\GSOC-Kinect\\Characters\\GirlTest\\Mesh\\GirlOne_MHX_Mesh.coords";
	std::string pathFacesMHX = "D:\\GSOC-Kinect\\Characters\\GirlTest\\Mesh\\GirlOne_MHX_Mesh.faces";
		
	// creating an mhx mesh	
	Mesh mhxMesh(pathCoordinatesMHX,pathFacesMHX,"");				
	
	// obtaining the labels and coordinates for the .obj mesh
	std::vector< std::vector<float> > externalMeshCoordinates = aMesh.getCoordinates();
	std::vector<std::string> externalMeshLabels = aMesh.getLabels();
	
	// obtbaining labelling for the mhx mesh based on the labelling for the obj mesh
	mhxMesh.loadLabels(externalMeshCoordinates,externalMeshLabels);	
	
	// execution complete
	system("PAUSE");

}
예제 #2
0
int
ExtendMesh2Rectangle::compute()
{
    coDoPolygons *inMesh = dynamic_cast<coDoPolygons *>(p_in_geometry_->getCurrentObject());
    if (!(inMesh && inMesh->objectOk()))
    {
        std::string errorText = "Input object at port '";
        errorText += p_in_geometry_->getName();
        errorText += "not available or not ok.";
        Covise::sendError(errorText.c_str());
        return STOP_PIPELINE;
    }
    xSize_ = para_xSize_->getValue();
    ySize_ = para_ySize_->getValue();
    radius_ = para_radius_->getValue();
    GeometryUtils::Covise2dMeshWrapper aMesh(inMesh);
    if (featureRadiusEnabled())
        GeometryUtils::extendToQuarterCircleOfRadius(radius_, aMesh);
    GeometryUtils::extendToQuarterRectangle(xSize_, ySize_, aMesh);
    coDoPolygons *polygons_out
        = new coDoPolygons(
            p_out_geometry_->getObjName(),
            aMesh.x.size(),
            aMesh.corners.size(),
            aMesh.elements.size());
    if (!(polygons_out and polygons_out->objectOk()))
    {
        std::string errorText = "Object for port '";
        errorText += p_out_geometry_->getName();
        errorText += "' can't be created.";
        Covise::sendError(errorText.c_str());
        return STOP_PIPELINE;
    }
    {
        float *u_out;
        float *v_out;
        float *w_out;
        int *vl;
        int *pl;
        polygons_out->getAddresses(&u_out, &v_out, &w_out, &vl, &pl);
        std::copy(aMesh.x.begin(), aMesh.x.end(), u_out);
        std::copy(aMesh.y.begin(), aMesh.y.end(), v_out);
        std::copy(aMesh.z.begin(), aMesh.z.end(), w_out);
        std::copy(aMesh.corners.begin(), aMesh.corners.end(), vl);
        std::copy(aMesh.elements.begin(), aMesh.elements.end(), pl);
        p_out_geometry_->setCurrentObject(polygons_out);
    }
    return SUCCESS;
}
freeSurface::freeSurface
(
    dynamicFvMesh& m,
    const volScalarField& rho,
    volVectorField& Ub,
    volScalarField& Pb,
    const surfaceScalarField& sfPhi
)
:
    IOdictionary
    (
        IOobject
        (
            "freeSurfaceProperties",
            Ub.mesh().time().constant(),
            Ub.mesh(),
            IOobject::MUST_READ,
            IOobject::NO_WRITE
        )
    ),
    mesh_(m),
    rho_(rho),
    U_(Ub),
    p_(Pb),
    phi_(sfPhi),
    curTimeIndex_(Ub.mesh().time().timeIndex()),
    twoFluids_
    (
        this->lookup("twoFluids")
    ),
    normalMotionDir_
    (
        this->lookup("normalMotionDir")
    ),
    motionDir_(0, 0, 0),
    cleanInterface_
    (
        this->lookup("cleanInterface")
    ),
    aPatchID_(-1),
    bPatchID_(-1),
    muFluidA_
    (
        this->lookup("muFluidA")
    ),
    muFluidB_
    (
        this->lookup("muFluidB")
    ),
    rhoFluidA_
    (
        this->lookup("rhoFluidA")
    ),
    rhoFluidB_
    (
        this->lookup("rhoFluidB")
    ),
    g_(this->lookup("g")),
    cleanInterfaceSurfTension_
    (
        this->lookup("surfaceTension")
    ),
    fixedFreeSurfacePatches_
    (
        this->lookup("fixedFreeSurfacePatches")
    ),
    pointNormalsCorrectionPatches_
    (
        this->lookup("pointNormalsCorrectionPatches")
    ),
    nFreeSurfCorr_
    (
        readInt(this->lookup("nFreeSurfaceCorrectors"))
    ),
    smoothing_(false),
    interpolatorABPtr_(NULL),
    interpolatorBAPtr_(NULL),
    controlPointsPtr_(NULL),
    motionPointsMaskPtr_(NULL),
    pointsDisplacementDirPtr_(NULL),
    facesDisplacementDirPtr_(NULL),
    totalDisplacementPtr_(NULL),
    aMeshPtr_(NULL),
    UsPtr_(NULL),
    phisPtr_(NULL),
    surfactConcPtr_(NULL),
    surfaceTensionPtr_(NULL),
    surfactantPtr_(NULL),
    fluidIndicatorPtr_(NULL)
{
    //Read motion direction
    if (!normalMotionDir_)
    {
        motionDir_ = vector(this->lookup("motionDir"));
        motionDir_ /= mag(motionDir_) + SMALL;
    }

    // Set point normal correction patches
    boolList& correction = aMesh().correctPatchPointNormals();

    forAll(pointNormalsCorrectionPatches_, patchI)
    {
        word patchName = pointNormalsCorrectionPatches_[patchI];

        label patchID = aMesh().boundary().findPatchID(patchName);

        if(patchID == -1)
        {
            FatalErrorIn
            (
                "freeSurface::freeSurface(...)"
            )   << "Patch name for point normals correction does not exist"
                << abort(FatalError);
        }

        correction[patchID] = true;
    }
예제 #4
0
파일: BorderEdges.cpp 프로젝트: nixz/covise
int BorderEdges::compute()
{
    coDoPolygons *inMesh = dynamic_cast<coDoPolygons *>(p_in_geometry_->getCurrentObject());
    if (!(inMesh && inMesh->objectOk()))
    {
        std::string errorText = "Input object at port '";
        errorText += p_in_geometry_->getName();
        errorText += "not available or not ok.";
        Covise::sendError(errorText.c_str());
        return STOP_PIPELINE;
    }

    // determine border
    GeometryUtils::Covise2dMeshWrapper aMesh(inMesh);
    vector<int> numberOfVerticesPerElement; // for satisfy the interface
    aMesh.calculateNumberOfVerticesPerElement(numberOfVerticesPerElement);
    vector<GeometryUtils::Edge> borderEdgesRelativeToMesh;
    MagmaUtils::BorderEdges(
        aMesh.elements, numberOfVerticesPerElement, aMesh.corners, aMesh.x.size(),
        borderEdgesRelativeToMesh);

    // compress/reorder the border
    std::set<int, std::less<int> > vertexNumbersOfBorder;
    std::for_each(
        borderEdgesRelativeToMesh.begin(), borderEdgesRelativeToMesh.end(),
        PutIndizesIntoContainer(vertexNumbersOfBorder));

    GeometryUtils::Covise2dMesh lineMesh;
    lineMesh.x.resize(vertexNumbersOfBorder.size());
    lineMesh.y.resize(vertexNumbersOfBorder.size());
    lineMesh.z.resize(vertexNumbersOfBorder.size());
    std::map<int, int> oldVertexNumber2New;

    int newNumber = 0;
    for (std::set<int, std::less<int> >::const_iterator citer
         = vertexNumbersOfBorder.begin();
         citer != vertexNumbersOfBorder.end();
         ++citer, ++newNumber)
    {
        oldVertexNumber2New[*citer] = newNumber;
        lineMesh.x[newNumber] = aMesh.x[*citer];
        lineMesh.y[newNumber] = aMesh.y[*citer];
        lineMesh.z[newNumber] = aMesh.z[*citer];
    }

    lineMesh.elements.resize(borderEdgesRelativeToMesh.size());
    lineMesh.corners.resize(2 * borderEdgesRelativeToMesh.size());
    for (int i = 0; i != lineMesh.elements.size(); ++i)
    {
        lineMesh.elements[i] = 2 * i;
        lineMesh.corners[2 * i] = oldVertexNumber2New[borderEdgesRelativeToMesh[i].first];
        lineMesh.corners[2 * i + 1] = oldVertexNumber2New[borderEdgesRelativeToMesh[i].second];
    }

    coDoLines *lines_out
        = new coDoLines(
            p_out_geometry_->getObjName(),
            lineMesh.x.size(),
            lineMesh.corners.size(),
            lineMesh.elements.size());

    if (!(lines_out and lines_out->objectOk()))
    {
        std::string errorText = "Object for port '";
        errorText += p_out_geometry_->getName();
        errorText += "' can't be created.";
        Covise::sendError(errorText.c_str());
        return STOP_PIPELINE;
    }
    {
        float *u_out;
        float *v_out;
        float *w_out;
        int *vl;
        int *pl;
        lines_out->getAddresses(&u_out, &v_out, &w_out, &vl, &pl);
        std::copy(lineMesh.x.begin(), lineMesh.x.end(), u_out);
        std::copy(lineMesh.y.begin(), lineMesh.y.end(), v_out);
        std::copy(lineMesh.z.begin(), lineMesh.z.end(), w_out);
        std::copy(lineMesh.corners.begin(), lineMesh.corners.end(), vl);
        std::copy(lineMesh.elements.begin(), lineMesh.elements.end(), pl);
        p_out_geometry_->setCurrentObject(lines_out);
    }
    return SUCCESS;
}