继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

变形入门:轻松掌握基础技巧

临摹微笑
关注TA
已关注
手记 286
粉丝 32
获赞 169
概述

本文介绍了变形在计算机图形学中的基本概念和应用领域,包括游戏开发、电影特效、3D建模等。文章详细解释了变形的基本原理和数学变换方法,并提供了示例代码和实际应用案例。通过学习这些内容,读者可以轻松掌握变形的基础技巧。

变形入门:轻松掌握基础技巧
变形基础概念介绍

变形的定义

变形是指在计算机图形学中,将一个对象从一种形状或形式转换为另一种形状或形式的操作。这种转换可以通过各种函数和算法实现,广泛应用于游戏开发、电影特效、3D建模等领域。变形不仅仅是简单地改变对象的大小或位置,而是涉及复杂的数学变换,如平移、旋转、缩放等。

变形的应用领域

变形技术在多个领域都有广泛应用,包括但不限于:

  • 游戏开发:在游戏中,角色动画、环境变化等都需要变形技术来实现。
  • 电影特效:影视作品中常见的道具变形、角色变形等都离不开变形技术。
  • 3D建模:在3D建模软件中,变形是塑造模型的重要手段之一。
  • 虚拟现实:VR应用中的虚拟对象也需要变形支持,以适应不同的视角和交互方式。
  • 动画制作:无论是2D还是3D动画,变形都是塑造角色和物体动画的基础技术。

变形的基本原理

变形的基本原理是基于数学变换,主要通过以下几种方式实现:

  • 平移:将对象沿着坐标轴移动一定的距离。
  • 旋转:将对象绕着一个固定点或轴旋转一定的角度。
  • 缩放:将对象在某个方向上放大或缩小。
  • 镜像:将对象沿某个轴对称翻转。
  • 扭曲:将对象在某个区域内非均匀地拉伸或压缩。

这些变换通常使用矩阵来表示,并通过矩阵运算实现。例如,一个简单的二维平移变换可以表示为:

[ \begin{pmatrix} x' \ y' \end{pmatrix} = \begin{pmatrix} x \ y \end{pmatrix} + \begin{pmatrix} dx \ dy \end{pmatrix} ]

其中,( (x, y) ) 是原始坐标,( (x', y') ) 是变换后的新坐标,( (dx, dy) ) 表示平移的向量。

示例代码

下面是一个简单的Python代码示例,演示了二维平移变换:

import numpy as np

def translate_point(point, dx, dy):
    """
    平移一个二维点
    :param point: 一个二维点 (x, y)
    :param dx: 沿x轴平移的距离
    :param dy: 沿y轴平移的距离
    :return: 平移后的二维点
    """
    point = np.array(point)
    translation_vector = np.array([dx, dy])
    translated_point = point + translation_vector
    return translated_point.tolist()

point = [1, 2]
translated_point = translate_point(point, 3, 4)
print("原始点:", point)
print("平移后的点:", translated_point)

实际应用

在实际应用中,变形技术通常用于处理复杂的几何图形和动画效果。例如,在游戏开发中,可以通过变形技术实现角色的动画效果,如行走、跳跃等。在电影特效中,变形技术可以用于实现物体变形或角色动画等效果。

变形工具和软件选择

常用变形工具简介

变形工具的选择取决于具体的应用需求和使用场景。以下是一些常用的变形工具:

  • Maya:Autodesk公司开发的专业级3D建模、动画和渲染软件,广泛应用于影视特效、游戏开发等领域。
  • Blender:一款开源的3D建模、动画和渲染软件,支持多种文件格式和插件,适合初学者和专业用户。
  • Unity:虽然以游戏开发为主,但Unity也提供了丰富的变形和动画功能,支持2D和3D动画。
  • 3ds Max:Autodesk公司的另一款3D建模和动画软件,广泛应用于电影和游戏行业。
  • Houdini:SideFX公司开发的3D动画和视觉特效软件,特别适合复杂的几何变形和动态模拟。

选择适合的软件

选择适合的变形工具需要考虑以下因素:

  • 功能需求:根据应用领域的不同,选择具备相应功能的软件。例如,如果主要进行电影特效,可能需要选择Maya或Houdini;如果主要进行游戏开发,则可以使用Unity或Blender。
  • 用户界面:对于初学者来说,一款界面友好、易于上手的软件会更加合适。比如Blender和Unity都有相对简单易懂的界面。
  • 社区支持:选择一个有活跃社区支持的软件可以更容易获得帮助。例如,Blender和Unity都有庞大的用户社区和丰富的在线资源。
  • 跨平台兼容性:如果需要在多个平台上进行开发,选择跨平台兼容性好的软件会更加方便。比如Blender可以在多种操作系统上运行。
  • 成本:一些专业软件可能价格较高,而开源软件如Blender则免费提供。选择适合自己预算的工具至关重要。

安装和基本设置

安装和配置变形工具需要遵循具体的安装指南。以下是一个简单的安装和基本设置步骤,以Blender为例:

  1. 下载安装包

    • 访问Blender的官方网站,下载适合的操作系统版本。
    • 根据提示完成安装过程。
  2. 启动Blender

    • 安装完成后,启动Blender软件。
    • 进入Blender的主界面,了解各个栏位的含义。
  3. 基本设置
    • 调整界面布局:可以通过菜单栏中的“编辑器类型”选项调整界面布局,以适应自己的工作流程。
    • 设置偏好设置:点击顶部菜单的“编辑” -> “偏好设置”,可以调整界面语言、主题、文件路径等偏好设置。

示例代码(Blender)

下面是一个简单的Blender Python脚本,演示了如何创建一个基本的3D立方体:

import bpy

# 清除场景中的所有物体
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_all_scene_objects=True)

# 添加一个立方体
bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0))

# 应用变换
bpy.ops.transform.translate(value=(1, 1, 1))
bpy.ops.transform.rotate(value=0.5, orient_axis='X')
bpy.ops.transform.resize(value=(1.5, 1.5, 1.5))

# 渲染设置
bpy.context.scene.render.resolution_x = 800
bpy.context.scene.render.resolution_y = 600
bpy.context.scene.render.resolution_percentage = 100

# 保存文件
bpy.ops.wm.save_as_mainfile(filepath="cube.blend")

实际应用

在实际应用中,选择和安装合适的变形工具是非常重要的。不同的工具适用于不同的场景和需求。例如,在游戏开发中,Unity提供了丰富的动画和变形功能;而在电影特效中,Maya则提供了更多的高级功能。选择合适的工具可以大大提高开发效率和质量。

初级变形技巧教程

简单的二维变形操作

平移

平移是将对象沿坐标轴移动一定的距离。在二维平移中,通常涉及到x轴和y轴的移动。可以使用矩阵或向量来表示平移操作。

公式表示为:
[ \begin{pmatrix} x' \ y' \end{pmatrix} = \begin{pmatrix} x \ y \end{pmatrix} + \begin{pmatrix} dx \ dy \end{pmatrix} ]

其中,( (x, y) ) 是原始坐标,( (x', y') ) 是平移后的坐标,( (dx, dy) ) 表示平移的距离。

旋转

旋转是将对象绕着一个固定点或轴旋转一定的角度。在二维旋转中,通常绕着原点(0,0)进行旋转。可以通过以下公式表示:

[ \begin{pmatrix} x' \ y' \end{pmatrix} = \begin{pmatrix} \cos(\theta) & -\sin(\theta) \ \sin(\theta) & \cos(\theta) \end{pmatrix} \begin{pmatrix} x \ y \end{pmatrix} ]

其中,( \theta ) 表示旋转的角度。

缩放

缩放是将对象在某个方向上放大或缩小。在二维缩放中,通常涉及到x轴和y轴的缩放。可以通过以下公式表示:

[ \begin{pmatrix} x' \ y' \end{pmatrix} = \begin{pmatrix} sx & 0 \ 0 & sy \end{pmatrix} \begin{pmatrix} x \ y \end{pmatrix} ]

其中,( sx ) 和 ( sy ) 表示x轴和y轴的缩放因子。

示例代码(二维变形)

下面是一个Python代码示例,演示了二维平移、旋转和缩放操作:

import numpy as np

def translate(point, dx, dy):
    """
    平移一个二维点
    :param point: 一个二维点 (x, y)
    :param dx: 沿x轴平移的距离
    :param dy: 沿y轴平移的距离
    :return: 平移后的二维点
    """
    point = np.array(point)
    translation_vector = np.array([dx, dy])
    translated_point = point + translation_vector
    return translated_point.tolist()

def rotate(point, theta):
    """
    旋转一个二维点
    :param point: 一个二维点 (x, y)
    :param theta: 旋转的角度
    :return: 旋转后的二维点
    """
    point = np.array(point)
    rotation_matrix = np.array([
        [np.cos(theta), -np.sin(theta)],
        [np.sin(theta), np.cos(theta)]
    ])
    rotated_point = np.dot(rotation_matrix, point)
    return rotated_point.tolist()

def scale(point, sx, sy):
    """
    缩放一个二维点
    :param point: 一个二维点 (x, y)
    :param sx: x轴的缩放因子
    :param sy: y轴的缩放因子
    :return: 缩放后的二维点
    """
    point = np.array(point)
    scaling_matrix = np.array([
        [sx, 0],
        [0, sy]
    ])
    scaled_point = np.dot(scaling_matrix, point)
    return scaled_point.tolist()

# 示例点
point = [1, 2]

# 平移
translated_point = translate(point, 3, 4)
print("平移后的点:", translated_point)

# 旋转
rotated_point = rotate(point, np.pi / 4)  # 旋转45度
print("旋转后的点:", rotated_point)

# 缩放
scaled_point = scale(point, 2, 2)
print("缩放后的点:", scaled_point)

实际应用

在实际应用中,二维变形操作可以用于处理图像和二维图形。例如,在游戏开发中,可以使用二维变形技术实现角色的动画效果;在图像处理中,可以使用二维变形技术进行图像的裁剪、缩放和旋转等操作。

初级的三维变形实践

平移

三维平移是将对象沿x、y和z轴移动一定的距离。可以通过以下公式表示:

[ \begin{pmatrix} x' \ y' \ z' \end{pmatrix} = \begin{pmatrix} x \ y \ z \end{pmatrix} + \begin{pmatrix} dx \ dy \ dz \end{pmatrix} ]

其中,( (x, y, z) ) 是原始坐标,( (x', y', z') ) 是平移后的坐标,( (dx, dy, dz) ) 表示平移的距离。

旋转

三维旋转可以绕着x轴、y轴或z轴进行旋转。可以通过以下公式表示:

  • 绕x轴旋转:
    [ \begin{pmatrix} x' \ y' \ z' \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 \ 0 & \cos(\theta) & -\sin(\theta) \ 0 & \sin(\theta) & \cos(\theta) \end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} ]

  • 绕y轴旋转:
    [ \begin{pmatrix} x' \ y' \ z' \end{pmatrix} = \begin{pmatrix} \cos(\theta) & 0 & \sin(\theta) \ 0 & 1 & 0 \ -\sin(\theta) & 0 & \cos(\theta) \end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} ]

  • 绕z轴旋转:
    [ \begin{pmatrix} x' \ y' \ z' \end{pmatrix} = \begin{pmatrix} \cos(\theta) & -\sin(\theta) & 0 \ \sin(\theta) & \cos(\theta) & 0 \ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} ]

缩放

三维缩放是将对象在x、y和z轴上放大或缩小。可以通过以下公式表示:

[ \begin{pmatrix} x' \ y' \ z' \end{pmatrix} = \begin{pmatrix} sx & 0 & 0 \ 0 & sy & 0 \ 0 & 0 & sz \end{pmatrix} \begin{pmatrix} x \ y \ z \end{pmatrix} ]

其中,( sx )、( sy ) 和 ( sz ) 分别表示x轴、y轴和z轴的缩放因子。

示例代码(三维变形)

下面是一个Python代码示例,演示了三维平移、旋转和缩放操作:

import numpy as np

def translate(point, dx, dy, dz):
    """
    平移一个三维点
    :param point: 一个三维点 (x, y, z)
    :param dx: 沿x轴平移的距离
    :param dy: 沿y轴平移的距离
    :param dz: 沿z轴平移的距离
    :return: 平移后的三维点
    """
    point = np.array(point)
    translation_vector = np.array([dx, dy, dz])
    translated_point = point + translation_vector
    return translated_point.tolist()

def rotate_x(point, theta):
    """
    绕x轴旋转一个三维点
    :param point: 一个三维点 (x, y, z)
    :param theta: 旋转的角度
    :return: 绕x轴旋转后的三维点
    """
    point = np.array(point)
    rotation_matrix = np.array([
        [1, 0, 0],
        [0, np.cos(theta), -np.sin(theta)],
        [0, np.sin(theta), np.cos(theta)]
    ])
    rotated_point = np.dot(rotation_matrix, point)
    return rotated_point.tolist()

def rotate_y(point, theta):
    """
    绕y轴旋转一个三维点
    :param point: 一个三维点 (x, y, z)
    :param theta: 旋转的角度
    :return: 绕y轴旋转后的三维点
    """
    point = np.array(point)
    rotation_matrix = np.array([
        [np.cos(theta), 0, np.sin(theta)],
        [0, 1, 0],
        [-np.sin(theta), 0, np.cos(theta)]
    ])
    rotated_point = np.dot(rotation_matrix, point)
    return rotated_point.tolist()

def rotate_z(point, theta):
    """
    绕z轴旋转一个三维点
    :param point: 一个三维点 (x, y, z)
    :param theta: 旋转的角度
    :return: 绕z轴旋转后的三维点
    """
    point = np.array(point)
    rotation_matrix = np.array([
        [np.cos(theta), -np.sin(theta), 0],
        [np.sin(theta), np.cos(theta), 0],
        [0, 0, 1]
    ])
    rotated_point = np.dot(rotation_matrix, point)
    return rotated_point.tolist()

def scale(point, sx, sy, sz):
    """
    缩放一个三维点
    :param point: 一个三维点 (x, y, z)
    :param sx: x轴的缩放因子
    :param sy: y轴的缩放因子
    :param sz: z轴的缩放因子
    :return: 缩放后的三维点
    """
    point = np.array(point)
    scaling_matrix = np.array([
        [sx, 0, 0],
        [0, sy, 0],
        [0, 0, sz]
    ])
    scaled_point = np.dot(scaling_matrix, point)
    return scaled_point.tolist()

# 示例点
point = [1, 2, 3]

# 平移
translated_point = translate(point, 3, 4, 5)
print("平移后的点:", translated_point)

# 绕x轴旋转
rotated_x_point = rotate_x(point, np.pi / 4)  # 绕x轴旋转45度
print("绕x轴旋转后的点:", rotated_x_point)

# 绕y轴旋转
rotated_y_point = rotate_y(point, np.pi / 4)  # 绕y轴旋转45度
print("绕y轴旋转后的点:", rotated_y_point)

# 绕z轴旋转
rotated_z_point = rotate_z(point, np.pi / 4)  # 绕z轴旋转45度
print("绕z轴旋转后的点:", rotated_z_point)

# 缩放
scaled_point = scale(point, 2, 2, 2)
print("缩放后的点:", scaled_point)

实际应用

在实际应用中,三维变形操作可以用于处理3D模型和动画。例如,在游戏开发中,可以使用三维变形技术实现角色的动画效果;在3D建模中,可以使用三维变形技术进行模型的变形和修改。

变形中的常见问题解答

常见错误及解决方法

在变形过程中,经常会遇到一些常见错误。以下是几个常见的问题及其解决方法:

  1. 变形结果不正确

    • 原因:可能是因为参数设置错误,或者变形函数实现有误。
    • 解决方法:检查参数设置是否正确,并核对变形函数的实现是否符合预期。
  2. 变形结果不平滑

    • 原因:可能是因为变形过程中的插值或过渡效果设置不当。
    • 解决方法:调整插值或过渡效果的参数,使其更加平滑。
  3. 变形结果超出预期范围

    • 原因:可能是因为缩放或旋转参数设置过大。
    • 解决方法:调整缩放或旋转参数,使其在合理的范围内。
  4. 变形结果出现扭曲

    • 原因:可能是因为变形过程中涉及到了复杂的变形操作,导致结果出现扭曲。
    • 解决方法:简化变形操作,或者引入辅助工具来纠正变形结果。
  5. 变形结果不一致
    • 原因:可能是因为不同的软件或工具实现的方式不同,导致结果不一致。
    • 解决方法:选择合适的变形工具,并确保使用相同的方法和参数进行变形。

参数调整技巧

在调整变形参数时,以下几个技巧可以帮助你更好地控制变形效果:

  1. 逐步调整

    • 技巧:逐步调整参数,观察每次调整后的效果,确保变形效果符合预期。
    • 示例代码

      import numpy as np
      
      def scale(point, sx, sy):
       """
       缩放一个二维点
       :param point: 一个二维点 (x, y)
       :param sx: x轴的缩放因子
       :param sy: y轴的缩放因子
       :return: 缩放后的二维点
       """
       point = np.array(point)
       scaling_matrix = np.array([
           [sx, 0],
           [0, sy]
       ])
       scaled_point = np.dot(scaling_matrix, point)
       return scaled_point.tolist()
      
      point = [1, 2]
      for sx in np.arange(0.5, 2.0, 0.1):
       for sy in np.arange(0.5, 2.0, 0.1):
           scaled_point = scale(point, sx, sy)
           print(f"缩放因子: ({sx}, {sy}), 缩放后的点: {scaled_point}")
  2. 使用插值

    • 技巧:使用插值技术,使变形过程更加平滑。
    • 示例代码

      import numpy as np
      
      def interpolate(start, end, steps):
       """
       使用线性插值生成中间点
       :param start: 起始点
       :param end: 结束点
       :param steps: 插值步数
       :return: 生成的插值点列表
       """
       interval = (np.array(end) - np.array(start)) / steps
       points = [start + i * interval for i in range(steps + 1)]
       return points
      
      start = [1, 2]
      end = [5, 6]
      steps = 5
      interpolated_points = interpolate(start, end, steps)
      print("插值点列表:", interpolated_points)
  3. 验证变形效果

    • 技巧:在变形过程中,定期验证变形效果,确保满足预期。
    • 示例代码

      import numpy as np
      
      def validate_deformation(points, expected_points):
       """
       验证变形后的点与预期点是否一致
       :param points: 实际变形后的点列表
       :param expected_points: 预期点列表
       :return: 验证结果
       """
       return np.allclose(points, expected_points)
      
      points = [[1, 2], [3, 4], [5, 6]]
      expected_points = [[1.5, 2.5], [3.5, 4.5], [5.5, 6.5]]
      is_valid = validate_deformation(points, expected_points)
      print("验证结果:", is_valid)
  4. 对比多种变形方式

    • 技巧:尝试使用不同的变形方法,对比结果,选择最优的方法。
    • 示例代码

      import numpy as np
      
      def transform_point(point, method='translate', dx=1, dy=1, sx=1, sy=1, theta=0):
       """
       变形一个二维点
       :param point: 一个二维点 (x, y)
       :param method: 变形方法 (translate, rotate, scale)
       :param dx: 沿x轴平移的距离
       :param dy: 沿y轴平移的距离
       :param sx: x轴的缩放因子
       :param sy: y轴的缩放因子
       :param theta: 旋转的角度
       :return: 变形后的二维点
       """
       if method == 'translate':
           return translate(point, dx, dy)
       elif method == 'rotate':
           return rotate(point, theta)
       elif method == 'scale':
           return scale(point, sx, sy)
       else:
           return point
      
      point = [1, 2]
      methods = ['translate', 'rotate', 'scale']
      
      for method in methods:
       if method == 'translate':
           transformed_point = transform_point(point, method, dx=2, dy=2)
       elif method == 'rotate':
           transformed_point = transform_point(point, method, theta=np.pi / 4)
       elif method == 'scale':
           transformed_point = transform_point(point, method, sx=1.5, sy=1.5)
       print(f"{method}后的点:", transformed_point)

通过以上技巧,可以更好地控制变形效果,确保变形结果符合预期。

实战演练:变形案例分析

简单案例的实战操作

下面是一个简单的变形案例,演示如何将一个立方体进行平移、旋转和缩放操作:

  1. 创建立方体

    • 使用Blender创建一个基本的立方体。
    • 设置立方体的初始位置、旋转和缩放。
  2. 平移立方体

    • 将立方体沿x轴和y轴平移一定的距离。
    • 使用Blender的平移工具进行操作。
  3. 旋转立方体

    • 将立方体绕着x轴、y轴和z轴旋转一定的角度。
    • 使用Blender的旋转工具进行操作。
  4. 缩放立方体
    • 将立方体在x轴和y轴上放大或缩小。
    • 使用Blender的缩放工具进行操作。

复杂案例的分步解析

下面是一个复杂的变形案例,演示如何将一个立方体进行复杂的变形操作:

  1. 创建立方体

    • 使用Blender创建一个基本的立方体。
    • 设置立方体的初始位置、旋转和缩放。
  2. 分层变形操作

    • 将立方体分成多个层次,分别进行变形操作。
    • 使用Blender的分层工具进行操作。
  3. 曲线变形

    • 将立方体沿曲线路径进行变形。
    • 使用Blender的曲线变形工具进行操作。
  4. 扭曲变形
    • 将立方体进行扭曲操作,使其呈现出非均匀的变形效果。
    • 使用Blender的扭曲变形工具进行操作。

示例代码(Blender)

下面是一个简单的Blender Python脚本,演示了如何创建一个基本的3D立方体,并进行平移、旋转和缩放操作:

import bpy

# 清除场景中的所有物体
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_all_scene_objects=True)

# 添加一个立方体
bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0))

# 应用变换
bpy.ops.transform.translate(value=(1, 1, 1))
bpy.ops.transform.rotate(value=np.pi / 4, orient_axis='X')
bpy.ops.transform.resize(value=(1.5, 1.5, 1.5))

# 渲染设置
bpy.context.scene.render.resolution_x = 800
bpy.context.scene.render.resolution_y = 600
bpy.context.scene.render.resolution_percentage = 100

# 保存文件
bpy.ops.wm.save_as_mainfile(filepath="cube.blend")

通过以上实战演练,可以更好地理解和掌握变形技术在实际应用中的操作方法和技巧。

进阶资源推荐

更多学习资料推荐

除了基础教程和官方文档外,还可以参考以下资源来进一步学习变形技术:

  • 在线课程

    • 慕课网(imooc.com) 提供了大量的编程和图形学课程,涵盖从基础到高级的各种变形技术。
    • CourseraedX 上也有许多与变形相关的课程,例如《计算机图形学》(Computer Graphics)等。
    • Udemy 上也有很多实用的变形教程和实战项目。
  • 书籍

    • 《计算机图形学:原理与实践》 详细介绍了图形学的基本原理和变形技术。
    • 《OpenGL编程指南》 介绍了OpenGL中的变形和渲染技术。
  • 社区和论坛
    • Blender艺术家论坛(blenderartists.org) 提供了大量的教程和案例分享。
    • Unity论坛(unity.com) 对于Unity中的变形和动画技术有丰富的讨论和实操经验。
    • Maya中文论坛(maya.org.cn) 提供了Maya相关的变形和特效技术讨论。

社区和论坛介绍

加入社区和论坛可以让你更好地与其他开发者交流,获取最新的技术信息和实战经验。以下是一些推荐的社区和论坛:

  • Blender艺术家论坛(blenderartists.org):这里有许多关于Blender的教程、案例和讨论,适合各个层次的用户。
  • Unity论坛(unity.com):对于Unity中的变形和动画技术有丰富的讨论和实操经验,可以在这里找到很多有用的信息和资源。
  • Maya中文论坛(maya.org.cn):提供了Maya相关的变形和特效技术讨论,适合需要深入了解Maya技术的用户。

通过加入这些社区和论坛,可以更好地与其他开发者交流,获取最新的技术信息和实战经验,从而更好地掌握变形技术。

通过以上内容的学习和实践,你可以更加熟练地掌握变形技术,并将其应用到各种项目中。希望这些资源和方法能够帮助你在变形领域取得更进一步的进展。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP