Maya总动员——动画编程篇(配光盘) 下载 pdf 百度网盘 epub 免费 2025 电子版 mobi 在线

Maya总动员——动画编程篇(配光盘)精美图片
》Maya总动员——动画编程篇(配光盘)电子书籍版权问题 请点击这里查看《

Maya总动员——动画编程篇(配光盘)书籍详细信息

  • ISBN:9787302241782
  • 作者:暂无作者
  • 出版社:暂无出版社
  • 出版时间:2011-01
  • 页数:602
  • 价格:59.80
  • 纸张:胶版纸
  • 装帧:平装
  • 开本:16开
  • 语言:未知
  • 丛书:暂无丛书
  • TAG:暂无
  • 豆瓣评分:暂无豆瓣评分
  • 豆瓣短评:点击查看
  • 豆瓣讨论:点击查看
  • 豆瓣目录:点击查看
  • 读书笔记:点击查看
  • 原文摘录:点击查看

内容简介:

本书以Maya 2010版及Maya 2011版本为依托,详细地介绍了各种Maya动画编程技术。具体内容包括动画表达式、粒子表达式、常用函数、表达式编辑器、MEL脚本基础内容、数值与变量、数据类型、创建界面、句法、脚本范例、Python的使用、Python和线程、MEL与Python的重要差异、程序编译简介、导出插件程序、使用API编辑节点、API多线程插件、多边形API和Maya Python API、分配Maya插件等。

本书附带4张DVD,近20小时的视频教学,全方位地以视频教学的方式展现了Maya的强大程序功能,使学习枯燥的程序编写变得简单易懂。光盘内容包括表达式的常用函数学习、表达式的应用、粒子表达式应用、MEL脚本命令操作、函数定义操作、自定义窗口、Python介绍、Python语法规则、Python元素的引用方法、Python内置函数、Maya API插件编写及应用实例等。光盘内容是图书内容的延伸和补充,是全面学习Maya程序高级功能为经典的不可多得的珍贵教学资料。


书籍目录:

第1章 表达式

1.1 动画表达式

1.1.1 动画表达式

1.1.2 创建动画表达式

1.1.3 每个属性只有一个驱动程序

1.1.4 时间和帧关键词

1.1.5 找到之前创建的动画表达式

1.1.6 编辑动画表达式中的文本

1.1.7 使用文本编辑器编辑动画表达式

1.1.8 删除动画表达式

1.2 粒子表达式

1.2.1 关于粒子表达式

1.2.2 粒子表达式

1.2.3 创建表达式的执行

1.2.4 运行时间表达式的执行

1.2.5 设置动态开始帧

1.2.6 设置原始状态使用的属性

1.2.7 编写创建表达式

1.2.8 编写运行时间表达式

1.2.9 运行粒子属性

1.2.10 添加动态属性

1.2.11 了解每粒子和每对象属性

1.2.12 了解原始状态属性

1.2.13 赋值自定义属性

1.2.14 赋值不同长度的粒子排列属性

1.2.15 在运行表达式中使用创建表达式的数值

1.2.16 运行位置、速度和加速度

1.2.17 运行颜色

1.2.18 运行发散的粒子

1.2.19 运行碰撞

1.2.20 运行使用期

1.2.21 运行特定粒子

1.2.22 赋值矢量和矢量排列

1.3 常用函数

1.3.1 极限函数

1.3.2 指数函数

1.3.3 三角函数

1.3.4 矢量函数

1.3.5 转化函数

1.3.6 数组函数

1.3.7 随机数函数

1.3.8 曲线函数

1.3.9 通用命令

1.4 表达式编辑器

第2章 MEL脚本

2.1 背景情况

2.1.1 MEL概述

2.1.2 MEL和表达式手册

2.1.3 编程器的MEL

2.2 运行MEL

2.2.1 运行MEL命令

2.2.2 查看或记录与作用相关的MEL命令

2.2.3 为脚本制作一个工具栏按钮

2.2.4 从MEL命令上得到帮助

2.3 数值和变量

2.3.1 整数和浮点数

2.3.2 字符串

2.3.3 显式输入和隐式输入

2.3.4 变量

2.3.5 分配数值到变量和属性上

2.3.6 输出数值

2.3.7 选择任意数字

2.4 排列、矢量和矩阵

2.4.1 排列

2.4.2 获取和改变排列的大小

2.4.3 矢量

2.4.4 矩阵

2.5 类型

2.5.1 MEL合适类型

2.5.2 使用空白区域

2.5.3 添加注释

2.5.4 变量命名

2.5.5 程序和脚本

2.5.6 完美脚本

2.6 控制脚本流量

2.6.1 测试和比较数值

2.6.2 布尔值

2.6.3 if…else if…else

2.6.4 ?:运算符

2.6.5 switch…case

2.6.6 while

2.6.7 do…while

2.6.8 for

2.6.9 for-in

2.6.10 break

2.6.11 continue

2.6.12 测试命令、对象和属性的存在

2.6.13 =和= =的不同

2.6.14 常见问题

2.7 属性

2.7.1 属性概述

2.7.2 属性名称

2.7.3 属性的数据类型

2.7.4 获取和设置属性

2.7.5 获取和设置多值属性

2.8 程序

2.8.1 程序

2.8.2 定义程序

2.8.3 调用程序

2.8.4 全局和本地变量

2.8.5 测试功能在MEL中是否可用

2.8.6 检查程序的来源

2.9 I/O和互动

2.9.1 用户互动

2.9.2 读取和编写文件

2.9.3 测试文件存在、权限和其他属性

2.9.4 控制文件

2.9.5 运行目录

2.9.6 执行系统命令

2.9.7 读取并写入系统命令管线

2.9.8 从AppleScript中调用

MEL,反之亦然

2.10 调试、优化和疑难解答

2.10.1 MEL调试特点

2.10.2 优化脚本和表达式速度

2.10.3 疑难解答

2.11 创建界面

2.11.1 ELF命令

2.11.2 窗口

2.11.3 控件

2.11.4 布局

2.11.5 分组

2.11.6 菜单

2.11.7 集合

2.11.8 母代与子代

2.11.9 命名

2.11.10 UI命令模板

2.11.11 删除UI元素

2.11.12 连接命令到UI元素

2.11.13 简单窗口

2.11.14 模式对话框

2.11.15 使用系统事件和

scriptJobs

2.12 脚本节点

2.12.1 MEL脚本节点

2.12.2 生成或编辑脚本节点

2.12.3 打开文件时阻止脚本节点的运行

2.13 高级版本

2.13.1 高级程序课题

2.13.2 高级动画表达式课题

2.14 句法

2.14.1 祈使句法

2.14.2 分隔符和空白区域

2.14.3 表达式、运算符和语句

2.14.4 运算符优先顺序

2.14.5 组块

2.14.6 注释

2.14.7 表达式和MEL句法之间的不同

2.15 疑难问题解答

2.15.1 任务

2.15.2 脚本与句法

2.15.3 建模

2.15.4 动画、动力学和渲染

2.16 脚本范例

2.16.1 从Maya自带的脚本文件中学习

2.16.2 从文档文件中读取动画参数值

2.16.3 粒子碰撞边界

2.16.4 点爆炸

2.16.5 测试附加粒子属性

2.16.6 测试动力学事件

2.16.7 动态时间播放

2.16.8 寻找着色对象

第3章 Python

3.1 Python in Maya

3.2 Python的使用

3.3 Python和线程

3.4 Python from an external

interpreter

3.5 MEL与 Python中的重要差异

3.6 当前限制条件

3.7 Tips and tricks for scripters

new to Python

第4章 程序编译和导出端口

4.1 程序编译

4.1.1 程序编译简介

4.1.2 FBX文件程序编译

4.1.3 IGES程序编译插件

4.1.4 StudioImport插件程序和程序编译

4.1.5 导出插件程序

4.1.6 Maya OpenFlight导入端口/导出端口

4.2 游戏

4.2.1 简介

4.2.2 VRML2程序编译

4.2.3 RTG应用程序和文件格式

4.2.4 游戏交流2程序编译

4.2.5 MDt API

第5章 Maya API简介

5.1 简介

5.2 安装插件程序

5.3 卸载插件程序

5.4 编写简单的插件程序

5.5 重要的插件程序特性

5.6 与Maya组合

5.7 MObject

5.8 包装器

5.9 对象和函数集

5.10 命名惯例

5.11 添加参数

5.12 错误检查

5.13 MStatus类

5.14 错误记录

第6章 使用API选择

6.1 使用API选择概述

6.2 MGlobal::setActive-

SelectionList()

6.3 MSelectionList

6.4 MItSelectionList

6.5 setObject()方法

6.6 MFn::Type列举

6.7 MGlobal::selectByName()

第7章 命令插件

7.1 添加命令给Maya概述

7.2 注册命令

7.3 MFnPlugin

7.4 initializePlugin()

7.5 uninitializePlugin()

7.6 创建者方法

7.7 MpxCommand

7.8 返回结果到MEL

7.9 语法对象

7.10 标志

7.11 背景

7.12 MPxContext

7.13 MPxContextCommand

7.14 工具属性表

7.15 MPxToolCommand

7.16 连接插件到Maya菜单

7.17 第三方插件程序的安装

第8章 DAG层次

8.1 DAG层次概述

8.2 节点

8.3 变形和形状

8.4 DAG路径

8.5 一般化的实例化

8.6 多个形状的变形

8.7 DAG行走实例

第9章 编写阴影节点

9.1 阴影节点插件程序概述

9.2 编写阴影节点插件程序

9.3 阴影节点插件程序分析

9.4 InterNode实例编码走查

9.5 阴影节点分类

9.6 Hypershade的阴影节点图标

9.7 特殊的阴影节点

9.8 阴影节点里的超级采样

9.9 赋值渲染背景外的阴影节点

第10章 从属图表插件程序

10.1 从属图表插件程序概述

10.2 母代类别描述

10.3 基础

10.4 从属图表(DG)节点

10.5 节点

10.6 属性和塞子

10.7 复杂属性

10.8 资料区

10.9 数据句柄

10.10 数据创建式

10.11 计算方法

10.12 更复杂的实例

10.13 MPxNode及其衍生类别

第11章 操纵器和形

11.1 操纵器

11.1.1 操纵器是什么

11.1.2 基础操纵器

11.1.3 编写操纵器

11.1.4 操纵器容器

11.1.5 操纵器和节点间的信息交流

11.1.6 连接操纵器到Show

Manipulator Tool

11.2 形状

11.2.1 Maya形状

11.2.2 形状分类

11.2.3 写出形状

11.2.4 绘图与刷新

11.2.5 选择

11.2.6 组件

11.2.7 调整和内部属性

11.2.8 几何体数据

11.2.9 文件IO

11.2.10 变形器

11.2.11 标记菜单

11.2.12 形状实例

第12章 编写节点和文件编译程序

12.1 编写硬件着色节点

12.1.1 硬件着色节点插件程序概述

12.1.2 执行硬件着色节点插件

12.1.3 一个硬件着色节点插件的实例

12.1.4 改进硬件着色器的运行

12.1.5 硬件着色节点插件实例

12.2 编写自定义变形节点

12.2.1 自定义变形概述

12.2.2 执行自定义变形

12.2.3 自定义变形实例

12.2.4 自定义变形节点实例

12.3 编写变形器节点

12.3.1 变形器概述

12.3.2 执行变形器节点

12.3.3 变形器节点实例

12.3.4 变形器实例

12.4 编写文件编译程序

12.4.1 文件编译程序概述

12.4.2 执行文件编译程序

12.4.3 文件编译程序实例

第13章 多线程插件

13.1 简介

13.2 数据和任务对应

13.3 线程

13.4 锁定

13.5 OpenMP

13.6 Intel线程建构模块(TBB)

13.7 线程任务

13.8 内存分配

13.9 线程和Maya

13.10 其他对应类型

13.11 蟒蛇线程和Maya

13.12 第三方工具

13.13 API类别和插件

13.14 Mac OS X平台特定线程库问题

13.15 供应商特定OpenMP问题

第14章 多边形API和Maya

Python API

14.1 多边形API

14.1.1 多边形API概述

14.1.2 如何内部控制多边形

14.1.3 五个基本多边形API类别8

14.1.4 构建历史和调整

14.1.5 polyModifierCmd实例

14.1.6 splitUVCmd实例

14.1.7 多边导出端口插件

14.2 Maya Python API

14.2.1 Maya Python API简介

14.2.2 开发工具

14.2.3 使用Maya Python

API

14.2.4 C++ Maya API和

Maya Python API的差别

第15章 建立创建环境

15.1 创建插件和应用程序简介

15.2 编译程序的要求

15.3 Linux环境(64位)

15.4 Linux编译程序需要

15.5 使用调试器调试插件

15.6 Windows环境(32位和64位)

15.7 安装Maya Plug-in Wizard

