WPF 3D: проверьте, может ли куб полностью содержать другой куб - PullRequest
0 голосов
/ 09 февраля 2011

Я работаю над Drop & Drop в 3D. Я создал трехмерные пространства (комнаты) со стенами (кубиками), которые выполняют роль заполнителей для отбрасываемых объектов (предположим, кубы поменьше).

Как мне выяснить:

если пользователь уронит объект по краям комнаты, тогда может ли комната полностью содержать этот объект?

То есть я не хочу, чтобы объекты были частично в комнате, а частично снаружи. В идеале я бы отменил операцию перетаскивания / переместил бы ее в точку, чтобы комната безопасно содержала этот объект.

У меня есть границы комнаты и объекта (ModelVisual3D.Content.Bounds) и точка, в которой объект был отброшен.

Я думаю, мне нужно было бы сделать какую-то математику, чтобы выяснить, находится ли объект в этой точке, тогда он будет полностью находиться в ограничивающей комнате.

идеи / мысли / указатель оценены.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2011

Чтобы упростить перетаскивание в 3D, вы можете внедрить (необязательную) систему привязки.

Чтобы проверить, содержит ли ящик другой блок, просто отметьте все углы блока.Проверьте каждый угол, чтобы увидеть, находится ли он «внутри» (или снаружи) граней другого блока.Если все углы внутри, коробка внутри.

Это будет работать для всех блоков, а не только для выровненных по оси блоков.

0 голосов
/ 29 апреля 2014

1. Точка А. (точка может быть углом внутреннего куба CubeIn)

Выберите одну точку из одного куба. (Я предполагаю, что мы должны проверить один куб полностью внутри другого. Значит, нет пересечения).

2. Проверьте A внутри CubeOut (Внешний куб)

3. если A внутри CubeOut, чем CubeIn полностью внутри CubeOut

если точка находится внутри второго куба, это означает, что первый куб находится внутри второго (почему? Потому что, если куб находится внутри другого куба. Таким образом, каждая точка на внутреннем кубе будет внутри внешнего куба)

4. Иначе CubeIn не внутри CubeOut

Это будет работать со всеми видами твердого тела (сфера, конус ...).

0 голосов
/ 10 февраля 2011

Для любого поля, которое выровнено по оси , что, по-видимому, имеет место, поскольку вы используете границы, простой тест может определить, включен ли блок, выровненный по оси, в другое.Учитывая следующий Box класс:

class Box 
{
  Vector3 minEdge;
  Vector3 maxEdge;
}

Вы можете легко иметь метод внутри Box, который проверяет включение:

bool IsInside(Box other)
{
  return maxEdge.X <= other.maxEdge.X &&
         maxEdge.Y <= other.maxEdge.Y &&
         maxEdge.Z <= other.maxEdge.Z &&
         minEdge.X >= other.minEdge.X &&
         minEdge.Y >= other.minEdge.Y &&
         minEdge.Z >= other.minEdge.Z;
}

Обратите внимание, что это не будет работать произвольноориентированные рамки, только по оси.

...