UnigineEditor
Interface Overview
Assets Workflow
Settings and Preferences
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Landscape Tool
Using Editor Tools for Specific Tasks
FAQ
编程
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
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
CIGI Client Plugin
Rendering-Related Classes

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-07-03