15.7.1 Maya Plug-in Wizard

2.0(32位的版本)

15.7.2 Maya Plug-in Wizard2.0(64位的版本)

15.8 Mac OS X环境

第16章 分配Maya插件

16.1 分配单独文件

16.2 分配多个文件的模块

16.3 模块限制

16.3.1 共享库

16.3.2 渲染全能的着色器

第17章 实例插件

17.1 实例插件概述

17.2 独立应用程序举例

17.3 C++插件实例描述

17.4 独立应用程序的描述举例

17.5 着色器源代码举例

17.6 ASHLI着色器

17.7 脚本插件程序举例

第18章 附录

18.1 附录A:NURBS图形

18.2 附录B:相关图渲染节点

18.3 附录C:渲染属性

18.4 附录D:常见问题解答

18.5 附录E:API和Devkit限制条件

18.6 附录F:添加图像插件程序


作者介绍:

总动员公司创始人,Maya专家。国内代三维动画技术的研究者与教学者,曾担任过多部电影、电视剧的特技导演,有丰富的行业技术经验。曾任多家知名学府及培训机构的技术总监和教学总监,具有丰富的三维动画教学经验。著有多部动画技术专著,出版有《Maya总动员》系列大


出版社信息:

暂无出版社相关信息,正在全力查找中!


书籍摘录:

1.1.1 动画表达式

表达式是给定Maya在时间上控制属性的指令。属性是对象的特性,如X缩放、Y平移、可见性等。

虽然可以创建一个表达式,为任意目的动态改变属性,但这是属性在时间上递增,随机、有节奏改变的一个概念标准,如图1-1所示。

图1-1

表达式也可以用于链接不同对象间的属性——一个属性上的改变也会更改另一个的运行。例如,可以旋转依赖于汽车前后移动的轮胎。

表达式为困难的格点设定任务提供选择。在格点设定中,设置动画中选定关键帧的属性值,Maya在关键帧之间插入操作。根据表达式,编写一个方程式,然后动画播放时Maya执行操作。

表达式总是简单的几个词或几行。下列表达式实例中,注意范围的变化和细节(不是其目的)。

实例

Ball.translateX = Cube.translateX + 4;

实例

if (frame == 1)

Cone.scaleY = 1;

else

{

Cone.scaleY = (0.25 + sin(time)) * 3;

print(Cone.scaleY + "n");

}

可以使用表达式动态改变任何帧范围内可设置关键帧、未锁定的对象属性。也可以使用表达式控制每个颗粒或每个对象的属性。每个颗粒属性分别控制颗粒对象的每个颗粒。每个对象属性共同控制颗粒对象的所有颗粒。

1.1.2 创建动画表达式

在Expression Editor中创建并编辑表达式。开启Expression Editor有几种方法:

选择Window→Animation Editors→Expression Editor。

在Channel Box中,单击属性名称,然后右击,从弹出的菜单中选择Editors→Expressions。

在Attribute Editor中,在属性框中右击,选择Create New Expression。

如果之前创建了一个表达式,分配数值到属性,选择Edit Expression代替,如图1-2所示。

表达式文本编辑框随着输入文本进行扩展,所以可以编写不限定长度的表达式。也 可以启动文本编辑框上边的Editor下拉菜单中的外部文本编辑器,并在编辑器里编辑表 达式。

也可以在编辑已有表达式之后,创建新的表达式。

在Expression Editor中创建新的表达式

(1)确定单击Create或Edit按钮,编译已有表达式。

(2)选择Filter→By Expression Name。

(3)单击New Expression按钮。

这样清除了Expression Name框和表达式文本编辑框,所以可以创建新的表达式。

创建表达式时,Expression Editor与表达式的对象名称结合。这意味着使用除表达式名称外的对象名称可以缩小表达式的搜索范围。

不需要选择Attributes列表中的属性。可以使表达式只结合一个对象。

对于颗粒形状节点,不需要选择属性,因为可以创建每个颗粒形状只有一个创建表达式和两个运行时间表达式(动态计算前后)。对于非颗粒形状的对象,可以创建每个属性一个表达式。

图1-2

1.1.3 每个属性只有一个驱动程序

不能应用表达式到已经使用下列技术动态改变的属性上:

设置驱动键

约束条件

运动路径

另一个表达式

其他直接联系

如果应用了表达式,会在Script Editor和Command Line的反应区域看到错误信息。

虽然前面技术中的两个改变的一个属性不能被控制,但是可以控制使用关键帧属性,使用表达式的另一个属性,使用约束条件的另一个属性,等等。

也可以使用一个表达式分配数值到一个或多个对象的几个属性上。

1.1.4 时间和帧关键词

在动画表达式中,可以使用两个不在标准MEL中的非常有用的关键词:

time 返回时间线上的当前时间位置。

frame 返回时间线上的当前帧位置。

可以在动画表达式中式中使用这些关键词,就好像它们是变量:

persp.translateY = frame / 2;

persp.rotateY = time;

1.1.5 找到之前创建的动画表达式

创建完表达式之后,会决定稍后进行更改创建不同的动画结果。要编辑表达式,在Expression Editor中进行显示。下面描述如何为编辑找到并显示表达式。

注意

在Expression Editor中可以找到并编辑MEL脚本节点。

1.通过名称找到表达式

要找到表达式,可以在场景的所有表达式列表中选择。

通过名称搜索表达式

(1)从Expression Editor中,选择Filter→By Expression Name。

Expressions列表出现在Expression Editor中。列表显示了为这个场景创建的所有表达式。如图1-3所示。

图1-3

(2)单击列表中的表达式。

表达式内容出现在表达式文本编辑框中。

如果忘记了表达式的名称,单击列表中的每个名称,直到预期表达式出现在表达式文本框中。

注意

对于颗粒形状节点,可以创建一个创建表达式,在动态执行之前创建一个运行时间表达式,动态执行之后创建一个运行时间表达式,或者三个都创建。所有的表达式都列表显示在一个名称下——颗粒形状节点的名称。不能命名或重命名这样的表达式。

要找到这样的表达式,在Expressions列表中寻找颗粒形状节点的名称。

单击适当的动态前/后Runtime或Creation复选框,显示想要的表达式。

2.通过选定对象找到表达式

如果忘记了表达式的给定名称,可以选择受影响的对象找到表达式。对于非颗粒形状的节点,也可以从Attributes列表中受影响的属性缩小表达式的搜索范围。

通过对象和属性名称搜索表达式

(1)选择Outliner、Hypergraph或工作空间中的对象或节点。

(2)在Expression Editor(Window→Animation Editors→Expression Editor)中,选择Filter→By Object/Attribute Name。这是Expression Editor的默认搜索设置。

(3)选择Object Filter→Selected Objects。

选定的对象名称和适当属性显示在窗口中,如图1-4所示。

图1-4

(4)对于颗粒形状节点以外的对象,单击表达式控制的属性名称。

如果忘记了表达式控制的属性名称,选择Attribute Filter→Connected to Expressions。Attributes列表中只显示选定对象的表达式控制的属性。单击Attributes列表中的每个属性,直到在表达式文本编辑框中看到想要的表达式。

不能像对其他类型的对象那样为颗粒形状的每个属性编写不同的表达式。因为每个颗粒形状只能编写一个创建表达式和两个运行时间表达式(动态计算前后),不需要从Expression Editor的Attributes列表中选择属性。

注意

Attributes列表只显示未锁定的、可设置关键帧的属性。可以使用Window→General Editors→Channel Control,选择属性是可设置关键帧的还是锁定。

要为列表中不显示的不可设置关键帧属性编写表达式,在Selected Obj & Attr文本框中输入object.attribute。

3.通过选项类型找到表达式

可以在表达式影响的对象或项目类型的基础上找到表达式。例如,如果忘记了表达式名称,但记得应用到一个着色器节点上,可以缩小范围搜索控制场景中着色器节点的表 达式。

通过选项类型搜索表达式

(1)在Expression Editor中,选择Filter→By Object/Attribute Name。

(2)从Object Filter菜单中,选择表达式影响的对象或项目类型。

(3)选择Attribute Filter→Connected to Expressions。

(4)从Objects列表中选择受影响的对象或项目。

(5)从Attributes列表中选择受影响的属性。

表达式出现在表达式文本编辑框中。

1.1.6 编辑动画表达式中的文本

有多个键盘命令编辑文本,Expression Editor有清除和恢复表达式整个文本的按钮。

重点

如果关闭了使用Create或Edit按钮没有成功编译表达式的Expression Editor,Maya丢弃所有编辑变化。

1.使用键盘命令

命 令

定 义

平 台

+c

命令+c

复制

Linux and Windows

Mac OS X

+x

命令+x

剪切

Linux and Windows

Mac OS X

+v

命令+v

粘贴

Linux and Windows

Mac OS X

+k

删除到行的结尾

只适用Linux

+d

删除下一个字符

只适用Linux

续表

命 令

定 义

平 台

+a

移动光标到行的开端

只适用Linux

+e

移动光标到行的结尾

只适用Linux

+a

选择编辑框中的所有文本

只适用Windows

2.清除整个表达式文本编辑框

单击Clear按钮。

重点

要删除表达式并确定其之前的内容不再控制属性,单击Clear按钮后单击Edit按钮。

3.返回到表达式的之前内容

Edit按钮编译表达式。如果进行了编辑改动且还没单击Edit按钮,可以单击Reload按钮恢复之前的表达式。单击Create或Edit按钮时,恢复表达式为后出现的内容。

1.1.7 使用文本编辑器编辑动画表达式

在Expression Editor中,可以启动外部文本编辑器创建并编辑表达式。文本编辑器中有用于编辑大表达式的特性。

为表达式启动文本编辑器时,可以只编辑文本编辑器中的实例表达式。但是,如果要同时检查或编辑几个表达式,可以为几个表达式开启一次文本编辑器。

为表达式启动文本编辑器之后,Expression Editor的文本编辑框变模糊,表示文本编辑器运行时不能操作。虽然是这样,但可以在表达式文本编辑框中运行另一个表达式。

硬盘上没有可以独立编辑Expression Editor的文件。使用通过Expression Editor的文本编辑器时,可以运行链接到场景中存储的表达式的临时文件。但是,可以复制独立文本文件的文本到临时文件中。

如果保存表达式但没有指定文件名,Maya读取保存的表达式并用场景存储。运行文本编辑器时,会看到表达式在表达式文本编辑框中变模糊。

关闭文本编辑器时,表达式文本编辑框条目不再模糊。关闭文本编辑器后,文本表达式编辑框激活。

如果退出文本编辑框而不保存表达式,则Maya不运行。因为表达式不改变,Maya的表达式复制也不需要改变。

提示

可以使用文本编辑器保存表达式到选择目录中的文件名。这是存档在不同场景中使用的表达式的方法。

1.选择文本编辑器(Mac OS X)

打开编辑器如TextEdit,编辑表达式。剪切并粘贴文本到Expressions Editor。

2.选择文本编辑器(Windows)

可以使用与文本文件相关的文本编辑器编辑表达式。例如,如果Notepad和.txt文本文件相关,从Expressions Editor的Edit菜单中选择Text Editor时,Maya启动Notepad。要使用不同的编辑器,结合选择的编辑器和.txt文件。

3.选择文本编辑器(Linux)

根据默认,在Maya Linux中,可以从Expressions Editor的Editor菜单中启动多个编辑器中的一个:

jot

vi

vim

xemacs

要运行不同的编辑器,详见使用Editor菜单中未列表显示的编辑器(Linux)。

4.启动菜单中列表显示的编辑器

(1)从Expression Editor的Editor下拉菜单中,选择一个编辑器。

(2)双击Selection列表中的对象名称、表达式名称或属性名称。显示编辑器。

编辑器的标题栏显示运行表达式时临时创建的文件名。编写或保存文件时,其内容复制到包含表达式的Maya场景上。

打开文本编辑器时,表达式文本编辑框未激活。可选择关闭Expression Editor窗口。

如果单击对象、属性或表达式的名称,文本编辑器不会出现。可以单击浏览表达式文本编辑框中的内容,而不打开文本编辑器。

如果双击表达式中已经分配数值的属性,控制属性的表达式出现在文本编辑器中。对于非颗粒表达式,可以分配到场景中的任意属性,不只是双击的属性。事实上,甚至不需要运行双击的属性。

如果双击尚未分配数值的属性,出现的文本编辑框中没有内容。如果再双击这个属性,出现新的编辑器实例。分配数值到表达式中的属性之后,可以为属性只开启一次编辑器。

(3)使用编辑器创建或编辑表达式。

(4)保存文件。

(5)确认Expression Editor检测没有语法错误。

(6)退出编辑器。

注意

如果已经为jot、vi、vim或xemacs创建Linux命令别名,Expression Editor会试着启动这个命令。如果Expression Editor不能使用命令别名中提供的参数,编辑器会意外操作,或不能启动。

禁止使用别名自定义编辑器的操作设置。

5.使用Editor菜单中未列表显示的编辑器(Linux)

如果工作站有一个未在Editor菜单中列表显示的文本编辑器,进行一些初始UNIX系统管理任务之后,可以使用这个文本编辑器。

启动未列表的编辑器

(1)在Linux的.cshrc文件中,设置WINEDITOR环境变量,指定想要的编辑器和 选项。

可以为编辑器选择有效选项,但必须指定编辑器在前景中运行(如果这个选项与编辑器相关)。

如果编辑器进程出现在启动的工具栏中,必须使WINEDITOR设置显示工具栏中的编辑器。

(2)退出系统并登录用户账号。

(3)重新启动Maya。

(4)从Editor下拉菜单中选择Other。

(5)双击Selection列表中的对象名称、表达式名称或属性名称。出现编辑框。

(6)使用编辑器创建或编辑表达式。

(7)保存文件。

(8)确认Expression Editor检测没有语法错误。

(9)退出编辑器。

6.更改编辑器的操作设置(Linux)

Maya使用默认操作设置,启动Editor菜单中列表显示的编辑器。可以使用一些初级系统管理任务,更改操作设置。

更改编辑器的操作设置

(1)设置WINEDITOR环境变量,指定想要的编辑器选项。

可以为编辑器选择有效选项,但必须指定编辑器在前景中运行(如果这个选项与编辑器相关)。例如,jot需要选项-f,vim需要选项-g -f,xemacs需要选项-nw。

为vi设置WINEDITOR的实例如下:

setenv WINEDITOR "xwsh -name mayaEditor -e vi"

为vim设置如下:

setenv WINEDITOR "xwsh -geometry 80x57+350+130 -bg 97 -e vim"

(2)退出系统并登录用户账号。

(3)重新启动Maya。

(4)从Editor下拉菜单中选择Other。

(5)双击Selection列表中的对象名称、表达式名称或属性名称。出现编辑框。

(6)使用编辑器创建或编辑表达式。

(7)保存文件。

(8)确认Expression Editor检测没有语法错误。

(9)退出编辑器。

7.为默认启动设置编辑器(Linux)

每次启动文本编辑器时,可以根据默认启动外部文本编辑器。

根据默认启动编辑器

(1)选择Window→Settings/Preferences→Preferences,出现Preferences窗口。

(2)在Categories列表中,单击Interface显示一般界面项。

(3)在Expression Editor菜单中选择编辑器。要选择WINEDITOR环境变量指定的编辑器,选择Other。

(4)单击Save。

(5)在Expression Editor中,双击Selection列表中的对象名称、表达式名称或属性 名称。

出现编辑器。下次启动Expression Editor时,根据默认,编辑器的名称出现在Editor下拉菜单中。

如果选定了Preferences窗口和Editor菜单中的不同文本编辑器,出现Preferences中选定的编辑器。

注意

如果通过Preferences或使用Expression Editor的Editor菜单指定文本编辑器,启动Channel Box或Attribute Editor中的Expression Editor,显示文本编辑器而不是Expression Editor。

单击New Expression按钮时,出现文本编辑框。

1.1.8 删除动画表达式

可以从控制属性中删除表达式,停止运行。

删除表达式

(1)在Expression Editor中显示表达式。

(2)单击Delete钮。

可以从场景中快速删除所有非颗粒表达式。在Maya主菜单栏中,选择Edit→Delete All by Type→Non-particle Expressions。

1.2 粒子表达式

1.2.1 关于粒子表达式

粒子表达式比其他类型的表达式更复杂。例如,同样可以编写表达式控制对象中的所有例子,也可以区别控制每一个颗粒。

执行粒子表达式不同于执行其他类型对象的表达式。要精通粒子表达式,必须比其他表达式进行更多的学习,但是生成的效果是值得付出努力的。这一章指导粒子表达式的复杂操作,如图1-5所示。

图1-5

1.2.2 粒子表达式

在Expressions编辑器,可以创建粒子表达式。

粒子单选按钮可以编写两种类型的表达式:创建和运行时间(动态计算前后)。可以为粒子形状节点的任意属性使用这两种类型。

一般在回放动画时或发散粒子时,执行创建表达式。运行时间表达式为除了回放帧和发散粒子的帧以外的每个帧执行,按照指定在动态赋值前后执行。根据默认,每种类型的表达式为对象中的每个粒子执行一次。

创建和运行时间表达式不同时执行。对象中每个粒子的年纪决定执行运行时间表达式还是创建表达式。执行细节在创建表达式执行和编写运行时间表达式中。

选择粒子形状节点时,Default Object、Evaluation和Convert Units选项变模糊,不能使用。

Default Object变模糊,是因为粒子形状节点的属性只能由一个创建表达式和一个运行时间表达式控制。粒子形状节点为选定对象时,总是默认对象。

Evaluation为粒子形状节点表达式变模糊,是因为它对粒子形状节点表达式不起作用。

Convert Units不可选,因为不能更改Maya如何处理粒子形状节点表达式的单位转换。

重点

不能像给其他类型的对象编写表达式一样给每个粒子形状属性编写不同的表达式。因为每个粒子形状只能编写一个创建表达式,不需要从Expression Editor的Attributes列表中选择属性。

1.2.3 创建表达式的执行

可以使用Particle Tool创建粒子表达式,回放动画时,执行创建表达式。对于发散的粒子,在发散粒子的帧上执行创建表达式。但是,对于下节中描述的那些规则,这是例外。

连续两次或多次回放动画而不播放动画,不能执行创建表达式。因为连续几次回放时,没有改变属性值,表达式不执行。

也可以注意到,每次打开场景时,编译并执行场景中所有的表达式。这种情况由于建筑原因而发生,对于表达式的运行不重要。

1.2.4 运行时间表达式的执行

对于使用Particle Tool创建的粒子,运行时间表达式在回放上出现的帧之后,动态计算前后的每个帧上执行。

对于发散的粒子,运行时间表达式在发散粒子的帧后的每个帧上执行。更具体地说,每次Maya赋值动态时,运行时间表达式就为年纪大于0的每个粒子运行一次。

无论何时Time Slider时间改变并且时间大于或等于粒子对象的Start Frame值,Maya都赋值动态。为设置粒子对象的Start Frame,选择粒子对象并设置Attribute Editor中的Start Frame。回放、播放或者更改显示的当前帧时,更改时间。

播放或更改动画时间时,运行时间表达式每帧每过度采样数执行一次。例如,如果过度采样数为4,Maya为对象中的每个粒子每帧执行四次粒子形状表达式。

从Dynamic菜单设置中,使用Solvers→Edit Oversampling or Cache Settings,设置Over Samples数值。Maya的默认设置为1。

除了动画时间改变时执行,表达式读取的参数值改变时,运行时间表达式也执行,还有属性的这些操作发生时,表达式编写为:

Maya中的某个其他节点使用其数值。

Maya需要数值重画工作区域的内容。

这种情景中,预定义的变量时间和帧也考虑为表达式读取的属性。

重点

除了粒子形状节点,没有其他节点的创建表达式。这样的对象只有一种类型的表达式。(类似于运行时间表达式。)

对于粒子形状节点,只能为所有属性编写一个运行时间表达式。不需要从Attribute列表中选择属性。每个粒子形状只能创建一个运行时间表达式。

1.2.5 设置动态开始帧

Maya赋值动态时,创建表达式只为年纪是0的每个粒子执行一次。不论何时动态时 间或粒子的当前时间改变,Maya都赋值动态,且大于或等于粒子性状的Start Frame设 置——默认为帧1。

回放、播放或者更改显示的当前帧时,动画时间改变。

发散粒子的年纪在发散的帧上为0。

使用Particle Tool创建的粒子在Start Frame上和之前年纪为0。使用默认动画帧范围和Start Frame,回放动画到帧1返回年纪为0的粒子。

如果设置Time Slider的开始帧大于Start Frame,注意回放动画可能使粒子的年纪大于0。如果发生这种情况,粒子的创建规则不会执行。

提示

可以设置Attribute Editor中的选项显示工作空间里对象粒子的年纪。设置粒子形状的Particle Render Type为Numeric。单击Add Attributes For旁边的Current Render Type,然后在Attribute Name框中输入年纪。年纪出现在每个粒子的旁边。

在粒子表达式中输入print(age+“n”),也可以检查对象的粒子年纪。

1.2.6 设置原始状态使用的属性

如果在某帧上保存了其原始状态的粒子形状的属性,回放动画不会返回粒子的年纪 为0。

假设,播放动画时,创建含有不透明属性逐渐淡化的粒子网格。在网格的不透明度看上去像动画起点的某个帧上停止动画,然后选择网格。从Dynamics菜单设置中,选择Solvers →Initial State→Set For Selected,使对象属性的当前值——包括年纪——变为原始状态值。

如果回放动画,网格上粒子的年纪等于选择Set For Selected时候的年纪。因此,回放场景时,粒子的年纪不等于0。

1.2.7 编写创建表达式

创建表达式用于动画过程中不需要改变的属性。例如,想要对象中的所有粒子在动画期间都有一个速度。

创建表达式也用于在运行时间表达式控制后面帧的属性值之前,初始化帧的属 性值。

实例

假设使用Particle Tool在工作空间内放置一个粒子的集合,然后创建下列创建表达式控制其速度。

particleShape1.velocity = >;

如图1-6所示,播放动画时,所有粒子都向Y轴方向,以每秒一网格单位的速度移动。

重点

要使用表达式控制粒子属性,确定在Expression Editor中选定的对象是粒子形状节点,不是粒子对象的变形节点。

如果选定粒子对象的变形节点,而不是粒子形状节点,移动鼠标指示器到工作空间,按下键盘上的向下箭头。这样就选择了粒子形状节点。

1.2.8 编写运行时间表达式

播放动画时,运行时间表达式控制动态计算前或后的属性。每次执行表达式时,Maya都更新在运行时间表达式中被赋值的属性。选定时,可以在动态赋值之前进行更新,或者在动态赋值之后进行更新。这种情况在每帧上发生一次。

如果属性不是由运行时间表达式设置,则属性使用后面动画帧的创建表达式的数值。

实例

假设创建完成粒子网格,然后创建其速度属性的运行时间表达式:

particleShape1.velocity = >;

播放动画时,表达式向上以每秒1网格单位的速度移动粒子网格,如图1-7所示。

图1-6 图1-7

要使本章或后面章节中更容易观察粒子的图示,可以显示为较小的着色球体,而不 是点。

显示粒子为球体

(1)选择粒子形状节点。

(2)在Attribute Editor的Render Attributes部分,为Particle Render Type选择Spheres。

(3)单击Add Attributes For旁边的Current Render Type按钮,Radius滑动器出现在按钮下边。

(4)调整Radius,设置球体大小。

(5)打开Shading→Smooth Shade All(在工作空间的左上角)。

粒子以24帧/秒的默认帧率,每帧移动1/24的一个网格单位。运行表达式以默认过度采样数值1,每帧执行一次。Maya为对象的每个粒子都计算一次运行时间表达式。

因为表达式设置速度为每帧>,表达式执行过多。因此,这个表达式更适合为创建表达式。但是,在这个例子中两种表达式的效果都是一样的。

实例

假设创建完成粒子网格,动画的开始帧数为0。为其速度属性创建运行时间表达式:

particleShape1.velocity = >;

播放动画时,表达式以时间的增加值增加速度的Y成分。这使网格中所有粒子都随着时间的增加而上升。增加的速度和加速度一样。如图1-8所示。

需要使用运行时间表达式中的语句,而不是创建表达式的语句,因为正在每帧上增加赋值的数值。

使用创建表达式中的语句会代替设置速度为常量值>,因为创建表达式为粒子网格执行时,时间等于0。

实例

之前的例子中给出的所有粒子的速度属性值都相等。可以代替给定每个粒子一个不同的属性值。

假设创建完成121个粒子的网格,如图1-9所示。

图1-8 图1-9

进一步假设,为其加速度属性创建运行时间表达式:

particleShape1.acceleration = sphrand(2);

每次执行运行时间表达式时,表达式都为121个粒子中的每一个都执行一次。

功能sphrand(2)提供一个矢量,其随机选定的成分位于以起点为中心,半径为2的虚构球体中。每个粒子都得到一个不同的矢量值。

因为每个粒子都得到了每帧加速度上的不同随机矢量,播放场景时,粒子分别以不断改变的方向和速率加速。这样使加速度在方向上突然改变,如图1-10所示。

图1-10

重点

要给定粒子一个常量加速度,在运行时间表达式中给加速度属性赋值常量值,而不是在创建表达式中赋值。

Maya模拟物理加速。在每帧之前使加速度初始化为>,或者如果过度采样数值大于1,在每个时间单位前初始化。

实例

假设设置动画的开始帧为0,并使用Particle Tool在起点上放置一个粒子,如图1-11所示。

图1-11

然后创建运行时间表达式,控制其位置。

particleShape1.position = >;

播放动画时,运行时间表达式控制属性。在播放的帧上,粒子跳到>。因为时间值是0.0417,所以在24帧/秒的默认帧率上,位置是>,如图1-12所示。

图1-12

后面的每帧以时间增量值设置的比率向上移动粒子,如图1-13所示。

图1-13

停止或回放动画时,粒子移动回到起点,即使用Particle Tool创建时粒子的原始位置。创建粒子时,Maya存储其原始位置于内部保留初始状态的名为position0的属性中。

因为这个属性没有控制其值的创建表达式,Maya设置这个属性为原始状态position0的数值>。

回放之后,要阻止粒子跳回起点,可以编写一个和运行时间表达式一样的创建表达式:

particleShape1.position = >;

回放动画时,粒子移动到位置>。因为时间在帧0上为0,回放动画时粒子在位置>上开始。在第二及后面的帧上,粒子与时间增值同步向上移动。

虽然这个例子显示了如何使用创建表达式初始化位置属性,但是保存原始状态使用的对象当前属性值,也可以得到相似结果:

保存原始状态使用的当前属性:

(1)选择粒子形状节点。

(2)推进动画到帧1。这里,粒子位置是>。

(3)从Dynamics菜单设置中选择Solvers→Initial State →Set for Selected。

回放动画时,Maya在位置属性原始状态设置上放置对象。因为选定Set for Selected时,位置等于>,所以这个设置为>。

1.2.9 运行粒子属性

创建粒子对象时,它有两种静态属性:

变形节点的属性

粒子形状节点的属性

这些属性永远都是粒子对象的一部分。可以不运行部分变形节点的静态属性,例如,scaleX、translateX,等等。这些属性控制整个粒子对象的变形节点的位置和方向,而不是单独粒子的位置和方向。

可以代替运行粒子形状节点的静态属性,例如,位置、速度、加速度和年纪。为选定的粒子对象选择Object Filter→Dynamics→Particles时,这些属性出现在Expression Editor的Attributes列表中。

1.2.10 添加动态属性

也可以使用表达式控制动态和自定义属性添加到粒子形状节点。

添加动态属性到对象时,属性名称出现在Expression Editor的Attributes列表中。

1.2.11 了解每粒子和每对象属性

可以动态添加两种属性到粒子形状节点上:

每粒子

每对象

每粒子属性可以分别为对象的每个粒子设置属性值。每对象属性可以为对象的所有粒子共同使用一个数值设置属性值。

例如,每粒子opacityPP属性可以为对象的每个粒子设置的不透明值。使用每对象不透明属性,必须给定对象的所有粒子相同的不透明度。

每粒子属性可以为对象中的每个粒子保留属性值。例如,虽然在粒子对象中只有一个opacityPP属性,但是这个属性为每个粒子的不透明值都保留了数值。这个属性以排列的方式保留数值。简单而言,排列就是列表。

虽然每粒子属性是创建复杂效果的好选择,但是不能格点设定。可以格点设定每对象属性。

可以为不透明度、色彩和其他效果添加每粒子或每对象属性。

对于粒子形状节点属性,通过检查Attribute Editor的粒子形状选项卡,可以分辨是每粒子或每对象属性。所有的每粒子属性出现在选项卡的Per Particle(Array)Attributes部分。

每对象属性出现在选项卡的其他位置。对数出现在Per Particle(Array)Attributes部分的上面,例如,在Particle Attributes和Render Attributes部分。

对于多个动态添加的属性,通过在Expression Editor中的名称,也可以分辨是每粒子或每对象属性。如果名称以PP结尾,则是每粒子属性。不然,一般是每对象属性。

虽然位置、速度和加速度不以PP结尾,但它们都是每粒子属性。

创建粒子形状的动态每对象或每粒子属性,常用的方法是单击Attribute Editor的Add Dynamic Attributes部分中的Opacity或Color按钮。

例如,如果单击Opacity按钮,出现窗口并选择添加不透明特性为每对象属性或每粒子属性。

如果选择每粒子属性,Expression Editor的Attributes列表显示选定粒子形状节点的新属性:opacityPP。如果选择每对象属性,代替显示为opacity属性。

如果为特性添加每粒子属性和每对象属性,每粒子属性有优先权。例如,如果添加opacity和opacityPP,opacityPP属性控制指定对象粒子的不透明度。

重点

只能在粒子表达式中使用每粒子属性。在粒子或非粒子表达式中可以使用每对象属性。

如果使用运行时间表达式读取或编写含有多个粒子的粒子对象的每对象属性,可以通过读取或编写非粒子表达式中的属性,加速执行表达式。

每对象属性只执行一次非粒子表达式。粒子表达式为对象中的每个粒子都执行一次。因为读取或编写每对象属性多于每帧一次是多余的,可以运行非表达式中的读取和编写以节约处理时间。

1.2.12 了解原始状态属性

对于所有的动态每粒子属性,Maya保留以0结尾的名称对应的属性。例如,动态属性位置、速度和加速度的对应物为position0、velocity0和acceleration0。

以0结尾的属性名称保留属性的原始状态值。保留原始状态使用的对象当前属性值时,Maya分配这些数值到原始状态属性上。

要保存原始状态使用的粒子对象属性值,使用Dynamics菜单设置中的命令之一。

Solvers→Initial State→Set for Selected

这样,保存选定的粒子形状节点或刚体的所有每粒子属性。

Solvers→Initial State→Set for All Dynamic

这样,保存场景中所有动态对象的所有每粒子属性值——换句话说,是所有粒子形状节点和刚体。

单击Attribute Editor的Add Dynamic Attributes部分中的一个按钮,动态添加每粒子属性时,Maya也添加以0结尾的名称的对应原始状态属性。例如,单击Attribute Editor中的Opacity按钮,并添加每粒子不透明属性,Maya也会添加opacityPP0。

虽然原始状态属性不出现在Expression Editor中,但是可以读取它的数值,如使用输出语句,恢复原始状态。

使用Add Attribute窗口添加自定义每粒子(排列)属性到粒子形状时,必须选择开启或关闭Add Initial State Attribute进行添加。如果选择开启,Maya创建添加属性的对应原始状态属性。如果选择关闭,Maya不创建添加属性的对应原始状态属性。没有这个对应属性,不能保存原始状态使用的粒子对象的当前属性值。如果决定在初始化回放动画上的自定义属性值,必须编写创建表达式。

注意

