Esempio n. 1
0
        public static void Slide(Scene scene, String direction)
        {
            BoundingBox tmpbb;
            float       tmpDistance = float.MaxValue, minDistance = float.MaxValue, minDistanceGlobal = float.MaxValue;
            bool        colisionFound = false;
            bool        canTranslate  = true;

            SetBBoxes(scene);                       //tworzy strukture bboxów nie zaznaczonych obiektów na dole hierarchii, oraz bboxx sceny

            if (otherSceneObjBB.Count > 0)
            {
                if (direction.Equals("xyl")) //rzutowanie na płaszczyznę x y przesunięcie do lewej
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.GetAllMeshes())
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp  = new Vector3D(sceneBB.minBB.x, tmpbb.minBB.y, tmpbb.minBB.z);
                            Vector3D tmp2 = new Vector3D(tmpbb.minBB.x, tmpbb.maxBB.y, tmpbb.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmp, tmp2);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance   = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                    {
                                        minDistance = tmpDistance;
                                    }
                                    if (minDistance < minDistanceGlobal)
                                    {
                                        minDistanceGlobal = minDistance;
                                    }
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                    {
                                        canTranslate = false;
                                    }
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                                      + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound && canTranslate)
                    {
                        Transformations.Translate(scene, -minDistanceGlobal, 0, 0);
                    }
                    else if (colisionFound && !canTranslate)
                    {
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    }
                    else
                    {
                        Console.WriteLine("Brak kolizji");
                    }
                }
                else if (direction.Equals("xyr")) //rzutowanie na płaszczyznę x y przesunięcie do prawej
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.GetAllMeshes())
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp  = new Vector3D(sceneBB.maxBB.x, tmpbb.maxBB.y, tmpbb.maxBB.z);
                            Vector3D tmp2 = new Vector3D(tmpbb.minBB.x, tmpbb.minBB.y, tmpbb.minBB.z);
                            requiredSpaceBB = new BoundingBox(tmp2, tmp);
                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    Console.WriteLine("Zaznaczony obiekt " + tmpbb.minBB.x + " " + tmpbb.minBB.y + " " + tmpbb.minBB.z + " : "
                                                      + tmpbb.maxBB.x + " " + tmpbb.maxBB.y + " " + tmpbb.maxBB.z);
                                    tmpDistance = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                    {
                                        minDistance = tmpDistance;
                                    }
                                    if (minDistance < minDistanceGlobal)
                                    {
                                        minDistanceGlobal = minDistance;
                                    }
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                    {
                                        canTranslate = false;
                                    }
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                                      + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                    {
                        Transformations.Translate(scene, minDistanceGlobal, 0, 0);
                    }
                    else if (colisionFound && !canTranslate)
                    {
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    }
                    else
                    {
                        Console.WriteLine("Brak kolizji");
                    }
                }
                else if (direction.Equals("yzu")) //rzutowanie na płaszczyznę y z przesunięcie do góry
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.GetAllMeshes())
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp  = new Vector3D(tmpbb.maxBB.x, sceneBB.maxBB.y, tmpbb.maxBB.z);
                            Vector3D tmp2 = new Vector3D(tmpbb.minBB.x, tmpbb.maxBB.y, tmpbb.minBB.z);
                            requiredSpaceBB = new BoundingBox(tmp2, tmp);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance   = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                    {
                                        minDistance = tmpDistance;
                                    }
                                    if (minDistance < minDistanceGlobal)
                                    {
                                        minDistanceGlobal = minDistance;
                                    }
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                    {
                                        canTranslate = false;
                                    }
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                                      + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                    {
                        Transformations.Translate(scene, 0, minDistanceGlobal, 0);
                    }
                    else if (colisionFound && !canTranslate)
                    {
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    }
                    else
                    {
                        Console.WriteLine("Brak kolizji");
                    }
                }
                else if (direction.Equals("yzd")) //rzutowanie na płaszczyznę y z przesunięcie do dołu
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.GetAllMeshes())
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp  = new Vector3D(tmpbb.minBB.x, sceneBB.minBB.y, tmpbb.minBB.z);
                            Vector3D tmp2 = new Vector3D(tmpbb.maxBB.x, tmpbb.minBB.y, tmpbb.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmp, tmp2);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance   = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                    {
                                        minDistance = tmpDistance;
                                    }
                                    if (minDistance < minDistanceGlobal)
                                    {
                                        minDistanceGlobal = minDistance;
                                    }
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                    {
                                        canTranslate = false;
                                    }
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                                      + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                    {
                        Transformations.Translate(scene, 0, -minDistanceGlobal, 0);
                    }
                    else if (colisionFound && !canTranslate)
                    {
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    }
                    else
                    {
                        Console.WriteLine("Brak kolizji");
                    }
                }
                else if (direction.Equals("zxb")) //rzutowanie na płaszczyznę z x przesunięcie do tyłu
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.GetAllMeshes())
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp  = new Vector3D(tmpbb.minBB.x, tmpbb.minBB.y, sceneBB.minBB.z);
                            Vector3D tmp2 = new Vector3D(tmpbb.maxBB.x, tmpbb.maxBB.y, tmpbb.minBB.z);
                            requiredSpaceBB = new BoundingBox(tmp, tmp2);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance   = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                    {
                                        minDistance = tmpDistance;
                                    }
                                    if (minDistance < minDistanceGlobal)
                                    {
                                        minDistanceGlobal = minDistance;
                                    }
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                    {
                                        canTranslate = false;
                                    }
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                                      + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                    {
                        Transformations.Translate(scene, 0, 0, -minDistanceGlobal);
                    }
                    else if (colisionFound && !canTranslate)
                    {
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    }
                    else
                    {
                        Console.WriteLine("Brak kolizji");
                    }
                }
                else //if(direction.Equals("zxf")) //rzutowanie na płaszczyznę z x przesunięcie do przodu
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.GetAllMeshes())
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp  = new Vector3D(tmpbb.maxBB.x, tmpbb.maxBB.y, sceneBB.maxBB.z);
                            Vector3D tmp2 = new Vector3D(tmpbb.minBB.x, tmpbb.minBB.y, tmpbb.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmp2, tmp);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance   = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                    {
                                        minDistance = tmpDistance;
                                    }
                                    if (minDistance < minDistanceGlobal)
                                    {
                                        minDistanceGlobal = minDistance;
                                    }
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                    {
                                        canTranslate = false;
                                    }
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                                      + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                    {
                        Transformations.Translate(scene, 0, 0, minDistanceGlobal);
                    }
                    else if (colisionFound && !canTranslate)
                    {
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    }
                    else
                    {
                        Console.WriteLine("Brak kolizji");
                    }
                }
            }
            else
            {
                Console.WriteLine("Brak innych objektów sceny");
            }
            Clear();
        }
Esempio n. 2
0
        public static void SlideEZver(Scene scene, String slideDir)
        {
            float minDistance = float.MaxValue;
            float tmpDistance;
            bool  colisionFound = false;
            bool  canTranslate  = true;

            SetBBoxes(scene);                       //tworzy strukture bboxów nie zaznaczonych obiektów na dole hierarchii, oraz bboxx sceny
            SetSlidingObjectBBox(scene);
            SetSpaceRequiredBox(scene, slideDir);   //wyznacza przestrzeń, w której będzie przesuwany zaznaczony obiekt

            Console.WriteLine("bb sceny:                " + sceneBB.minBB.x + " " + sceneBB.minBB.y + " " + sceneBB.minBB.z + " : " + sceneBB.maxBB.x + " " + sceneBB.maxBB.y + " " + sceneBB.maxBB.z);
            Console.WriteLine("space bb:                " + requiredSpaceBB.minBB.x + " " + requiredSpaceBB.minBB.y + " " + requiredSpaceBB.minBB.z + " : " + requiredSpaceBB.maxBB.x + " " + requiredSpaceBB.maxBB.y + " " + requiredSpaceBB.maxBB.z + " ");
            Console.WriteLine("bb przesuwanego obiektu: " + selectedObjectBB.minBB.x + " " + selectedObjectBB.minBB.y + " " + selectedObjectBB.minBB.z + " : " + selectedObjectBB.maxBB.x + " " + selectedObjectBB.maxBB.y + " " + selectedObjectBB.maxBB.z);

            if (otherSceneObjBB.Count > 0)
            {
                foreach (BoundingBox otherBB in otherSceneObjBB)
                {
                    Console.WriteLine("Kolizja sprawdzana z obiektem " + otherBB.minBB.x + " " + otherBB.minBB.y + " " + otherBB.minBB.z + " : " + otherBB.maxBB.x + " " + otherBB.maxBB.y + " " + otherBB.maxBB.z);
                    if (BBoxCollisionDetection(otherBB, requiredSpaceBB))//, slideDir))
                    {
                        colisionFound = true;
                        tmpDistance   = CalculateDistanceEZ(otherBB, selectedObjectBB, slideDir);
                        if (tmpDistance < minDistance)
                        {
                            minDistance = tmpDistance;
                        }
                        Console.WriteLine("Kolizja wykryta z obiektem " + otherBB.minBB.x + " " + otherBB.minBB.y + " " + otherBB.minBB.z + " : " + otherBB.maxBB.x + " " + otherBB.maxBB.y + " " + otherBB.maxBB.z);
                        if (BBoxCollisionDetection(otherBB, selectedObjectBB)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                        {
                            canTranslate = false;
                        }
                    }
                }

                if (colisionFound && canTranslate)
                {
                    Console.WriteLine("Min distance: " + minDistance);

                    if (slideDir.Equals("xyr")) //rzutowanie na płaszczyznę x y - przesunięcie w osi x
                    {
                        Transformations.Translate(scene, minDistance, 0, 0);
                    }

                    else if (slideDir.Equals("xyl"))
                    {
                        Transformations.Translate(scene, -minDistance, 0, 0);
                    }

                    else if (slideDir.Equals("yzu")) //rzutowanie na płaszczyznę y z - przesunięcie w osi y
                    {
                        Transformations.Translate(scene, 0, minDistance, 0);
                    }

                    else if (slideDir.Equals("yzd")) //rzutowanie na płaszczyznę y z - przesunięcie w osi y
                    {
                        Transformations.Translate(scene, 0, -minDistance, 0);
                    }

                    else if (slideDir.Equals("zxf")) //rzutowanie na płaszczyznę y z - przesunięcie w osi y
                    {
                        Transformations.Translate(scene, 0, 0, minDistance);
                    }

                    else //rzutowanie na płaszczyznę z x - przesunięcie w osi z zxb
                    {
                        Transformations.Translate(scene, 0, 0, -minDistance);
                    }
                }
                else if (colisionFound && !canTranslate)
                {
                    Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                }
                else
                {
                    Console.WriteLine("Brak kolizji");
                }
            }
            else
            {
                Console.WriteLine("Brak innych elementów ");
            }
            Clear();
        }