示例#1
0
    // Simple physics timsetp
    void Start()
    {
        if ( !modffd )
        {
            modffd = GetComponent<MegaFFD3x3x3>();
            modobj = GetComponent<MegaModifyObject>();
        }

        if(modffd){
            System.Array.Copy(modffd.pt,initialHandlesPosition,64);
            //modffd.pt.CopyTo(initialHandlesPosition,64);
            Debug.Log ("Initial handles position stored");
        }
        planeT = GameObject.Find("PlaneTunnel");
        sphCollider = GetComponent<SphereCollider>();
        colliderPosition = sphCollider.center;
    }
示例#2
0
    void Update()
    {
        // Find the mods
        if ( !modffd )
        {
            modffd = GetComponent<MegaFFD3x3x3>();
            modobj = GetComponent<MegaModifyObject>();
        }

        if ( modffd )
        {

            Vector3 toolPosition = tool.transform.position;
            size = modffd.GridSize();
            int gridSize = size*size*size;
            distance = new float[gridSize];
            entries = new int[gridSize];
            indicies = new Vector3[gridSize];

        if(inCollision){

        for ( int i = 0; i < size; i++ )		// TODO: dim for all ffd
        {
            for ( int j = 0; j < size; j++ )
            {
                for ( int k = 0; k < size; k++ )
                {
                    int c = modffd.GridIndex(i, j, k);
                    indicies[c] = new Vector3 (i,j,k);	//indicies of the handle i,j,k
                    entries[c]=c;
                    distance[c] =  Vector3.Distance(transform.TransformPoint(modffd.GetPoint(i,j,k)),collisionPoint);//There should be collision point instead of pposition of the tool

                }
            }
        }

            System.Array.Sort(distance, entries);

            if(sphereSwitch){
                if(!redSphere){
                    redSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                    redSphere.GetComponent<Renderer>().material.color = Color.red;
                    redSphere.transform.localScale = new Vector3(0.2f, 0.2f,0.2f);
                    redSphere.name = "Red Sphere";
                }
                if(!blueSphere){
                    blueSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                    blueSphere.GetComponent<Renderer>().material.color = Color.blue;
                    blueSphere.transform.localScale = new Vector3(0.2f, 0.2f,0.2f);
                    blueSphere.name = "Blue Sphere";
                }
                if(!greenSphere){
                    greenSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                    greenSphere.GetComponent<Renderer>().material.color = Color.green;
                    greenSphere.transform.localScale = new Vector3(0.2f, 0.2f,0.2f);
                    greenSphere.name = "Green Sphere";
                }
                if(!yellowSphere){
                    yellowSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                    yellowSphere.GetComponent<Renderer>().material.color = Color.yellow;
                    yellowSphere.transform.localScale = new Vector3(0.2f, 0.2f,0.2f);
                    yellowSphere.name = "Yellow Sphere";
                }

                    redSphere.transform.position = modffd.GetPoint(entries[0]);
                    blueSphere.transform.position = modffd.GetPoint(entries[1]);
                    greenSphere.transform.position = modffd.GetPoint(entries[2]);
                    yellowSphere.transform.position = modffd.GetPoint(entries[3]);
            }
            else{
                Destroy(redSphere);
                Destroy(blueSphere);
                Destroy(greenSphere);
                Destroy(yellowSphere);
            }

            Vector4 neighbors = new Vector4(distance[0],distance[1],distance[2],distance[3]);
            neighbors.Normalize();

            for(int i = 0; i < 4; i++){

                    if(neighbors[i]==0){
                        neighbors[i]=0.01f;
                    }
                    neighbors[i] = 1 / neighbors[i];
                }

            neighbors.Normalize();

            currentPosition = tool.transform.position;
            displacement = currentPosition-previousPosition;
            Debug.Log("Displacement:                                            " +displacement);

            if(!firsttimecollision)
            {
        //			positionoffirstcollisionpoint  += displacement;
        //
        //			if(displacement.y < 0 && (positionoffirstcollisionpoint.y < firstcollisionpoint.y) )
        //			{

            if(deformation){

            //	Debug.Log (neighbors);

                    //Debug.Log (displacement);
                for(int i = 0; i < 4; i++){
                    int l = entries[i];
                    Vector3 index = indicies[l];
                        int x = (int)index.x;
                        int y = (int)index.y;
                        int z = (int)index.z;
                        float neighbor = neighbors[i];

                        finalDisplacement = -displacement*coefficient*neighbor;//new Vector3 (0,0,0.001f);//displacement*neighbor;
                    //	Debug.Log("Neighbor: " +neighbor);

                    modffd.MovePoint(x,y,z,finalDisplacement);

                    }

                    float centerY = sphCollider.center.y - displacement.y*coefficientCollider;//*coefficient;
                    sphCollider.center = new Vector3(colliderPosition.x,centerY,colliderPosition.z);

                    //planeT.transform.localScale+= new Vector3(finalDisplacement.x*1000,0,0);
                    //			float centerY;
        //					centerY = sphCollider.center.y - displacement.y*coefficient;
        //					sphCollider.center = new Vector3 (colliderPosition.x,centerY,colliderPosition.z);
        //					if((colliderPosition.y-centerY)<=0.001f){
        //						sphCollider.center=colliderPosition;
        //					}

                }

        //				}
                }
                else
                {
                firsttimecollision = false;
                firstcollisionpoint = collisionPoint;
                positionoffirstcollisionpoint = firstcollisionpoint;
                }
            previousPosition=currentPosition;
        //	Debug.Log("distance[0]: " +distance[0] + " distance[1]: " +distance[1] + " distance[2]: " + distance[2]);
          	//	 Debug.Log("entries[0]: " +entries[0] + " entries[1]: " +entries[1] + " entries[2]: " + entries[2]);
        //	Debug.Log (indicies[2]);

            }
        }
    }