Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 4
1

Изменение положения костей в Directx

18.01.2012, 18:30. Показов 1869. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вывожу 3d модель (tiny.x) на форму.
Подскажите как можно в программе изменить позу модели.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2012, 18:30
Ответы с готовыми решениями:

Изменение костей и манипуляции с ними
Пожалуйста подскажите, или дайте ссылки на уроки или литературу. Можно ли изменять размеры...

Из полного набора костей домино берут 7 костей. Найти вероятность того, что хотя бы одна окажется дублем.
Помогите, пожалуйста, найти ответы к задачам, желательно с решением: 1. Из полного набора костей...

Изменение положения картинки
Вот подскажите можно ли такое сделать сделать на JavaScript, если нету картинки с именем классом ...

Изменение положения модели
Здравствуйте, подскажите, пожалуйста, как изменить положение модели (т.е. в самом начале не в...

7
Эксперт С++
3574 / 2828 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
18.01.2012, 20:47 2
Лучший ответ Сообщение было отмечено _lunar_ как решение

Решение

если делаете по Миллеру, то должны писать что-то в этом роде
C#
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
private void Form1_Load(object sender, EventArgs e)
        {
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
 
            var presentParameters = new PresentParameters()
            {
                Windowed = true,
                SwapEffect = SwapEffect.Discard,
                AutoDepthStencilFormat = DepthFormat.D16,
                EnableAutoDepthStencil = true
            };
 
            device = new Device(0, DeviceType.Hardware, Handle, CreateFlags.HardwareVertexProcessing, presentParameters);
 
            LoadMesh(@"..\..\tiny.x");
        }
 
        private void LoadMesh(string file)
        {
            ExtendedMaterial[] mtrl;
            mesh = Mesh.FromFile(file, MeshFlags.Managed, device, out mtrl);
            if ((mtrl != null) && (mtrl.Length > 0))
            {
                meshMaterials = new Material[mtrl.Length];
                meshTextures = new Texture[mtrl.Length];
                for (int i = 0; i < mtrl.Length; i++)
                {
                    meshMaterials[i] = mtrl[i].Material3D;
                    if ((mtrl[i].TextureFilename != null) && (mtrl[i].TextureFilename != string.Empty))
                    {
                        meshTextures[i] = TextureLoader.FromFile(device, @"..\..\" + mtrl[i].TextureFilename);
                    }
                }
            }
        }
насколько я помню эта модель статична, и изменить её можно отредактировав сам файл tiny.x, но там чёрт ногу сломит. Проще создать новую модель в том же DeleD 3D или Blender.
0
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 4
18.01.2012, 21:12  [ТС] 3
Да, загрузка так и выполнена.
Но мне нужно изменить положение кости, например поднять левую ногу, с помощью матриц преобразования.
Может быть как описано здесь для С++ :
C++
1
2
3
4
5
// pRootframe = указатель на корневой фрейм
 D3DXFRAME_EX D3DXFRAME_EX *Frame = FindFrame(pRootFrame, "Leg"); 
if(Frame) {
// Здесь давайте немного повернем кость
D3DXМatrixRotationY(&Frame->TransformationМatrix, 1.57f); }
0
Эксперт С++
3574 / 2828 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
18.01.2012, 21:53 4
Лучший ответ Сообщение было отмечено _lunar_ как решение

Решение

можно попробовать, я сейчас открыл файл через WordPAD
C
1
2
3
4
5
6
7
8
9
10
11
12
13
Frame Bip01_L_Hand {
             
 
             FrameTransformMatrix {
              0.999511,-0.027531,-0.014824,0.000000,-0.015327,-0.018154,-0.999718,0.000000,0.027254,0.999456,-0.018567,0.000000,61.671467,0.000001,-0.000001,1.000000;;
             }
 
             Frame Bip01_L_Finger0 {
              
 
              FrameTransformMatrix {
               0.713247,-0.002867,-0.700906,0.000000,-0.700353,-0.042855,-0.712509,0.000000,-0.027995,0.999077,-0.032574,0.000000,12.410522,3.054963,-10.755418,1.000000;;
              }
т.е. здесь матрица левой руки и левого пальца. Какие именно параметры меняются по оси Y в предложенном вами коде на 1.57f не знаю. Я точно не помню, а в книге Миллера разве нет что-то подобного, там вроде как все подобные мелочи довольно хорошо описаны.
0
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 4
18.01.2012, 22:22  [ТС] 5
Это всё понятно, но мне нужно применить изменения положения сочленений в ходе выполнения программы.
Например, управляешь положением левой ноги ползунком, ползунок вправо нога вверх,влево - вниз
0
Lex101
24.04.2012, 12:15 6
Termik38, ты не разобрался, как вручную работать с костями? Мне нужно решить аналогичную проблему, но не могу придумать как
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 4
24.04.2012, 13:07  [ТС] 7
C#
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
// Количество и имена костей в файле .х
string[] frameName = new string[60]{"Hips","Spine1","Spine2","Spine3","Neck","Head","LeftCollar",
                                           "LeftUpArm","LeftLowArm","LeftHand","Lmiddle1","Lmiddle2",
                                           "Lmiddle3","Lthumb1","Lthumb2","Lthumb3","Lindex1","Lindex2",
                                           "Lindex3","Lring1","Lring2","Lring3","Lpinky1","Lpinky2",
                                          "Lpinky3","RightCollar","RightUpArm","RightLowArm","RightHand",
                                           "Rmiddle1","Rmiddle2","Rmiddle3","Rthumb1","Rthumb2","Rthumb3",
                                           "Rindex1","Rindex2","Rindex3","Rring1","Rring2","Rring3","Rpinky1",
                                           "Rpinky2","Rpinky3","LeftUpLeg","LeftLowLeg","LeftFoot","lBigToe1",
                                           "lIndexToe1","lMidToe1","lRingToe1","lPinkyToe1","RightUpLeg",
                                           "RightLowLeg","RightFoot","rBigToe1","rIndexToe1","rMidToe1",
                                           "rRingToe1","rPinkyToe1"};
 
float[] rollAngle = new float[60];
float[] yawAngle = new float[60];
float[] pitchAngle = new float[60];
 
 
AnimationFrame framee = Frame.Find(rootFrame.FrameHierarchy, frameName[0]) as AnimationFrame;
               
 // Вращения всех костей                   
                for (uint i = 0; i < 60; i++)
                {
                    framee = Frame.Find(rootFrame.FrameHierarchy, frameName[i]) as AnimationFrame;
                    framee.TransformationMatrix = Matrix.RotationYawPitchRoll(rollAngle[i], yawAngle[i], pitchAngle[i])
                        * Matrix.Translation(framee.TransformationMatrix.M41, framee.TransformationMatrix.M42, framee.TransformationMatrix.M43);
 
                }
0
444 / 348 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
25.04.2012, 22:50 8
Termik38, мировую матрицу кости домножать на матрицы всяких преобразований. при прорисовке.
0
25.04.2012, 22:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2012, 22:50
Помогаю со студенческими работами здесь

Изменение положения виджетов
Как изменить местоположение виджета(например кнопки) после добавления на слой? Сколько ни пытался...

Изменение положения курсора
Задача состоит в том, чтобы устанавливать или разрывать связь между колонтитулами соседних...

Изменение положения компонента
При нажатии на Button Edit1.Left:=('208'); edit1.Height:=('72');Ошибка Unit6.pas(40):...

Изменение положения привязанного объекта по Y
На сцене имеется префабный FPS персонаж. К нему привязан один объект, и он двигается вслед за...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru