Возможно вы искали: 'Club Football: Celtic FC'

May 12 2025 01:26:46
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96030355
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18346
• Обзор The Walking ... 18789
• Обзор DMC: Devil M... 19864
• Обзор на игру Valk... 15867
• Обзор на игру Stars! 17754
• Обзор на Far Cry 3 17935
• Обзор на Resident ... 16012
• Обзор на Chivalry:... 17495
• Обзор на игру Kerb... 17970
• Обзор игры 007: Fr... 16604
Превью о играх
• Превью к игре Comp... 17946
• Превью о игре Mage... 14451
• Превью Incredible ... 14706
• Превью Firefall 13462
• Превью Dead Space 3 16325
• Превью о игре SimC... 14717
• Превью к игре Fuse 15432
• Превью Red Orche... 15532
• Превью Gothic 3 16334
• Превью Black & W... 17345
Главная » Статьи » Всё о XNA » Барицентрическая система

Барицентрическая система

Если перед нами стоит задача рассчитать движение тела, то сперва мы должны задать вопрос о размерах тела, т.к. многие задачи решаются очень просто, благодаря лишь тому, что мы можем не учитывать размер тел в силу его малости. Иначе решение может оказаться крайне сложным. Если в задаче размер тела можно не учитывать, то мы должны воспользоваться этой прекрасной возможность. В игре мы можем пренебрегать размерами так называемых "частиц". Частицы - это много малюсеньких обычно треугольников которые имитируют частицы пыли, дыма, огня, брызг и.т.п. издалека группа таких частиц может выглядеть соответственно как облако пыли, клубы дыма, всполохи огня, брызги... Существует целая наука о том как создавать такие эффекты.

Геометрически мы можем рассматривать отдельные частицы как точки (материальные точки). Материальные точки отличаются от обычных точек тем, что они тела. Так обычная точка может быть просто местом сбора юнитов на карте RTS, или временным вектором хранящим координаты пересечения некоторых линий. А материальная точка - это уже материальная вещь.(Хотя сам игровой мир не очень то материален, но я не буду развозить философию на эту тему). В большинстве случаев материальная точка должна инкапсулировать в себя помимо координат ещё массу и скорость. Так если масса это количество вещества, то в случае материальной точки всё вещество сосредоточенно в этой точке.

В итоге мы можем рассматривать тело в виде материальной точки лишь в некоторых задачах. Но может так получится, что сложную задачу возможно разбить на несколько мелких задач, некоторые из которых решаются без учёта размера тела. Тогда нам полезно будет представлять тело то в виде материальной точки, а то в виде какой-то формы.

Представьте как резиновая точка ударяется об стену и отскакивает обратно, а теперь представьте как резиновый мячик ударяется об стену. Будет ли разница? В принципе они будут двигаться одинаково. Но если мы просто возьмём шарик и забудем про его размеры, то он будет сталкиваться как точка, а его поверхность зачастую будет проходить сквозь стены. Эту проблему можно решить если разбить задачу на три

1) Расчёт движения мячика
2) Обнаружение столкновения мячика со стенами
3) Расчёт взаимодействия мячика со стеной

Заметим что только во втором пункте нам нужно учитывать размер и форму мячика, а в первом и третьем мы можем считать его материальной точкой. Значит полезно всегда иметь ввиду две модели тела одновременно. Остаётся только вопрос: "где нам нужно выбрать такую точку для тела?" Очевидно что в центре тела!
Это не совсем так. Когда мы захотим учесть вращение тела, могут появится проблемы, если мы не правильно её выберем. Я говорил ранее, что в материальной точке сосредоточенна вся масса тела. Поэтому для тела мы должны выбирать такую точку в которой эквивалентно поместилась бы вся масса. Короче такой точкой является центр масс или центр тяжести*. Как рассчитать центр тяжести?
Возьмём некоторое большое тело и мысленно разрежем его на мелкие части, например молекулы. Каждую молекулу в силу малости можем считать материальной точкой. Рассмотрим две молекулы. Пусть положение молекулы <1> определяется вектором V1, а молекулы <2> вектором V2. Тогда вектор центра тяжести для этих двух молекул считается по формуле: 

Center = (V1 + V2 ) / 2;


Т.е. это как раз середина между ними. Но если молекулы обладают разными массами M1 и M2, то центр тяжести должен находится чуть ближе к более тяжёлой молекуле и считается по формуле с учётом массы: 

Center = (V1 * M1 + V2 * M2) / (M1 + M2);

