# Tutorial: Mesh Collision

### What you'll build <a href="#what-youll-build" id="what-youll-build"></a>

In this tutorial, we will enable meshing and demonstrate how to collide objects with the generated mesh.

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/8znbHygJkkYzqP5WJnxC/shootBalls.gif" alt=""><figcaption></figcaption></figure>

### What you'll need <a href="#what-youll-need" id="what-youll-need"></a>

This tutorial assumes you have a working Unity scene with the NRSDK imported. Please refer to the [Getting Started with NRSDK](https://xreal.gitbook.io/nrsdk/nrsdk-fundamentals/quickstart-for-android) page for more details on how to import the NRSDK package.

## 1. Create a new scene

create a new folder named `MeshCollsion`, and another folder named `Scene`, and then create a new scene named `MeshCollsion`<mark style="color:purple;">.</mark>

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/aqDdKVjIsE5OV50yHvP7/image.png" alt=""><figcaption></figcaption></figure>

Add the `NRCameraRig` and `NRInput` prefab into the hierarchy.

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/CNt41cfEiDzcMyI3rU53/image.png" alt=""><figcaption></figcaption></figure>

## 2. Add the MeshingManager

Create an empty GameObject called MeshingManager.

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/2uR3GoBsoliMcpGSqW6d/image.png" alt=""><figcaption></figcaption></figure>

Add the following scripts to Meshing Manager:

1. NRMeshingManager.cs
2. MeshObjGenerator.cs

{% hint style="info" %}
If you want to save the mesh for tests, you can add the `MeshSaver.cs`too.
{% endhint %}

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/WpuxUgKX3QY5MC5PWyur/image.png" alt=""><figcaption></figcaption></figure>

## 3. Add a sphere

Right-click on the scene hierarchy and click **Game Object**> **3D Object**> **Sphere**.

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/llJy8cS9p027MaJx9s5P/image.png" alt=""><figcaption></figcaption></figure>

Click on the sphere and set its size to 0.05.&#x20;

Then add a rigid body component to the sphere. This tells Unity to give the sphere physics properties so it will fall down unless it hits something. You can also apply forces to it to move it around, simulate throwing it, etc. Note that if you don't change the `Collision Detection` to **Continuous Dynamic,** sometimes your ball will pass directly through the mesh, with no collision effect.

Add a material to the sphere to make it more obvious.

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/Z0c9FhZyO5HaUbBsVLvl/image.png" alt=""><figcaption></figcaption></figure>

Create a folder called Prefabs, and drag the sphere to the folder.

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/wcyCVkRr3zcAEuiKpuGC/image.png" alt=""><figcaption></figcaption></figure>

## 4. Add code to shoot the sphere

Each time the user taps the touchpad, a ball will be shooted in place of the ray cast from the phone's controller.

By attaching the following script to **NRCameraRig**, you can customize the shoot position of the sphere. This tutorial uses the ray cast position, `Model Anchor`, as the emission point.

Set the prefab Sphere you just made as the `Ball Prefab`.

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/zHR6cx6UgqmVYJHk8eaT/image.png" alt=""><figcaption></figcaption></figure>

<figure><img src="https://content.gitbook.com/content/yXoV7SMVFQhr75lOIoQv/blobs/ju5B8UqOzN4ByLIM2EAc/image.png" alt=""><figcaption></figcaption></figure>

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using NRKernal;

public class Shoot : MonoBehaviour
{
    public float moveSpeed = 10f;
    public GameObject shootPos;
    public float force = 1000;
    public GameObject ballPrefab;

    Vector3 targetObjectNextPosition;

    RaycastHit hit;

    void FixedUpdate()
    {
        if (NRInput.GetButtonDown(ControllerButton.TRIGGER))
        {
            var handControllerAnchor =
                NRInput.DomainHand == ControllerHandEnum.Left
                    ? ControllerAnchorEnum.LeftLaserAnchor
                    : ControllerAnchorEnum.RightLaserAnchor;
            Transform laserAnchor = NRInput.AnchorsHelper.GetAnchor(
                NRInput.RaycastMode == RaycastModeEnum.Gaze
                    ? ControllerAnchorEnum.GazePoseTrackerAnchor
                    : handControllerAnchor
            );

            Ray ray =new Ray(laserAnchor.transform.position, laserAnchor.transform.forward);

            Rigidbody ball = Instantiate(ballPrefab, shootPos.transform.position, Quaternion.identity).GetComponent<Rigidbody>() as Rigidbody;
            ball.AddForce(force * ray.direction);
            
        }
    }

}
 
```

## 5. Destroy the sphere after a period of time

To save scene resources, use the invoke function to destroy the sphere after a specified time.

Attach the script to the sphere prefab made in Step 3.

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class sphere : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Invoke("DelayDestroy", 10); // * destroy the prefab after 10 seconds
    }

    // Update is called once per frame
    void DelayDestroy()
    {
        Destroy(this.gameObject);
    }
}

```

## 6. Build and Run
