Adding Morph Targets(添加变化目标)
这篇文章讲述如何协同变化目标动画工作,变化目标动画在unigine又被称为混合变形。通常变化目标被用来改变人物主题的面部表情。
下面文章演示怎样将变化目标网格添加到unigine上。
下面我们将使用Autodesk Maya,从 Autodesk 3ds Max 也可行。
要求#
- 你应当搭建好用于3D编辑的 Unigine plugins。 在你安装Unigine SDK时,它们会自动安装好
- 你应事先就准备好混合变形的3D模型用于导出。
- 你应事先创建好世界坐标。
同时应参看#
- ObjectMeshSkinned 类功能的描述。
第一步:从Maya中使用混合变形导出网格#
这部分演示从Autodesk Maya中导出混合变形网格的unigine以.mesh 它包含将一头小牛网格实例化的案例,这一案例中有2个混合变形(形体目标)。
要导出这些混合变形的网格,应该完成下列操作步骤:
- 在Autodesk Maya中, 选择将要导出的混合变形网格。
- 在主菜单中上, 点击File -> 导出选择...
- 在导出选择窗口中,选择保存网格的文件夹并对此文件夹命名。 在 Files of type(文件类型)下拉列表中,选择UnigineMesh.
- 在有 export options(导出选项)的File Type Specific Options(文件类型具体选项)标签中,具体化参数导出网格。 要导出混合变形,需在Export Blend Shapes(导出混合变形)复选框内选择打勾。
在Plugins for Maya(Maya插件)文中可获取更多关于导出参数的信息。
- 点击Export Selection(导出选择).
此时在unigine软件内便有以.mesh格式结尾的网格文件,这些网格文件可很容易就添加到项目中。
第二步:添加一个网格到世界坐标中#
这部分将讲述如何使用Uniqine脚本将导出的网格添加到世界坐标中。
网格的每一个混合变形都是一个目标。你需要为网格的表面创建变化目标并为这些目标设置参数,以此控制变化目标动画。 下列的例子演示如何使用Unigine脚本创建变化目标并设置参数。
- 打开世界坐标脚本 .cpp 文件。
- 将下列代码添加到世界坐标脚本文件中。
#include <core/unigine.h> ObjectMeshSkinned mesh; int i = 0; /* This function adds a mesh as a node to the editor */ Node add_editor(Node node) { engine.editor.addNode(node); return node_remove(node); } int init() { /* This block creates a camera and add it to the world */ PlayerSpectator camera = new PlayerSpectator(); camera.setPosition(Vec3(2.0f,0.0f,1.5f)); camera.setDirection(Vec3(-1.0f,0.0f,-0.5f)); engine.game.setPlayer(camera); // Add mesh. Here you should specify the path to your mesh file which is relative to your project's data folder mesh = add_editor(new ObjectMeshSkinned("my_project/meshes/calf.mesh")); // Set mesh parameters: position, material, property mat4 transform = translate(vec3(0,0,0)); mesh.setWorldTransform(Mat4(transform)); mesh.setMaterial("mesh_base","*"); mesh.setProperty("surface_base","*"); // Set the number of mesh targets mesh.setNumTargets(5,0); return 1; } int shutdown() { return 1; } int update() { // Calculate weights of targets float k0 = clamp(sin(i), 0.0f, 1.0f); float k1 = clamp(cos(i), 0.0f, 1.0f); // Set targets with parameters mesh.setTarget(0,1,0,1.0f,0); mesh.setTarget(1,1,0,-k0,0); mesh.setTarget(2,1,0,-k1,0); mesh.setTarget(3,1,1,k0,0); mesh.setTarget(4,1,2,k1,0); // Change the argument of sin() and cos() functions i = i + 0.01; return 1; }
上述给出的代码能将网格添加到世界坐标中,并为变化目标分配材质及属性,并设置参数。下面来分析一下必备的工作:
- 导出的网格通过使用 ObjectMeshSkinned constructor而添加到世界坐标中。 与项目相关的数据 data/ 文件夹对建模者而言作为参数而进行传递。
- setNumTargets() 这种方法的功能是设置网格表面的目标数量。上述例子中导出的网格有2个目标(混合形状)。
-
通过使用setTarget() 这种方法的功能,每一个创建的变化目标的参数在世界坐标脚本的 update() 方法中都得到设置。权重会对网格的坐标产生影响:坐标通过自身权重而被相乘。这样,新的网格就得以创建,它等同于所有激活目标的总和,这些激活目标通过自身权重而得到增强,就像下列的方程式一样:
final_xyz = target_0_xyz * weight_0 + target_1_xyz * weight_1 + ...
-
由于上述给出的代码中,sin() 及cos() 这两种方法的功能被用来做不同目标的动画合成, 五个目标得以创建:
-
若是出于结合的目的,此目标无需任何添写。
mesh.setTarget(0,1,0,1.0f,0);
-
这些目标用作对两个动画融合的添写。
mesh.setTarget(1,1,0,-k0,0); mesh.setTarget(2,1,0,-k1,0);
-
此处用于第一个使用 sin()方法进行添写的动画融合。
mesh.setTarget(3,1,1,k0,0);
-
此处的目标为第二个使用 cos()方法 进行添写的动画融合。
mesh.setTarget(4,1,2,k1,0);
-
- 将你的世界坐标加载到UnigineEditor上。
将材质分配到网格之后,结果如下所示:
最新更新:
2022-10-10
Help improve this article
Was this article helpful?
(or select a word/phrase and press Ctrl+Enter)