Теперь мы можем рассматривать эти две молекулы как материальную точку с массой MC = M1 + M2 и вектором положения Center. Если взять ещё молекулу <3> с массой M3 и вектором положения V3. Тогда центр для молекулы и материальной точке двух молекул.

Center2 = (Center * MC + V3 * M3) / (MC + M3);

Это по сути центр масс для всех трёх молекул. Если подставить в эту формулу формулу расчёта вектора Center и массы M3, то получим:

Center2 = (V1 * M1 + V2 * M2 + V3 * M3) / (M1 + M2 + M3);

Продолжая рассуждения аналогичным образом мы приходим к общей формуле:

MainCenter = (V1 * M1 + V2 * M2 + V3 * M3 + V4 * M4 + ....) / (M1 + M2 + M3 + M4...);

Эта формула позволяет легко посчитать положение центра масс для любого количества материальных точек. Другая проблема в том, что у нас в игре тело состоит не из молекул. Игровые тела обычно цельные, и такая формула неудобна. В таких случаях суммирование заменяют интегрированием. Но увлекаться с этим не стоит. Очевидно что для симметричных тел центр тяжести находится в центре, потому что для каждой молекулы в таком теле найдётся другая симметрично расположенная такой же массы, и для таких пар центр масс будет в центре значит и суммарный тоже в центре. Если же у вас есть несимметричное тело, то тоже не стоит заморачиваться, можно выбрать центр тяжести на глаз ведь принцип его рачёта понятен. Зачем же тогда я выводил эту формулу, если всё равно всё можно делать на глаз?

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

Так формула для расчёта центра масс оказалась достаточно полезной. Но Архимед выжал из неё ещё больше пользы. Эта формула открыла путь для целого метода исследования в различных разделах физики и математики. Этот метод называется барицентрическим. "Бари" - тяжёлый(греч.), "Барицентр" - центр тяжести.

Пусть у нас есть две материальные точки по имени "Рак" и "Щука" одна с координатами (0 , 0), а другая (10 , 0) массой по 1кг каждая. Очевидно, что центр тяжести для них находится посередине (5, 0).



1
2
3
4
5
6
float Масса_Рака = 1;
float Масса_Щуки = 1;
Vector2 Рак = new Vector2(0, 0);
Vector2 Щука = new Vector2(10, 0);
Vector2 Baricenter = (Рак * Масса_Рака + Щука * Масса_Щуки) / (Масса_Рака + Масса_Щуки);
 

 


Если увеличить массу Щуки до 3кг, центр тяжести сместится в сторону Щуки и станет (0, 7.5). Если ещё увеличить до 7кг то центр масс сместится в точку (0, 8.75). Если бы мы делали то де самое с Раком то центр тяжести смещался бы в его сторону. Когда масса первой точки станет равна нулю - то центр тяжести полностью совпадёт со второй точкой и наоборот. Это похоже на игру в перетягивание каната, и эта игра станет интереснее если к ней присоединится третий игрок.



1
2
3
4
float Масса_Лебедя = 1;
Vector2 Лебедь = new Vector2(5 ,5); 
Vector2 Baricenter = (Рак * Масса_Рака + Щука * Масса_Щуки + Лебедь * Масса_Лебедя) / 
(Масса_Рака + Масса_Щуки + Масса_Лебедя);

 


Теперь воз будет находится где-то внутри треугольника. Если их массы по килограмму то центр тяжести будет приблизительно (5, 1.66). Видно что третья точка влияет на его положение вдоль Y. Пробуя различные комбинации масс мы можем добиться расположения центра тяжести в любой точке в этом треугольнике, причём для разных комбинаций масс мы будем получать разные точки. Стоит однако заметить, что комбинации (1,1,1) и (5,5,5) равносильны, и вообще равносильны все комбинации с одинаковым процентным соотношением масс. Поэтому смысл имеют не сами массы, а их доля от общей массы. Это называется нормированные массы.

Так имея три базовые точки, и задавая для них массы мы можем задавать четвёртую точку в пространстве. т.е. мы получили новую систему координат. Она называется Барицентрической системой координат. И мы можем задать в ней вектор.

1
2
float Sum = Масса_Рака + Масса_Щуки + Масса_Лебедя;
Vector3 BaricentricVector = new Vector3(Масса_Рака / Sum, Масса_Щуки / Sum, Масса_Лебедя / Sum);

 


