Создание формы изменения модели в XNA 3D

Я хочу создать объект, который движется (например, движутся люди или упругие пружины), при движении форма объекта будет изменяться. И я не знаю, как создать изменение формы 3D-модели в XNA 4.0. Вы можете помочь мне?? Спасибо!


person HaiTrieu    schedule 26.10.2012    source источник
comment
Ну, вы знаете, как сделать 3D-модель в XNA?   -  person LightStriker    schedule 26.10.2012
comment
Да. Я создаю модели 3D в Blender, но я только начал этому учиться.   -  person HaiTrieu    schedule 26.10.2012
comment
Хорошо, вы не знаете, как сделать модель по коду. Мой совет: начните с попытки создать плоскость или куб полностью с помощью кода, чтобы полностью понять, как это работает внутри.   -  person LightStriker    schedule 26.10.2012


Ответы (1)


Могу дать совет начинающим.

Я только что научился создавать модель из этого примера. и, основываясь на вашем вопросе, я применил дополнительное преобразование масштаба к одной из костей, чтобы увидеть, могу ли я управлять ее размером так же, как я могу ее положением, и это действительно сработало.

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

Вот моя модель:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace SimpleAnimation
{
    public class Body
    {
        Model bodyModel;
        ModelBone headBone;
        ModelBone bodyBone;
        Matrix headTransform;
        Matrix bodyTransform;
        Matrix[] boneTransforms;

        public Body()
        {
            HeadScale = 1;
        }

        public void Load(ContentManager content)
        {
            // Load the tank model from the ContentManager.
            bodyModel = content.Load<Model>("body");

            // Look up shortcut references to the bones we are going to animate.
            headBone = bodyModel.Bones["head"];
            bodyBone = bodyModel.Bones["body"];

            // Store the original transform matrix for each animating bone.
            headTransform = headBone.Transform;
            bodyTransform = bodyBone.Transform;

            // Allocate the transform matrix array.
            boneTransforms = new Matrix[bodyModel.Bones.Count];
        }

        public void Draw(Matrix world, Matrix view, Matrix projection)
        {
            // Set the world matrix as the root transform of the model.
            bodyModel.Root.Transform = world;

            // Calculate matrices based on the current animation position.
            Matrix headRotation = Matrix.CreateRotationX(HeadRotation);
            Matrix headScale = Matrix.CreateScale(HeadScale);
            Matrix bodyRotation = Matrix.CreateRotationX(BodyRotation);

            // Apply matrices to the relevant bones.
            headBone.Transform = headScale * headRotation * headTransform;
            bodyBone.Transform = bodyRotation * bodyTransform;

            // Look up combined bone matrices for the entire model.
            bodyModel.CopyAbsoluteBoneTransformsTo(boneTransforms);

            // Draw the model.
            foreach (ModelMesh mesh in bodyModel.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.World = boneTransforms[mesh.ParentBone.Index];
                    effect.View = view;
                    effect.Projection = projection;

                    effect.EnableDefaultLighting();
                }

                mesh.Draw();
            }
        }

        public float HeadRotation { get; set; }

        public float HeadScale { get; set; }

        public float BodyRotation { get; set; }
    }
}
person Aaron Anodide    schedule 26.10.2012
comment
Большое спасибо, Аарон Анодид. Можете ли вы поделиться со мной примером кода о переезде одного человека. Я знаю вращение и масштабирование одной модели, но я не знаю, как изменить ее форму, например, когда один человек движется или встает и садится. Файл модели дизайна (.fbx) тоже очень сложен! - person HaiTrieu; 26.10.2012
comment
Я не могу сказать наверняка, но я полагаю, что движение человека было бы тем же самым, просто используя матрицу перевода, чтобы настроить положение модели на оси x/y/z... если вы думаете об этом, что часть движущегося, стоящего или сидящего человека не является продуктом преобразований Вращение, Склейка и Трансляция? - person Aaron Anodide; 26.10.2012
comment
Я пытаюсь создать упругие пружины!! - person HaiTrieu; 26.10.2012
comment
что касается .fbx - я не думаю, что вы должны что-то с этим делать - я думаю, что это способ, которым такие инструменты, как Blender и Cinema 4D, могут экспортировать модели, которые вы создаете, таким образом, чтобы среда XNA могла читать ... я считаю, что пока это довольно гладкий опыт - person Aaron Anodide; 26.10.2012
comment
опять же, это всего лишь предположение новичка, но, поскольку на самом деле здесь нет никакой магии, и все это просто числовые вершины, я думаю, вам нужно перейти на уровень мышления о пружине как об огромном наборе полигонов - может быть, куча дисковых примитивов... я думаю, что моя полезность здесь исчерпана - как я уже сказал, я тоже новичок - person Aaron Anodide; 26.10.2012