教程 3:外观和材质 (60分钟)


目标与简介

本教程将深入探讨Webots中的外观和材质系统。你将学习如何创建自定义材质、应用纹理、设置光照效果,以及如何通过编程方式动态改变对象的外观。本教程基于官方教程3

目录

1. 环境准备

在开始本教程之前,请确保你已经完成了教程2,并且有一个包含多个对象的环境。我们将基于之前创建的环境来学习外观和材质系统。

📝 动手实践 #1: 打开之前创建的项目,加载世界文件。确保场景中有 RectangleArenaWoodenBoxMetalBoxE-puck 机器人。暂停仿真并重置到初始状态。

2. 基础材质

Webots中的材质系统基于VRML97标准,支持多种材质属性。让我们从基础材质开始学习。

📝 动手实践 #2: WoodenBox 创建自定义材质:
  1. 双击 WoodenBox 节点,展开 appearance 字段
  2. material 字段中,设置以下属性:
    • diffuseColor0.6 0.4 0.2(深棕色)
    • specularColor0.1 0.1 0.1(低反光)
    • shininess0.3(低光泽度)
    • transparency0.0(不透明)
📝 动手实践 #3: MetalBox 创建金属材质:
  1. 双击 MetalBox 节点,展开 appearance 字段
  2. material 字段中,设置以下属性:
    • diffuseColor0.8 0.8 0.9(银白色)
    • specularColor0.9 0.9 1.0(高反光)
    • shininess0.9(高光泽度)
    • ambientIntensity0.2(环境光强度)

3. 纹理应用

纹理可以为对象添加更真实的外观。Webots支持多种纹理格式,包括图像纹理和程序化纹理。

📝 动手实践 #4: 为木箱添加木纹纹理:
  1. WoodenBoxappearance 字段中,展开 texture
  2. 设置 url"textures/wood.jpg"
  3. 设置 repeatSTRUErepeatTTRUE
  4. 设置 wrapS"REPEAT"wrapT"REPEAT"
📝 动手实践 #5: 创建程序化纹理:
  1. 添加一个新的 Box 节点到场景中
  2. appearance 字段中,设置 textureurl"textures/checkerboard.png"
  3. 设置 transformation 字段:
    • translation0 0 0
    • rotation0 0 1 0
    • scale2 2 1(放大纹理)

4. 编程方式修改外观

通过Python控制器,我们可以动态地修改对象的外观。这为创建交互式仿真提供了强大的功能。

📝 动手实践 #6: 创建一个控制器来动态改变颜色:
from controller import Robot, Node
import math

TIME_STEP = 64

# 创建机器人实例
robot = Robot()

# 获取场景中的对象
scene = robot.getFromDef("WOODEN_BOX")
if scene:
    # 获取外观节点
    appearance = scene.getField("appearance")
    if appearance:
        # 获取材质节点
        material = appearance.getSFNode()
        if material:
            # 获取漫反射颜色字段
            diffuse_color = material.getField("diffuseColor")
            
            # 创建颜色变化动画
            time = 0
            while robot.step(TIME_STEP) != -1:
                # 计算新的颜色值(彩虹效果)
                r = 0.5 + 0.5 * math.sin(time * 0.1)
                g = 0.5 + 0.5 * math.sin(time * 0.1 + 2 * math.pi / 3)
                b = 0.5 + 0.5 * math.sin(time * 0.1 + 4 * math.pi / 3)
                
                # 设置新的颜色
                diffuse_color.setSFColor([r, g, b])
                
                time += 1
📝 动手实践 #7: 创建透明度动画效果:
from controller import Robot, Node
import math

TIME_STEP = 64

# 创建机器人实例
robot = Robot()

# 获取金属箱对象
metal_box = robot.getFromDef("METAL_BOX")
if metal_box:
    # 获取外观节点
    appearance = metal_box.getField("appearance")
    if appearance:
        # 获取材质节点
        material = appearance.getSFNode()
        if material:
            # 获取透明度字段
            transparency = material.getField("transparency")
            
            # 创建透明度动画
            time = 0
            while robot.step(TIME_STEP) != -1:
                # 计算透明度值(0到1之间变化)
                alpha = 0.5 + 0.5 * math.sin(time * 0.05)
                
                # 设置透明度
                transparency.setSFFloat(alpha)
                
                time += 1

5. 高级外观效果

Webots支持一些高级的外观效果,包括法线贴图、环境贴图等。让我们探索这些高级功能。

📝 动手实践 #8: 添加法线贴图:
  1. WoodenBoxappearance 中,展开 textureTransform
  2. 设置 center0.5 0.5
  3. 设置 rotation0.785(45度)
  4. 设置 scale2 2
  5. material 中,设置 normalMap"textures/wood_normal.jpg"
📝 动手实践 #9: 创建环境贴图效果:
  1. MetalBox 添加环境贴图
  2. material 中,设置 environmentMap"textures/skybox.jpg"
  3. 设置 reflection0.8(高反射率)
  4. 调整 shininess1.0(最大光泽度)
📝 动手实践 #10: 创建发光材质:
  1. 添加一个新的 Sphere 节点
  2. 设置 emissiveColor1 0 0(红色发光)
  3. 设置 diffuseColor0.2 0 0(暗红色)
  4. 设置 shininess0.1(低光泽度)
  5. 运行仿真,观察发光效果

6. 总结

恭喜你完成了Webots外观和材质教程!你已经学会了:

  • 如何创建和配置基础材质属性
  • 如何应用纹理和纹理变换
  • 如何通过编程方式动态修改外观
  • 如何使用高级外观效果(法线贴图、环境贴图)
  • 如何创建发光材质和特殊效果
  • 如何结合多种材质属性创建复杂的外观

这些技能将帮助你创建更加真实和美观的仿真环境。在下一个教程中,我们将学习如何控制机器人的执行器。

下一步

继续学习 教程4:执行器控制,了解如何精确控制机器人的运动。