Подобно тому, как при помощи матриц мы можем переходить из одной декартовой системы координат в другую, так же мы при помощи трёх векторов можем переходить из барицентрической системы в декартовую и обратно. Причём переход обратно сделать легко он делается по выведенной нами формуле. Например барицентрический вектор (0.25 ,0.25 , 0.5) в декартовой системе соответствует вектору (5, 2.5). Но переход из декартовой в барицентрическую не так прост, но о нём чуть позже.

Барицентрические координаты непривычны для обычных людей. Они интересны нам потому, как обладают некоторыми замечательными свойствами. Если мы положим Массу_Лебедя равной ноль, то воз будет находится на прямой между Раком и Щукой, а если Массу_Рака установим равной ноль, то воз будет находится на прямой соединяющей Лебедя и Щуку, и аналогично с Щукой. Если мы сделаем Лебедю отрицательную массу, то воз будет находится вне треугольника причём за стороной треугольника напротив Лебедя. Рак и Щука - аналогично. Значит с помощью отрицательных масс мы можем задать не только координаты точек внутри треугольника, но и вне.
Тогда допустим у нас есть треугольник из трёх точек, и ещё одна произвольная точка. И мы хотим знать находится ли эта точка в треугольнике? Нам нужно лишь перевести координаты этой точки в барицентрическую систему этого треугольника и сравнить полученные координаты с нулём. Если все они больше нуля то точка лежит в треугольнике, если хоть одна координата меньше то не лежит. И ещё так можно проверить по какую именно сторону от треугольника лежит точка, и лежит ли она на какой-либо из сторон треугольника. Если точка попадает в треугольник то можно узнать к какой из вершин или сторон она ближе. Или даже расстояние до сторон. Вот я перечислил некоторые основные возможности. А пользоваться ими будем в следующих статьях, здесь же рассмотрим переход в барицентрическую систему и создадим класс отвечающий за это.

Сперва хочу обратить внимание, что для построения барицентрической системы в плоскости нужно три точки, ни больше ни меньше. При этом они не должны лежать на одной прямой. Барицентрическую систему можно построить и в 3D, для этого нужны 4точки, не лежащие в одной плоскости. В 2D под тремя точками подразумевается треугольник, в 3D под четырьмя точками подразумевается тетраэдр. Теперь напишем переход из барицентрической системы в декартовую для 2D, это равносильно расчёту центру масс:

C = V1 * m1 + V2 * m2 + V3 * m3;

Делить на сумму масс не нужно т.к. массы отнормированны(уже поделены). Это уравнение дано в векторном виде, перепишем его отдельно по координатам:

C.x = V1.x * m1 + V2.x * m2 + V3.x * m3;
C.y = V1.y * m1 + V2.y * m2 + V3.y * m3;


Пусть у нас заданна в декартовой системе точка С и треугольник V1-V2-V3, Осталось только узнать какие же массы нужно положить в вершины треугольника, чтобы их центр масс лежал в точку C. Способ решения и будет способом перевода в барицентрическую систему. 
Во первых заметим что массы должны быть нормированными т.е. в долях. Значит сумма всех масс: m1 + m2 + m3 = 1; Тогда одну из масс можно выразить из других. m1 = 1 - m2 - m3; Таким образом задача упростилась ведь найти нужно только две неизвестные величины, а третья считается их них:

C.x = V1.x * (1 - m2 - m3) + V2.x * m2 + V3.x * m3;
C.y = V1.y * (1 - m2 - m3) + V2.y * m2 + V3.y * m3;


Отсюда получаем:

C.x = V1.x + (V2.x - V1.x) * m2 + (V3.x - V1.x)* m3;
C.y = V1.y + (V2.y - V1.y) * m2 + (V3.y - V1.y)* m3;


И ещё:

(C.x - V1.x) = (V2.x - V1.x) * m2 + (V3.x - V1.x)* m3;
(C.y - V1.y) = (V2.y - V1.y) * m2 + (V3.y - V1.y)* m3;


Получилась обычная система уравнений вида:

a = b * x + c * y;
d = e * x + f * y;


Где a,b,c,d,e,f - известные числа. Такая система легко решается путём сложения и вычитания уравнений. Но есть опасность что некоторые из чисел a,b,c,d,e,f это нужно проверять и выбирать путь решения. Но я лучше решу её методом Крамера который не требует такой проверки и он очень универсален, мы также применим его для 3D. В тонкости метода вникать не буду, и не буду объяснять что такое матрица и определитель. Узнайте об этом в учебнике по линейной алгебре. Если Вы действительно хотели бы это узнать то лучше прочитайте об этом сейчас т.к. далее я предоставляю возможность закрепить полученное новое знание на неплохом примере. Это универсальное знание может Вам пригодится, например если Вы захотите делать сплайны или кривые Безье. Если знать не хотите то просто скопируйте мой код.

