This page has been translated automatically.
编程
Fundamentals
Setting Up Development Environment
Usage Examples
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and Tools
GUI
Double Precision Coordinates
应用程序接口
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
CIGI Client Plugin
Rendering-Related Classes
注意! 这个版本的文档是过时的,因为它描述了一个较老的SDK版本!请切换到最新SDK版本的文档。
注意! 这个版本的文档描述了一个不再受支持的旧SDK版本!请升级到最新的SDK版本。

Adding Morph Targets(添加变化目标)

这篇文章讲述如何协同变化目标动画工作,变化目标动画在unigine又被称为混合变形。通常变化目标被用来改变人物主题的面部表情。

下面文章演示怎样将变化目标网格添加到unigine上。

下面我们将使用Autodesk Maya,从 Autodesk 3ds Max 也可行。

要求

  • 你应当搭建好用于3D编辑的 Unigine plugins。 在你安装Unigine SDK时,它们会自动安装好
  • 你应事先就准备好混合变形的3D模型用于导出。
  • 你应事先创建好世界坐标。

同时应参看

第一步:从Maya中使用混合变形导出网格

这部分演示从Autodesk Maya中导出混合变形网格的unigine以.mesh 它包含将一头小牛网格实例化的案例,这一案例中有2个混合变形(形体目标)。

要导出这些混合变形的网格,应该完成下列操作步骤:

  1. 在Autodesk Maya中, 选择将要导出的混合变形网格。

  2. 在主菜单中上, 点击File -> 导出选择...

  3. 在导出选择窗口中,选择保存网格的文件夹并对此文件夹命名。 在 Files of type(文件类型)下拉列表中,选择UnigineMesh.

  4. 在有 export options(导出选项)File Type Specific Options(文件类型具体选项)标签中,具体化参数导出网格。 要导出混合变形,需在Export Blend Shapes(导出混合变形)复选框内选择打勾。

    注意
    Plugins for Maya(Maya插件)文中可获取更多关于导出参数的信息。
  5. 点击Export Selection(导出选择).

此时在unigine软件内便有以.mesh格式结尾的网格文件,这些网格文件可很容易就添加到项目中。

第二步:添加一个网格到世界坐标中

这部分将讲述如何使用Uniqine脚本将导出的网格添加到世界坐标中。

网格的每一个混合变形都是一个目标。你需要为网格的表面创建变化目标并为这些目标设置参数,以此控制变化目标动画。 下列的例子演示如何使用Unigine脚本创建变化目标并设置参数。

  1. 打开世界坐标脚本 .cpp 文件。
  2. 将下列代码添加到世界坐标脚本文件中。
    源代码 (UnigineScript)
    #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() 这两种方法的功能被用来做不同目标的动画合成, 五个目标得以创建:
      • 源代码 (UnigineScript)
        mesh.setTarget(0,1,0,1.0f,0);
        若是出于结合的目的,此目标无需任何添写。
      • 源代码 (UnigineScript)
        mesh.setTarget(1,1,0,-k0,0);
        mesh.setTarget(2,1,0,-k1,0);
        这些目标用作对两个动画融合的添写。
      • 源代码 (UnigineScript)
        mesh.setTarget(3,1,1,k0,0);
        此处用于第一个使用 sin()方法进行添写的动画融合。
      • 源代码 (UnigineScript)
        mesh.setTarget(4,1,2,k1,0);
        此处的目标为第二个使用 cos()方法 进行添写的动画融合。
  3. 将你的世界坐标加载到UnigineEditor上。

将材质分配到网格之后,结果如下所示:

最新更新: 2017-10-20
Build: ()