如何在Blender中导出并优化FBX文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Blender中导出并优化FBX文件相关的知识,希望对你有一定的参考价值。
1. 将动画导出为 Bvh (运动捕捉的文件格式)我为这个龙添加了大量的动画,但我现在只想导出其中的一个待机动作,所以我首先进入 Pose 模式(1),然后单击 A 选择全部骨骼,接着在 DopeSheet 编辑器重,选择切换至 idle 动作。
接着我导出为 bvh 格式:
File/Export/Motion Cature (. bvh)
Bvh 脚本默认导出当前的动作。
2. 将模型从骨骼上分离,并单独存储为 blend 文件
我选中所有的骨骼,然后单击 X 删除掉骨骼物体。
接着,我需要选中模型,然后删除上面的骨骼修改器。
保存一下文件。
3. 设置导出场景
新建一个场景,然后删除掉默认的模型和摄像机等物体,保证场景的纯净。 参考技术A 1. 将动画导出为 Bvh (运动捕捉的文件格式)
我为这个龙添加了大量的动画,但我现在只想导出其中的一个待机动作,所以我首先进入 Pose 模式(1),然后单击 A 选择全部骨骼,接着在 DopeSheet 编辑器重,选择切换至 idle 动作。
接着我导出为 bvh 格式:
File/Export/Motion Cature (. bvh)
Bvh 脚本默认导出当前的动作。
2. 将模型从骨骼上分离,并单独存储为 blend 文件
我选中所有的骨骼,然后单击 X 删除掉骨骼物体。
接着,我需要选中模型,然后删除上面的骨骼修改器。
保存一下文件。
3. 设置导出场景
新建一个场景,然后删除掉默认的模型和摄像机等物体,保证场景的纯净。
如何从Blender导出fbx纹理以用于Monogame
我正在尝试使用Blender制作一张简单的扑克牌,其面部和背面两侧都有纹理,并将其加载到Monogame。模型本身很好并且在运行时在模拟器上显示但是我似乎无法获得包含的纹理。
卡片上的纹理似乎在Blender中呈现。材料设置为“无阴影”,因此它们不应受光照水平的影响吗?
我在导出文件时尝试使用不同的版本设置和各种不同的路径模式,从“复制”到“剥离路径”。
内容管理器将输出目录设置为主内容文件夹,因此我希望不应该有纹理的引用问题。
所有纹理本身都在同一个文件夹中。
内容全部手动加载到Visual Studio中。
这是我用来绘制卡片的代码,显示了我玩过的不同灯光设置。
private void DrawCard(Model m, Vector3 v, CardFacing c, PlayerFacing p)
{
foreach (var mesh in m.Meshes)
{
foreach (var effect1 in mesh.Effects)
{
var effect = (BasicEffect)effect1;
effect.TextureEnabled = true;
effect.EnableDefaultLighting();
//effect.PreferPerPixelLighting = true;
//effect.AmbientLightColor = Color.White.ToVector3();
effect.DiffuseColor = Color.White.ToVector3();
//effect.EmissiveColor = Color.White.ToVector3() * 2f;
//effect.DirectionalLight0.Direction = Vector3.Normalize(new Vector3(0, 0, 1));
effect.Alpha = 1;
effect.VertexColorEnabled = false;
Matrix mCardFacing = new Matrix();
switch(c)
{
case CardFacing.Down:
mCardFacing = Matrix.CreateRotationY((float)(Math.PI / 180) * 180) * Matrix.CreateRotationX((float)(Math.PI / 180) * 90) * Matrix.CreateTranslation(new Vector3(0, 0, 0));
break;
case CardFacing.Up:
mCardFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 180) * Matrix.CreateRotationX((float)(Math.PI / 180) * 90) * Matrix.CreateTranslation(new Vector3(0, 0, 0));
break;
case CardFacing.Hand:
mCardFacing = Matrix.CreateRotationX((float)(Math.PI / 180) * -20);
break;
}
Matrix mPlayerFacing = new Matrix();
switch (p)
{
case PlayerFacing.North:
mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 0);
break;
case PlayerFacing.East:
mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 90);
break;
case PlayerFacing.South:
mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 180);
break;
case PlayerFacing.West:
mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 270);
break;
}
effect.World = mCardFacing * Matrix.CreateTranslation(v) * mPlayerFacing;
effect.View = view;
effect.Projection = projection;
}
mesh.Draw();
}
}
有任何想法吗?谢谢。
答案
3d模型通常不包含纹理本身。 FBX文件存储每个顶点的位置,它们如何连接以及纹理的哪个部分位于任何单个点。
它不存储纹理本身。因此,您需要以加载任何其他纹理的方式单独加载纹理(您需要Texture2D,即使这是一个3d模型)。
然后,您可以将纹理指定给效果:
effect.Texture = cardTexture;
我相信这应该正确地渲染效果。
这意味着您还可以轻松地即时更换模型的纹理,而无需更改模型本身。如果你的模型只是一个二维四边形,如果在代码中生成它也可能更简单,但你当前的设置也没有错。
以上是关于如何在Blender中导出并优化FBX文件的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Blender 中导出 fbx 纹理以在 Monogame 中使用