Московский государственный университет путей сообщения
Опубликован: 01.06.2007 | Доступ: свободный | Студентов: 1903 / 101 | Оценка: 4.38 / 3.75 | Длительность: 22:59:00
ISBN: 978-5-9556-0094-9
Специальности: Программист
Лекция 15:

Основы "живого" моделирования

15.6. Сокращение вязкого тела с "выпучиванием"

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

Пусть, как и прежде, xj, yj, zj — составляющие адрес координаты текущей клетки вязкого объекта, для которого выше сформированы выражения (15.8) для определения адреса переноса. Дополним их указанной перпендикулярной составляющей (рис. 15.5).

Сокращение  тела с "выпучиванием"

Рис. 15.5. Сокращение тела с "выпучиванием"

По (15.7), подставив вместо xj0, yj0, zj0 значение найденной по (15.8) точки переноса (xj пер, y j пер , zj пер) , найдем kmin и, невзирая на его значение, найдем проекцию (xj0пер, yj0пер, zj0пер) на мышцу или ее продолжение влево или вправо.

(Заметим, что уравнения (1) при 0 <= k <= 1 определяют собственно мышцу, другие значения k \in  [-\infty , 0], k \in  [0, \infty ] определяют точки прямой, которой принадлежит отрезокмышца.)

Запишем систему параметрических уравнений прямой, проходящей через точки (xj пер, y j пер , zj пер) и (xj пер0, yj пер0, zj пер0) :

\begin{array}{l}
      x = m(x_{j пер}^0 - x_{j пер}) + x_{j пер}\\
      y = m(y_{j пер}^0 - y_{j пер}) + y_{j пер} \\
      z = m(z_{j пер}^0 - z_{j пер}) + z_{j пер}.
      \end{array} ( 15.9)

Задав малое приращение \Delta m > 0, зависящее от r2пер = (xj пер0 - xj)2 + (yj пер0 - yj)2 + (zj пер0 - zj пер)2 , и приняв m        = 1 +\Delta m, получим окончательно точку переноса (xj пер*, yj пер*, zj пер*) , отстоящую от точки переноса, найденной по (15.8), и смещенную в перпендикулярном направлении от мышцы.

Эмпирическую зависимость коэффициента смещения \Delta m от указанного выше расстояния можно выбрать как

\Delta m = l\rho
      \left
      (1 - \frac{r^2_{пер}}{R^2}
      \right ). ( 15.10)

Тогда из (9) находим

\begin{array}{l}
        x^*_{j пер} = (1 + \Delta m)(x^0_{j пер} - x_{j пер})+ x_{j пер}\\
        y^*_{j пер} = (1 + \Delta m)(y^0_{j пер} - y_{j пер})+ y_{j пер}\\
        z^*_{j пер} = (1 + \Delta m)(z^0_{j пер} - z_{j пер})+ z_{j пер}.
      \end{array} ( 15.11)

Таким образом, сокращая мышцу АВ, показанную на рис. 15.2, можно, например, изобразить то подобие улыбки, которая обозначена пунктиром. Введение других мышц, например, А1В1 под нижней губой, может значительно усилить правдоподобие улыбки.

15.7. Шарнирно-мышечное соединение

Координаты шарнира задаются условно (ячейка не занимается) точкой O(x0, y0, z0) внутри объекта (рис. 15.6). Мышца АВ связывает лучи (элементы скелета), исходящие из точки О. Сокращение мышцы должно вызывать видимость движений, характерных при ходьбе, движении рук и т.д. Это требует таких деформаций объектов, при которых его клетки, облегающие эти лучи, или только клетки оболочки, несущие в себе данные лучи, сближаются вместе с лучами, не приводя к дополнительной деформации.

Деформация объекта вокруг шарнира

Рис. 15.6. Деформация объекта вокруг шарнира

Практический интерес представляет случай, когда неподвижная точка мышцы совпадает с одним из ее концов. Это соответствует направлению движения конечности относительно неподвижного тела. (Хотя следование известным соотношениям о количестве движения или третьего закона механики не представляет трудностей.)

По аналогии с (15.1), луч ОА описывается параметрической системой уравнений

\begin{array}{l}
        x = k(x_{1} - x_{0}) + x_{0}\\
        y = k(y_{1} - y_{0}) + y_{0}\\
        z = k(z_{1} - z_{0}) + z_{0}. \end{array} ( 15.12)

Если 0 <= k <= 1, то уравнения отображают отрезок ОА. Нас же интересует вся прямая, исходящая из точки О.

Отобразим сокращение мышцы переносом клетки А в клетку А' (x1', y1', z1' ), в упрощенной форме воспользовавшись (15.2) и (15.3). Этим установим новое положение ОА' луча ОА.

Уравнения этого луча имеют вид

\begin{array}{l}
      x = k'(x_{1}' - x_{0}) + x_{0}\\
      y = k'(y_{1}' - y_{0}) + y_{0} \\
      z = k'(z_{1}' - z_{0}) + z_{0}. \end{array} ( 15.13)

Если 0 <= k' <= 1, то уравнения отображают отрезок ОА'. Однако точка А' не отображает факт вращения луча ОА вокруг точки О. При этом вращении точка А должна переместиться в точку А1 , отстоящую от О на расстояние, равное длине отрезка ОА. Найдем координаты этой точки на луче ОА' из соотношения

(x11 - x0)2 + (y11 - y0)2 + (z11 - z0)2 = r2 = (x1 - x0)2 + (y1 - y0)2 + (z1 - z0)2.

В параметрической форме представления (12) точке (x11, y11, z11) соответствует некоторое значение k1' параметра. Подставим вместо координат этой точки их параметрическое представление:

(k1')2((x1' - x0)2 + (y1' - y0 )2 + (z1' - z0)2) = r2 .

Откуда

k_{1}' = \frac{r}{\sqrt{(x_1'-x_0)^2+(y_1'-y_0)^2+(z_1'-z_0)^2}} ( 15.14)

Очевидно, k1' > 0 . Таким образом, точка А1 переноса конца А мышцы найдена.

Для синхронных действий при переносе всех клеток объекта, подлежащих перемещению вокруг шарнира, запишем уравнения луча ОА1 в зависимости от того же параметра k, определяющего положение (15.12) луча ОА

\begin{array}{l}
      x = k(x_{11} - x_{0}) + x_{0}\\
      y = k(y_{11} - y_{0}) + y_{0}\\
      z = k(z_{11} - z_{0}) + z_{0}.
      \end{array} ( 15.15)

Пусть (xj, yj, zj) — точка (клетка), подлежащая переносу, в соответствии с сокращением мышцы, в точку с тем же радиусом относительно точки О, но с исключением других деформаций объекта. Чтобы найти координаты (xj(OA), yj(OA), zj(OA)) проекции этой точки на луч ОА, решим задачу минимизации расстояния между этой точкой и лучом ОА, описанным системой (15.12):

(xj - k(x1 - x0)- x0)2 + (yj - k(y1 - y0) - y0)2 + (zj - k(z1 - z0) - z0)2 -> min.

Приравняв производную по k нулю, получим

(xj - k(x1 - x0) - x0)(x1 - x0) + (yj - k(y1 - y0) - y0 )(y1 - y0) + (zj - k(z1 - z0) - z0)(z1 - z0) = 0.

Отсюда

k_{(min)} = \frac{(x_j-x_0) (x_1-x_0)+ (y_j-y_0) (y_1-y_0)+
      (z_j-z_0) (z_1-z_0)}{(x_1-x_0)^2+ (y_1-y_0)^2+ (z_1-z_0)^2 }. ( 15.16)

Подставим (15.16) в (15.12) и найдем координаты (xj(OA), yj(OA), zj(OA)) искомой проекции.

Вычислим разности координат точки (xj, yj, zj) и найденной ее проекции на луч ОА, определяющие смещение этой точки:

\begin{array}{l}
      \Delta x_{j} = x_{j} - x_{j}^{(OA)}\\
      \Delta y_{j} = y_{j} - y_{j}^{(OA)}\\
      \Delta z_{j} = z_{j} - z_{j}^{(OA)}
      \end{array} ( 15.17)

Подстановкой (15.15) в (15.14) найдем координаты (xj(OA1), yjOA1), zj(OA1)) "образа" точки (xj(OA), yjOA), zj(OA)) при повороте луча. Тогда координаты x j пер , yj пер, zj пер переноса точки (xj, yj, zj) отыскиваются так:

\begin{array}{l}
      x_{j пер} = x^{(OA1)}_{j} + \Delta x_{j}\\
      y_{j пер} = y^{(OA1)}_{j} + \Delta y_{j} \\
      z_{j пер} = z^{(OA1)}_{j} + \Delta z_{j}.\end{array} ( 15.18)

Организовав цикл по j - по всем точкам объекта (или оболочки) в окрестности луча ОА, выполним требуемую имитацию движения.

Эльвира Герейханова
Эльвира Герейханова

Раньше это можно было зделать просто нажав на тест и посмотреть результаты а сейчас никак

Елена Лобынцева
Елена Лобынцева
Помогите разобраться как можно подобрать НС для распознавания внутренней области выпуклого многоугольника?