# Your first scene This guide will help you to create your first Tres scene. 🍩
## Setting up the experience Canvas Before we can create a ThreeJS `Scene`, we need a space to display it. Using plain [ThreeJS](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene) we would need to create a `canvas` HTML element to mount the `WebglRenderer` and initialize the `Scene`. With **TresJS** you only need to import the default component `` and add it to the template of your Vue component. ```vue ``` ::: warning It's important that all components related to the scene live between the `` component. Otherwise, they will be not rendered. ::: The `TresCanvas` component is going to do some setup work behind the scenes: - It creates a [**WebGLRenderer**](https://threejs.org/docs/index.html?q=webglrend#api/en/renderers/WebGLRenderer) that automatically updates every frame. - It sets the render loop to be called on every frame based on the browser refresh rate. ## Canvas size By default, `TresCanvas` component will take the **parent's width and height**, if you are experiencing a blank page make sure the parent element has a proper size. ```vue ``` If your scene is not gonna be part of a UI, you can also force the canvas to take the width and height of the full window by using the `window-size` prop like this: ```vue ``` ## Creating a scene We need 4 core elements to create a 3D experience: - A [**Scene**](https://threejs.org/docs/index.html?q=scene#api/en/scenes/Scene) to hold the camera and the object(s) together. - A [**Renderer**](https://threejs.org/docs/index.html?q=renderer#api/en/renderers/WebGLRenderer) to render the scene into the DOM. - A [**Camera**](https://threejs.org/docs/index.html?q=camera#api/en/cameras/Camera) - An [**Object**](https://threejs.org/docs/index.html?q=object#api/en/core/Object3D) With **TresJS** you only need to add the `` component to the template of your Vue component and it will automatically create a `Renderer` (`canvas` DOM Element) and `Scene` for you. ```vue ``` Then you can add a [**PerspectiveCamera**](https://threejs.org/docs/index.html?q=perspectivecamera#api/en/cameras/PerspectiveCamera) using the `` component. ```vue ``` ::: warning A common issue is that the camera default position is the origin of the scene (0,0,0). TresJS will automatically set the position of your camera to `[3,3,3]` if the prop `position` is not set by you. If no camera is defined in you scene, a perspective camera is added automatically. ::: ## Adding a 🍩 That scene looks a little empty, let's add a basic object. If we were using plain **ThreeJS** we would need to create a [**Mesh**](https://threejs.org/docs/index.html?q=mesh#api/en/objects/Mesh) object and attach to it a [**Material**](https://threejs.org/docs/index.html?q=material#api/en/materials/Material) and a [**Geometry**](https://threejs.org/docs/index.html?q=geometry#api/en/core/BufferGeometry) like this: ```ts const geometry = new THREE.TorusGeometry(1, 0.5, 16, 32) const material = new THREE.MeshBasicMaterial({ color: 'orange' }) const donut = new THREE.Mesh(geometry, material) scene.add(donut) ``` A **Mesh** is a basic scene object in three.js, and it's used to hold the geometry and the material needed to represent a shape in 3D space. Now let's see how we can easily achieve the same with **TresJS**. To do that we are going to use the `` component, and between the default slots, we are going to pass a `` and a `` component. ```vue ``` ::: info Notice that we don't need to import anything, that's because **TresJS** automatically generate a **Vue Component based on the three objects you want to use in PascalCase with a Tres prefix**. For example, if you want to use an `AmbientLight` you would use the `` component. ::: ```vue ``` From here onwards you can start adding more objects to your scene and start playing with the properties of the components to see how they affect the scene.