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(); }
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(); }