![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! у меня есть модель 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
|
|||
|
|||
|
кто нибудь сталкивался с этим?
![]() |
|
#3
|
|||
|
|||
|
А какую ошибку то выдает?
Скорее всего, что-то типа "объект не найден". то, что выдает твой код в Memo1, не соответсвует имени, которое ты ищешь. Ну и префикс "Name:", возможно, не нужен. |
|
#4
|
|||
|
|||
|
Код:
m:=GLActor1.Skeleton.BoneByName('mixamorig:HeadTop_End').GlobalMatrix;
GLFreeForm1.SetMatrix(MatrixMultiply(m, GLActor1.AbsoluteMatrix)); да если двигать актера: Код:
if (IsKeyDown(vk_left)) then glactor1.Move(deltatime*50); if (IsKeyDown(vk_right)) then glactor1.Move(deltatime*-50); |
|
#5
|
|||
|
|||
|
вернее двигался за костью
![]() |
|
#6
|
|||
|
|||
|
Хм, возможно ты не установил что-то типа подписки на обновление "родительского" объекта. Т.е. GLFreeForm1 просто не знает, что модель (кость) изменила положение. Возможно, та привязка, которую ты сделал, привязывает к модели в целом, а не к конкретной части, которая может двигаться сама.
|
|
#7
|
|||
|
|||
|
Вот что ИИ подсказывает:
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
|
|||
|
|||
|
попробую переустановить сегодня.
Код:
// Apply it to the FreeForm GLFreeForm1.Matrix.X := Mat.X; GLFreeForm1.Matrix.Y := Mat.Y; GLFreeForm1.Matrix.X := Mat.Z; |
|
#10
|
|||
|
|||
|
попробуй ИИ попросить помочь.
например, Copilot прямо из браузера довольно неплох. Просто тут надо иметь весь код для отладки. Копайлоту не обязательно давать весь код, только ключевые куски, но для отладки нужно-то все... |
|
#11
|
|||
|
|||
|
да, согласен! модели не хватает... код = а он и есть весь вверху.
я думаю, что нашел решение: Код:
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. |