class Baricentric2D
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//Класс включает вершины треугольника V1, V2, V3 
//Он позволяет преобразовывать вектор из декартовых 
//в барицентрические координаты и обратно
class Baricentric2D
{
    public Vector2 V1, V2, V3; //Базисные точки, вершины треугольника 
 
    /// 
    /// Конструктор барицентрического класса 
    /// 
    /// Первая вершина базисного треугольника
    /// Вторая вершина базисного треугольника
    /// Третья вершина базисного треугольника
    public Baricentric2D(Vector2 V1, Vector2 V2, Vector2 V3)
    {
        this.V1 = V1;
        this.V2 = V2;
        this.V3 = V3;
    }
 
    /// 
    /// Трансформирует декартовый вектор в барицентрический
    /// 
    /// Вектор координаты которой преобразовываются
    /// Преобразованный вектор
    public Vector3 Transformation(Vector2 Value)
    {
        float m1, m2, m3; //результативные массы
 
        float MainDet, Det; //Переменные для хранения детерминанты(определителя)
 
        //Матрица размером 2x3
        float M11, M12, M13;
        float M21, M22, M23;
 
        //Заполнение матрицы коэффициентами уравнений
        //(Только вот столбец ответов первый, а не последний)
        //(C.x - V1.x) = (V2.x - V1.x) * m2 + (V3.x - V1.x) * m3;
        //(C.y - V1.y) = (V2.y - V1.y) * m2 + (V3.y - V1.y) * m3;
        M11 = (Value.X - V1.X); M12 = (V2.X - V1.X); M13 = (V3.X - V1.X);
        M21 = (Value.Y - V1.Y); M22 = (V2.Y - V1.Y); M23 = (V3.Y - V1.Y);
 
        //Главный определитель
        MainDet = M12 * M23 - M22 * M13;
 
        //Определитель для массы m2
        Det = M11 * M23 - M21 * M13;
        //Значение массы m2
        m2 = Det / MainDet;
 
        //Определитель для массы m3
        Det = M12 * M21 - M11 * M22;
        //Значение массы m3
        m3 = Det / MainDet;
 
        //Масса m1
        m1 = 1 - m2 - m3;
 
        //результат
        return new Vector3(m1, m2, m3);
    }
 
    /// 
    /// Обратное преобразование по сути нахождение центра масс треугольника
    /// 
    /// Масса первой вершины
    /// Масса второй вершины
    /// Масса третьей вершины
    /// Вектор в декартовой системе координат
    public Vector2 ReTransformation(float m1, float m2, float m3)
    {
        return (this.V1 * m1 + this.V2 * m2 + this.V3 * m3) / (m1 + m2 + m3);
    }
}

 


Стоит заметить, что метод обратного преобразования адаптирован принимать любые массы не обязательно нормированные.
Решим теперь эту задачу в 3D. Для этого нужно решить систему уравнений:

(C.x - V1.x) = (V2.x - V1.x) * m2 + (V3.x - V1.x)* m3 + (V4.x - V1.x) * m4;
(C.y - V1.y) = (V2.y - V1.y) * m2 + (V3.y - V1.y)* m3 + (V4.x - V1.x) * m4;
(C.z - V1.z) = (V2.z - V1.z) * m2 + (V3.z - V1.z)* m3 + (V4.z - V1.z) * m4;

class Baricentric3D
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//Класс включает вершины тетраэдра V1, V2, V3 
//Он позволяет преобразовывать вектор из декартовых 
//в барицентрические координаты и обратно
class Baricentric3D
{
    public Vector3 V1, V2, V3, V4; //Базисные точки, вершины тетраэдра
 
    /// 
    /// Конструктор барицентрического класса 
    /// 
    /// Первая вершина базисного тетраэдра
    /// Вторая вершина базисного тетраэдра
    /// Третья вершина базисного тетраэдра
    /// Четвёртая вершина базисного тетраэдра
    public Baricentric3D(Vector3 V1, Vector3 V2, Vector3 V3, Vector3 V4)
    {
        this.V1 = V1;
        this.V2 = V2;
        this.V3 = V3;
        this.V4 = V4;
    }
 
