# Moving, Rotating & Scaling Objects

Positioning objects in variants can be incredibly powerful, especially when combined with nesting transformable groups, but comes with some additional complexity.

### Setting Transform Options

Specifying a new position, rotation and scale on a Mesh/Mesh Group looks like this:

```javascript
{
      tag: 'REAR_PANEL',
      enabled: true,
      position: { x: 0, y: 0, z: 1},
      rotation: { x: 0, y: 90, z: 0},
      scale: { x: 1, y: 2, z: 1},      
},
```

In this example we are:

* Positioning the object at the location \[0,0,1] (one meter in the Z axis from its 0,0,0 position).
* Setting its rotation to 90 degrees in the Y axis.
* Setting the Y scale to twice the height of the other axes.

All values are relative to the parent object (AKA being in "local space"), just like in a 3D editor, 3D scene, or GLTF file. Values you specify will replace existing values, not be added to them as an offset.

This means if the object was already at placed at position 0,0,1 in the 3D file, it won't change position.

### **Units**

* Position values are in meters
* Rotation values are in degrees
* Scale is relative to the parent transforms, but in most cases 1,1,1 will be the original size

### **Nesting Transforms**

If the object you are transforming has children, they will also be effected by the transform. You can even nest tagged meshes inside other tagged meshes in the 3D file, which will inherit their parents position, rotation and scale when transformed via the API.

For example, if you had a built-in USB port on a desk that could be placed anywhere along the front edge of the desk, and the desk height was also customisable; you would nest the USB object inside the desk object, then set its left/right position via the USB X position, and the desk height via the desk Y position, as below.

Now the USB port always stays attached to the desktop, while the position of both can be freely customised.

```javascript
{
      tag: 'USB_PORT',
      enabled: true,
      position: { x: 0.37, y: 0, z: 0},
   
},
{
      tag: 'DESKTOP',
      enabled: true,
      position: { x: 0, y: 1.33, z: 0},  
},
```

###

### Preparing your 3D file for transforms

Since all transforms are local, its often easier for developers to reason about transforms if the parent objects of movable Meshes/Groups all have default values (e.g. position/rotation 0,0,0 and scale of 1,1,1).

The only time you should nest tagged objects you intend to transform is if the position of one should effect the position of its children.

To avoid the need for rework, we recommend having a pre-agreed plan between 3D Editors and Web Developers as to what items do and don't need to be transformable, prior to building the 3D file.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.variant3d.com/variant-js-sdk/moving-rotating-and-scaling-objects.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
