Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.08.2026, 16:34
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 91
Репутация: 10
Плохо как привязать модель к костям

Здравствуйте! у меня есть модель smd и obj. к костям smd можно привязать
freeform или GLACTOR2 (obj)

Код:
GLActor1.LoadFromFile('model\model2.smd');
GLFreeForm1.LoadFromFile('model\hair1.obj');
for i := 0 to 66  do begin
memo1.Lines.Add(GLActor1.Skeleton.BoneByID(i).Name);
end;
выдает ошибку:
Код:
GLFreeForm1.Parent:=(GLActor1.Skeleton.BoneByName('Name:bone1');
спасибо!
bones.jpg
Ответить с цитированием
  #2  
Старый 22.08.2026, 19:00
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 91
Репутация: 10
Злость тупик

кто нибудь сталкивался с этим?
Ответить с цитированием
  #3  
Старый 24.08.2026, 07:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,116
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А какую ошибку то выдает?

Скорее всего, что-то типа "объект не найден".
то, что выдает твой код в Memo1, не соответсвует имени, которое ты ищешь. Ну и префикс "Name:", возможно, не нужен.
Ответить с цитированием
  #4  
Старый 24.08.2026, 09:41
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 91
Репутация: 10
Стрелка

Код:
 m:=GLActor1.Skeleton.BoneByName('mixamorig:HeadTop_End').GlobalMatrix;
GLFreeForm1.SetMatrix(MatrixMultiply(m, GLActor1.AbsoluteMatrix));
проблема не в имени костей. проблема что GLFreeForm1 стоит на месте даже не шевелится когда его прикручиваешь к ноге или к голове.

да если двигать актера:
Код:
if (IsKeyDown(vk_left)) then glactor1.Move(deltatime*50);
  if (IsKeyDown(vk_right)) then glactor1.Move(deltatime*-50);
то GLFreeForm1 тоже двигается, но у меня Анимированный smd с костями. и я бы хотел чтобы GLFreeForm1 повторял движение анимации (костей)
Ответить с цитированием
  #5  
Старый 24.08.2026, 10:36
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 91
Репутация: 10
Сообщение движение

вернее двигался за костью
Ответить с цитированием
  #6  
Старый 25.08.2026, 08:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,116
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Хм, возможно ты не установил что-то типа подписки на обновление "родительского" объекта. Т.е. GLFreeForm1 просто не знает, что модель (кость) изменила положение. Возможно, та привязка, которую ты сделал, привязывает к модели в целом, а не к конкретной части, которая может двигаться сама.
Ответить с цитированием
  #7  
Старый 25.08.2026, 08:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,116
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот что ИИ подсказывает:

this is a common GLScene gotcha when attaching objects to bones in an animated skeleton.

What’s happening in your case is:

Setting GLFreeForm1.Parent := Bone.Dummy works for static positioning or when the whole model moves.
But GLScene’s skeleton animation updates bone transforms internally — it doesn’t automatically update the Dummy or Parent hierarchy for attached objects.
So your FreeForm stays fixed relative to the actor’s origin unless you manually update it each frame.
✅ Correct way: Update the FreeForm’s transform every frame
You need to read the bone’s transformation matrix after animation is applied and apply it to your object.

Код:
procedure TForm1.GLSceneViewer1BeforeRender(Sender: TObject);
var
  Bone: TGLSkeletonBone;
  Mat: TMatrix;
begin
  Bone := GLActor1.Skeleton.BoneByName('RightHand'); // your bone name
  if Assigned(Bone) then
  begin
    // Get the bone's absolute transformation in world space
    Mat := Bone.GlobalMatrix;

    // Apply it to the FreeForm
    GLFreeForm1.Matrix := Mat;
  end;
end;
Ответить с цитированием
  #8  
Старый 25.08.2026, 10:45
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 91
Репутация: 10
Хорошо установка

попробую переустановить сегодня.
Код:
    // Apply it to the FreeForm
 GLFreeForm1.Matrix.X := Mat.X;
 GLFreeForm1.Matrix.Y := Mat.Y;
 GLFreeForm1.Matrix.X := Mat.Z;
или будет ругаться
Ответить с цитированием
  #9  
Старый 26.08.2026, 16:59
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 91
Репутация: 10
Стрелка

Видео не получилось
Ответить с цитированием
  #10  
Старый 26.08.2026, 18:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,116
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

попробуй ИИ попросить помочь.
например, Copilot прямо из браузера довольно неплох.

Просто тут надо иметь весь код для отладки. Копайлоту не обязательно давать весь код, только ключевые куски, но для отладки нужно-то все...
Ответить с цитированием
  #11  
Старый 26.08.2026, 19:09
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 91
Репутация: 10
Лампочка ok

да, согласен! модели не хватает... код = а он и есть весь вверху.
я думаю, что нашел решение:
Код:
memo1.Lines.Add(FloatToStr(GLActor1.Skeleton.BoneByID(64).GlobalMatrix.V[3].X));
осталось кости перебрать.
Код:
GLActor1.Position.X := GLActor1.Skeleton.BoneByID(63).GlobalMatrix.V[3].X;

Последний раз редактировалось leon2009, 27.08.2026 в 02:46.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:51.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2026