# how-to-add-texture-to-sdf.md

by Tongkai Zhang, <tongkaizhang@brandeis.edu>

This is a quick guide for adding textures(.png) to your model in gazebo.

![image-20210505100010784](https://4196336753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LULg3WmBk4r0dWAdK9A%2Fuploads%2Fgit-blob-16ed1a406978f41083bd29cb728a64e58eec1a88%2Ftextured_cargo.png?alt=media)

## Prerequisite

* gazebo
* model in sdf format

## Texture Configuration

After building your own model in the sdf format, you should have a structured model `cargo`directory same as the one below.

![image-20210505100405303](https://4196336753-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LULg3WmBk4r0dWAdK9A%2Fuploads%2Fgit-blob-c1e5bd77aaa26b8298d8ba2b89c07e7319064aa5%2Fcargo_dir.png?alt=media)

It's important that you have the directory exactly the same, since importing the texture into gazebo is based on finding parameters and texture images within that directory.

* scripts: `cargo.material`, formatted file, defining the **name**, visual property for the material.
* textures: the image texture file
* `model.config`: meta data for the model
* ```
  <?xml version="1.0"?>

  <model>
    <name>cargo_with_marker</name>
    <version>1.0</version>
    <sdf version="1.6">model.sdf</sdf>

    <author>
      <name>Tongkai Zhang</name>
    </author>

    <description>export GAZEBO_MODEL_PATH=~/catkin_ws/src/warehouse_worker/model/
      Cargo
    </description>
  </model>
  ```
* `model.sdf`: model itself

**Basic Steps**:

* Get the texture image ready and put them under `/textures`
* Define texture in `cargo.material`, note how texture image is included as well as how the name is set.

  `material Cargo/Diffuse` is the unique name for this material.

  ```
  material Cargo/Diffuse
  {
    receive_shadows off
    technique
    {
      pass
      {
        texture_unit
        {
          texture cargo.jpg
        }
      }
    }
  }

  material Marker/Diffuse
  {
    receive_shadows off
    technique
    {
      pass
      {
        texture_unit
        {
          texture MarkerData_1.png
        }
      }
    }
  }
  ```
* Add this material in your sdf model. It should be enclosed by the `<visual>`tag. Note the `uri` sexport GAZEBO\_MODEL\_PATH=\~/catkin\_ws/src/warehouse\_worker/model/hould be correctly set and the `name` of the material should be identical to the name defined in `cargo.material`

  ```
  <visual>
      <material>
                <script>
                  <uri>model://cargo/materials/scripts</uri>
                  <uri>model://cargo/materials/textures</uri>
                  <name>Marker/Diffuse</name>
                </script>
      </material>
  </visual>
  ```
* Adding model to your world

  ```
    <model name='cargo_with_marker'>
          <pose>2.5 0 0.15 0 0 -1.57</pose>
          <include>
              <uri>model://cargo</uri>
          </include>
      </model>
  ```
* Set the `model`environment variable in terminal. When gazebo launches the world, it will search the model `cargo` under its default `model` directory. If you want to include your models in your project folder, you should set the `GAZEBO_MODEL_PATH` variable in your terminal.

  `export GAZEBO_MODEL_PATH=~/catkin_ws/src/warehouse_worker/model/`

  Now gazebo also searches model under `/warehouse_worker/model/`