每粒子属性在Add Attribute窗口中叫做排列属性。这两个术语意思相同。

使用MEL listAttributes命令,可以查看开启或关闭Add Initial State Attribute进行添加自定义属性。

可能想要读取表达式中原始状态属性值,例如,使用某个计算的原始(回放)值。如果赋值到原始状态属性。如果保存原始状态使用的属性值,Maya会改写数值。

添加自定义属性到节点形状时,名称不要以0字符结尾。否则会颠覆与属性相关的原始状态属性的命名方案。

对于任何属性,如果不适用创建表达式初始化其数值,或保留初始状态使用的数值,Maya在动画的帧给定属性默认值。赋值属性为适合数据类型的0或>。其他情况下,例如opacityPP和opacity,Maya赋值属性为默认值1。

如果知道正在为自定义属性编写创建表达式,添加属性时可以设置关闭Add Initial State Attribute。否则,添加自定义属性时,设置开启Add Initial State Attribute。

创建表达式赋值给属性时,数值覆盖年纪为0的所有粒子的属性原始状态值。

1.赋值动态每粒子属性的实例

假设使用Particle工具在格状图样椎体周围创建少量的红色粒子,粒子对象名为Squares,以大点的Points渲染类型显示,所以粒子看上去像是不透明的大方块,如图1-14所示。

下面步骤显示如何赋值到opacityPP,这样每个粒子都有不同的随机不透明度。

使用每粒子opacityPP属性:

(1)在工作空间内,打开Shading→Smooth Shade All。

(2)选择Outliner或Hypergraph中Squares



原文赏析:

暂无原文赏析,正在全力查找中!


其它内容:

编辑推荐

ZBrush业内高手张盛(ZSZS)、方正(北欧之尘)、高渊、张全然、阮效果、李英、郑鸿升(蜘蛛工房)、段文兴(刀客)、郝金健、龙杰升(变色龙)和刘海凡(机械隔壁凡)的**作品和学习ZBrush软件的心得。

  软件功能包括:

  界面、基础操作、常用设置、人体比例、人体结构、

  ZSphere模型、雕刻模型、模型Topology结构、深入雕刻模型、

  ZSketch功能、Unified Skin统一蒙皮、次工具、与3ds Max配合等  

  小案例包括:

  卡通超人制作、短裙制作、宇宙中的星球、蜘蛛侠胸像、

  小丑鱼“尼莫”、卡通汽车“闪电麦坤”、钢铁侠次世代游戏模型  

  金刚狼案例涵盖

  准备工作、ZSphere模型制作、ZSketch与ZSphere绑定、绘制ZSketch模型、

  调整身体比例、简略雕刻、重新拓扑模型、添加头上的次工具、

  深入雕刻头部、身体部分、裤子、鞋子、腰带、背心、

  金刚狼裤子次世代游戏模型

超值光盘!!4DVD20小时高清视频教程海量素材及工程文件


前言

当今三维动画领域(包括影视动画、电视广告、3D动画片、游戏、建筑、产品展示、可视化……)的软件可谓是百花争鸣,但其中却是良莠不齐,绝大部分软件功能都不是很全面,因此严重地影响了软件的使用率。而唯独Maya拥有着全面的功能,而且用户群非常之大,因此Maya也就成为了


书籍介绍

《Maya总动员:动画编程篇》以Maya 2010版及Maya 2011版本为依托,详细地介绍了各种Maya动画编程技术。具体内容包括动画表达式、粒子表达式、常用函数、表达式编辑器、MEL脚本基础内容、数值与变量、数据类型、创建界面、句法、脚本范例、Python的使用、Python和线程、MEL与Python的重要差异、程序编译简介、导出插件程序、使用API编辑节点、API多线程插件、多边形API和Maya Python API、分配Maya插件等。

《Maya总动员:动画编程篇》附带4张DVD,近20小时的视频教学,全方位地以视频教学的方式展现了Maya的强大程序功能,使学习枯燥的程序编写变得简单易懂。光盘内容包括表达式的常用函数学习、表达式的应用、粒子表达式应用、MEL脚本命令操作、函数定义操作、自定义窗口、Python介绍、Python语法规则、Python元素的引用方法、Python内置函数、Maya API插件编写及应用实例等。光盘内容是图书内容的延伸和补充,是全面学习Maya程序高级功能最为经典的不可多得的珍贵教学资料。


书籍真实打分

  • 故事情节:7分

  • 人物塑造:9分

  • 主题深度:3分

  • 文字风格:9分

  • 语言运用:7分

  • 文笔流畅:8分

  • 思想传递:4分

  • 知识深度:3分

  • 知识广度:4分

  • 实用性:8分

  • 章节划分:8分

  • 结构布局:3分

  • 新颖与独特:4分

  • 情感共鸣:7分

  • 引人入胜:8分

  • 现实相关:5分

  • 沉浸感:8分

  • 事实准确性:5分

  • 文化贡献:3分


网站评分

  • 书籍多样性:7分

  • 书籍信息完全性:9分

  • 网站更新速度:7分

  • 使用便利性:8分

  • 书籍清晰度:3分

  • 书籍格式兼容性:9分

  • 是否包含广告:3分

  • 加载速度:3分

  • 安全性:8分

  • 稳定性:5分

  • 搜索功能:6分

  • 下载便捷性:9分


下载点评

  • 经典(634+)
  • 速度慢(303+)
  • 服务好(168+)
  • 书籍完整(518+)
  • azw3(370+)
  • 内容完整(592+)
  • 体验还行(580+)
  • 无水印(500+)
  • 内容齐全(287+)
  • 五星好评(573+)
  • epub(580+)
  • 体验差(334+)
  • 简单(63+)

下载评价

  • 网友 堵***格:

    OK,还可以

  • 网友 权***波:

    收费就是好,还可以多种搜索,实在不行直接留言,24小时没发到你邮箱自动退款的!

  • 网友 堵***洁:

    好用,支持

  • 网友 隗***杉:

    挺好的,还好看!支持!快下载吧!

  • 网友 薛***玉:

    就是我想要的!!!

  • 网友 马***偲:

    好 很好 非常好 无比的好 史上最好的

  • 网友 屠***好:

    还行吧。

  • 网友 孙***美:

    加油!支持一下!不错,好用。大家可以去试一下哦

  • 网友 通***蕊:

    五颗星、五颗星,大赞还觉得不错!~~

  • 网友 戈***玉:

    特别棒

  • 网友 车***波:

    很好,下载出来的内容没有乱码。

  • 网友 晏***媛:

    够人性化!


随机推荐