    /// 
    /// Трансформирует декартовый вектор в барицентрический
    /// 
    /// Вектор координаты которой преобразовываются
    /// Преобразованный вектор
    public Vector4 Transformation(Vector3 Value)
    {
        float m1, m2, m3, m4; //результативные массы
 
        float MainDet, Det; //Переменные для хранения детерминанты(определителя)
 
        //Матрица размером 4x4, но используется лишь как 3х4
        //Сразу заполняется коэффицентами уравнений
        //(Только вот столбец ответов первый, а не последний)
        //(C.x - V1.x) = (V2.x - V1.x) * m2 + (V3.x - V1.x) * m3 + (V4.x - V1.x) * m4;
        //(C.y - V1.y) = (V2.y - V1.y) * m2 + (V3.y - V1.y) * m3 + (V4.x - V1.x) * m4;
        //(C.z - V1.z) = (V2.z - V1.z) * m2 + (V3.z - V1.z) * m3 + (V4.z - V1.z) * m4;
        Matrix Mx = new Matrix(
            V2.X - V1.X, V3.X - V1.X, V4.X - V1.X, Value.X - V1.X,
            V2.Y - V1.Y, V3.Y - V1.Y, V4.Y - V1.Y, Value.Y - V1.Y,
            V2.Z - V1.Z, V3.Z - V1.Z, V4.Z - V1.Z, Value.Z - V1.Z,
            0, 0, 0, 0
            );
 
        //Главный определитель
        MainDet =
            Mx.M11 * Mx.M22 * Mx.M33 +
            Mx.M12 * Mx.M23 * Mx.M31 +
            Mx.M13 * Mx.M21 * Mx.M32 -
            Mx.M13 * Mx.M22 * Mx.M31 -
            Mx.M12 * Mx.M21 * Mx.M33 -
            Mx.M11 * Mx.M23 * Mx.M32;
 
        //Определитель для массы m2
        Det =
            Mx.M14 * Mx.M22 * Mx.M33 +
            Mx.M12 * Mx.M23 * Mx.M34 +
            Mx.M13 * Mx.M24 * Mx.M32 -
            Mx.M13 * Mx.M22 * Mx.M34 -
            Mx.M12 * Mx.M24 * Mx.M33 -
            Mx.M14 * Mx.M23 * Mx.M32;
        //Значение массы m2
        m2 = Det / MainDet;
 
        //Определитель для массы m3
        Det =
            Mx.M11 * Mx.M24 * Mx.M33 +
            Mx.M14 * Mx.M23 * Mx.M31 +
            Mx.M13 * Mx.M21 * Mx.M34 -
            Mx.M13 * Mx.M24 * Mx.M31 -
            Mx.M14 * Mx.M21 * Mx.M33 -
            Mx.M11 * Mx.M23 * Mx.M34;
        //Значение массы m3
        m3 = Det / MainDet;
 
        //Определитель для массы m4
        Det =
            Mx.M11 * Mx.M22 * Mx.M34 +
            Mx.M12 * Mx.M24 * Mx.M31 +
            Mx.M14 * Mx.M21 * Mx.M32 -
            Mx.M14 * Mx.M22 * Mx.M31 -
            Mx.M12 * Mx.M21 * Mx.M34 -
            Mx.M11 * Mx.M24 * Mx.M32;
        //Значение массы m4
        m4 = Det / MainDet;
 
        //Значение массы m1
        m1 = 1 - m2 - m3 - m4;
 
        //результат
        return new Vector4(m1, m2, m3, m4);
    }
 
    /// 
    /// Обратное преобразование по сути нахождение центра масс тетраэдра
    /// 
    /// Масса первой вершины
    /// Масса второй вершины
    /// Масса третьей вершины
    /// Масса четвёртой вершины
    /// Вектор в декартовой системе координат
    public Vector3 ReTransformation(float m1, float m2, float m3, float m4)
    {
        return (this.V1 * m1 + this.V2 * m2 + this.V3 * m3 + this.V4 * m4) / (m1 + m2 + m3 + m4);
    }
}

 



Теперь у нас есть методы по преобразованию в барицентрические координаты. В следующей статье будем ими пользоваться.

(сноска)
* - Центр масс и центр тяжести не совсем одно и тоже. и если Вы занимаетесь научным моделированием движения в космосе. то лучше забудте эту статью.
1738 Прочтений •  [Барицентрическая система] [08.08.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Барицентрическая система Ukraine Vova 08.08.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка