Вторник, 04 Октября 2022, 04:20

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Кости | Суставы (Перемножение матриц костей)
Кости | Суставы
RDeviceДата: Четверг, 13 Августа 2015, 00:11 | Сообщение # 1
был не раз
Сейчас нет на сайте
Очередной вопрос, связанный со скелетной анимацией.
По факту, я почти закончил её делать, но возникла главная, на мой взгляд, проблема:
Получение финальной матрицы.
Использую SMD, DirectX 11.
Шейдеры написаны правильно.
Структура Joint и Vertex такова:

Код

struct Joint
{
  int Parent; //Родитель этого сустава
  Vector Position; //Vector 3
  Vector Rotation; //Vector 3
  Matrix Transform; //Не финальная матрица, держу, пока что, просто так
};
struct Vertex
{
  static UINT Stride; //DX Причуда
  static UINT Offset; //DX Причуда 2
  Vector Position; //Vector 3
  Vector TexCoord; //Vector 4, Z и W - Индекс кости и её вес(SMD использует до 5 костей, как я понял)
  Vector Normal; //Vector 3
  Vector Joint; //Vector 4, Индексы костей
  Vector Bias; //Vector 4, Весы
};


После загрузки модели имею:
Суставы (Joint, всё кроме Transform заполнено данными),
Вершины (всё заполнено данными).
Это всё, пока я хочу только управлять вершинами модели,
данных о анимации нет.

Так вот, мне тупо нужна финальная матрица.
(Без кватернионов.
Если предоставите формулы, то, если не затруднит,
предоставьте определения ко всем членам формулы)
gunsoyДата: Вторник, 18 Августа 2015, 18:37 | Сообщение # 2
был не раз
Сейчас нет на сайте
Я перемножаю так



Тут код шейдера на 8 костей-весов. Для 4 костей-весов нужно удалить из кода Bones2 и Weight2

Только у меня без нормалей.


Сообщение отредактировал gunsoy - Вторник, 18 Августа 2015, 18:40
RDeviceДата: Среда, 09 Сентября 2015, 23:02 | Сообщение # 3
был не раз
Сейчас нет на сайте
Спасибо, но код у меня примерно такой же (т.к. у меня формат SMD, то я использую 5 весов), мне интересно как вы получаете:
Код

uniform mat4 bind_shape_matrix;
uniform mat4 joints_matrices[100];
uniform mat4 joints_inv_matrices[100];

Добавлено (09 сентября 2015, 23:02)
---------------------------------------------
никто не поможет?
я ж почти разобрался, мне бы знать как умножать кость на позицию, поясню
если умножаю таким образом:

Код

for (int i = 0; i < Кол-во_Костей; i++)
     Финальная_Матрица[i] = Кости[i].Просчитанный_Поворот *  
     (Кости[i].Parent == -1 ?  
       Matrix::Identity() : Кости[Кости[i].Parent].Просчитанный_Поворот);

//Поворот кости по глобальным координатам * Родительскую ротацию, если возможно


Псевдо-код выше показывает такую-же картинку, как и Blender(Если не у одной кости нет позиции(в файле позиции по нулям поставил)), но если сделать следующее, то всё печально,
какая-то ересь получается...

Код

for (int i = 0; i < Кол-во_Костей; i++)
     Финальная_Матрица[i] = Кости[i].Просчитанный_Поворот_Умноженный_На_Позицию *  
     (Кости[i].Parent == -1 ?  
      Matrix::Identity() : Кости[Кости[i].Parent].Просчитанный_Поворот_Умноженный_На_Позицию);

//(Поворот кости по глобальным координатам * Позицию этой кости по локальным коордам) * (Поворот родительской кости по глобальным координатам * Позицию родительской кости по локальным коордам), если возможно
Форум игроделов » Программирование » C/C++ » Кости | Суставы (Перемножение матриц костей)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2022 Рейтинг