コード例 #1
0
        //działa na razie tylko na meshach które nie są zagnieżdżone w hierarchii, dodaje tylko te które nie są zaznaczone, ustawia bb sceny
        private static void SetBBoxes(Scene s)
        {
            float minx = float.MaxValue;
            float miny = float.MaxValue;
            float minz = float.MaxValue;
            float maxx = float.MinValue;
            float maxy = float.MinValue;
            float maxz = float.MinValue;
            float tmpx, tmpy, tmpz;
            BoundingBox tmpbb;

            foreach (HierarchyMesh mesh in s.hierarchy.objects)
            {
                tmpbb = new BoundingBox(s, mesh);

                if (!s.IsTriangleSelected(mesh.triangles[0]))
                {
                    //sprawdzamy, czy obiekt jest zaznaczony - jest kiedy jakikolwiek jego trójkąt jest na liście trójkatów zaznaczonych
                    //jeśli nie jest dodajemy jego bb do listy
                    otherSceneObjBB.Add(tmpbb);
                }
                //wyznaczamy skrajne punkty do wyznaczenia bb sceny
                tmpx = tmpbb.minBB.x;
                tmpy = tmpbb.minBB.y;
                tmpz = tmpbb.minBB.z;

                if (tmpx < minx)
                    minx = tmpx;
                if (tmpy < miny)
                    miny = tmpy;
                if (tmpz < minz)
                    minz = tmpz;

                tmpx = tmpbb.maxBB.x;
                tmpy = tmpbb.maxBB.y;
                tmpz = tmpbb.maxBB.z;

                if (tmpx > maxx)
                    maxx = tmpx;
                if (tmpy > maxy)
                    maxy = tmpy;
                if (tmpz > maxz)
                    maxz = tmpz;
            }

            Vector3D tmpmin = new Vector3D(minx, miny, minz);
            Vector3D tmpmax = new Vector3D(maxx, maxy, maxz);
            sceneBB = new BoundingBox(tmpmin, tmpmax);
        }
コード例 #2
0
        private static void SetSlidingObjectBBox(Scene s)
        {
            List<Triangle> selected = new List<Triangle>();

            foreach (HierarchyMesh selMesh in s.selTriangles)
            {
                foreach (uint triangleIdx in selMesh.triangles)
                {
                    if(s.IsTriangleSelected(triangleIdx))
                        selected.Add(s.triangles[(int)triangleIdx]);
                }

            }

            selectedObjectBB = new BoundingBox(s, selected);
        }
コード例 #3
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.objects)
                    {
                        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.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(sceneBB.maxBB.x, tmpbb.maxBB.y, tmpbb.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmpbb.minBB, 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, 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.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(tmpbb.maxBB.x, sceneBB.maxBB.y, tmpbb.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmpbb.minBB, 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.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(tmpbb.minBB.x, sceneBB.minBB.y, tmpbb.minBB.z);
                            requiredSpaceBB = new BoundingBox(tmp, tmpbb.maxBB);

                            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.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(tmpbb.minBB.x, tmpbb.minBB.y, sceneBB.minBB.z);
                            requiredSpaceBB = new BoundingBox(tmp, tmpbb.maxBB);

                            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.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(tmpbb.maxBB.x, tmpbb.maxBB.y, sceneBB.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmpbb.minBB, 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();
        }