3.7.2 • Published 10 months ago

angular-three v3.7.2

Weekly downloads
-
License
MIT
Repository
github
Last release
10 months ago

angular-three

A custom Renderer for Angular 18+ that uses Three.js to render 3D scenes.

Compatibility

Angular Three v2 is still in beta and aims to be compatible with Angular 17+.

Installation

npm install angular-three@beta ngxtension three
# yarn add angular-three@beta ngxtension three
# pnpm add angular-three@beta ngxtension three

Make sure to install @types/three as well

Usage

import { extend } from 'angular-three';
import { Mesh, BoxGeometry } from 'three';

extend({
 Mesh, // makes ngt-mesh available
 BoxGeometry, // makes ngt-box-geometry available
 /* ... */
 MyMesh: Mesh, // makes ngt-my-mesh available
});

// alternatively for demo purposes, you can use the following
// extend(THREE);
// This includes the entire THREE.js namespace

@Component({
 // This Component is rendered in the Custom Renderer
 template: `
  <ngt-mesh>
   <ngt-box-geometry />
  </ngt-mesh>
 `,
 schemas: [CUSTOM_ELEMENTS_SCHEMA], // required
 changeDetection: ChangeDetectionStrategy.OnPush,
})
export class SceneGraph {}

@Component({
 // This Component is rendered normally in Angular.
 selector: 'app-my-experience',
 template: `
  <ngt-canvas [sceneGraph]="SceneGraph" />
 `,
 imports: [NgtCanvas],
})
export class MyExperience {
 SceneGraph = SceneGraph;
}

The Component that renders NgtCanvas (MyExperience in this case) controls the dimensions of the canvas so make sure to style it accordingly.

Inputs

  • sceneGraph: Type<any>: required. This is the Component that renders your 3D Scene graph. It must be a standalone Component.
  • gl?: NgtGLOptions: This input allows you to configure the WebGL renderer used by Angular Three. You can provide a THREE.js renderer instance, properties for the default renderer, or a function that returns a renderer based on the canvas element.
  • size?: NgtSize: Specifies the dimensions of the renderer. If omitted, the component will automatically measure the canvas dimensions.
  • shadows?: boolean | 'basic' | 'percentage' | 'soft' | 'variance' | Partial<WebGLShadowMap>: Enables or disables shadows in the scene. You can provide a boolean value to toggle shadows on or off, or use specific strings to control the shadow type. Additionally, you can pass partial WebGLShadowMap options for fine-tuning.
  • legacy?: boolean: Disables three r139 color management when set to true.
  • linear?: boolean: Switches off automatic sRGB color space and gamma correction when set to true.
  • flat?: boolean: Uses THREE.NoToneMapping instead of THREE.ACESFilmicToneMapping when set to true.
  • orthographic?: boolean: Creates an orthographic camera instead of a perspective camera when set to true.
  • frameloop?: 'always' | 'demand' | 'never': Controls the rendering mode. 'always' renders continuously, 'demand' renders only on state changes, and 'never' gives you manual control over rendering.
  • performance?: Partial<Omit<NgtPerformance, 'regress'>>: Allows you to configure performance options for adaptive performance.
  • dpr?: NgtDpr: Sets the target pixel ratio. You can provide a single number or a range min, max.
  • raycaster?: Partial<Raycaster>: Configures the default raycaster used for interaction.
  • scene?: Scene | Partial<Scene>: Provides a THREE.js scene instance or properties to create a default scene.
  • camera?: NgtCamera | Partial<NgtObject3DNode<Camera>>: Provides a THREE.js camera instance or properties to create a default camera. You can also set the manual property to true to take control of the camera projection.
  • events?: (store: NgtSignalStore<NgtState>) => NgtEventManager<HTMLElement>: Allows you to customize the event manager for handling pointer events.
  • eventSource?: HTMLElement | ElementRef<HTMLElement>: Specifies the target element where events are subscribed. By default, it's the div wrapping the canvas.
  • eventPrefix?: 'offset' | 'client' | 'page' | 'layer' | 'screen': Sets the event prefix used for canvas pointer events.
  • lookAt?: Vector3 | Parameters<Vector3['set']>: Defines the default coordinate for the camera to look at.

Outputs

  • created: Emitted when the canvas is created.
  • pointerMissed: Emitted when a pointer event is not captured by any element (aka clicking on the canvas)

Intellisense support

Since Angular Three is a custom Renderer, the elements are not recognized by the Angular Language Service.

Jetbrains IDE

The consumers can add web-types property to the workspace's package.json and set the value to node_modules/angular-three/web-types.json.

{
 "web-types": "node_modules/angular-three/web-types.json"
}

VSCode

Similarly, there's node_modules/angular-three/metadata.json file that can be used to provide intellisense support for VSCode users.

The consumers can enable it via html.customData in their settings.json file.

{
 "html.customData": ["node_modules/angular-three/metadata.json"]
}

Input Bindings

Input bindings for ngt-* elements work the same way as they do in Angular.

You can consult THREE.js documentation on what is available on the entities

<ngt-mesh [position]="[x, y, z]" [rotation]="[x, y, z]">
 <ngt-mesh-basic-material color="hotpink" />
</ngt-mesh>

Events

Angular Three Custom Renderer supports the following events on applicable objects (ngt-mesh, ngt-group etc...)

'click',
'contextmenu',
'dblclick',
'pointerup',
'pointerdown',
'pointerover',
'pointerout',
'pointerenter',
'pointerleave',
'pointermove',
'pointermissed',
'pointercancel',
'wheel',

In addition, there are 2 special events that the consumers can listen to;

  • attached: when the element is attached to its parent
  • updated: when the element properties are updated

Constructor Arguments

In THREE.js, there are some entities that require the consumers to dispose and recreate them if their parameters change; like the Geometries.

To handle this, Angular Three exports a NgtArgs structural directive that always accepts an Array of values. The consumers can consult THREE.js documentations to know what values are applicable for what entities and their order.

<!-- for example, new BoxGeometry(width, height, depth) -->
<ngt-box-geometry *args="[width, height, depth]" />

NgtArgs, as a structural directive, ensures to create a new instance of the entity when the value changes

Parameters

Beside the normal properties that ngt-* elements can accept for Input bindings, the consumers can also pass a parameters object to a special property [parameters] on the elements. This parameters object will be used to apply the properties on the entity.

<!-- instead of <ngt-mesh [position]="[x, y, z]" [scale]="scale" /> -->
<ngt-mesh [parameters]="{ position: [x, y, z], scale }" />

Element Queries

The consumers can query for the THREE.js entities like they would do in normal HTML Angular Template.

@Component({
 template: `
  <ngt-mesh #mesh></ngt-mesh>
 `,
})
export class Box {
 mesh = viewChild.required<ElementRef<Mesh>>('mesh');
 //  notice that it is an ElementRef of THREE.Mesh instead of an HTMLElement
}

Animation Loop

In order to participate in the animation loop, use injectBeforeRender inject function

@Component({
 /*...*/
})
export class Box {
 mesh = viewChild.required<ElementRef<Mesh>>('mesh');

 constructor() {
  injectBeforeRender(() => {
   // runs every frame
   const mesh = this.mesh().nativeElement;
   mesh.rotation.x += 0.01;
  });
 }
}

Store

Angular Three keeps track of its state via an internal store. The consumers can access this store via the injectStore inject function

export class Box {
 store = injectStore();
 viewport = this.store.select('viewport'); // Signal<NgtViewport>
 camera = this.store.select('camera'); // Signal<NgtCamera> - the default camera
 /* many more properties */
}
4.0.0-next.95

10 months ago

4.0.0-next.96

10 months ago

4.0.0-next.93

10 months ago

4.0.0-next.94

10 months ago

4.0.0-next.84

10 months ago

4.0.0-next.85

10 months ago

4.0.0-next.88

10 months ago

4.0.0-next.89

10 months ago

4.0.0-next.86

10 months ago

4.0.0-next.87

10 months ago

4.0.0-next.91

10 months ago

4.0.0-next.92

10 months ago

4.0.0-next.90

10 months ago

4.0.0-next.82

10 months ago

4.0.0-next.83

10 months ago

4.0.0-next.73

10 months ago

4.0.0-next.74

10 months ago

4.0.0-next.71

11 months ago

4.0.0-next.72

10 months ago

4.0.0-next.77

10 months ago

4.0.0-next.78

10 months ago

4.0.0-next.75

10 months ago

4.0.0-next.76

10 months ago

4.0.0-next.79

10 months ago

4.0.0-next.80

10 months ago

4.0.0-next.81

10 months ago

4.0.0-next.69

11 months ago

4.0.0-next.70

11 months ago

4.0.0-next.59

11 months ago

4.0.0-next.62

11 months ago

4.0.0-next.63

11 months ago

4.0.0-next.60

11 months ago

4.0.0-next.61

11 months ago

4.0.0-next.66

11 months ago

4.0.0-next.67

11 months ago

4.0.0-next.64

11 months ago

4.0.0-next.65

11 months ago

4.0.0-next.68

11 months ago

4.0.0-next.55

11 months ago

4.0.0-next.56

11 months ago

4.0.0-next.53

11 months ago

4.0.0-next.54

11 months ago

4.0.0-next.57

11 months ago

4.0.0-next.58

11 months ago

4.0.0-next.51

11 months ago

4.0.0-next.52

11 months ago

4.0.0-next.50

11 months ago

4.0.0-next.40

11 months ago

4.0.0-next.41

11 months ago

4.0.0-next.44

11 months ago

4.0.0-next.45

11 months ago

4.0.0-next.42

11 months ago

4.0.0-next.43

11 months ago

4.0.0-next.48

11 months ago

4.0.0-next.49

11 months ago

4.0.0-next.46

11 months ago

4.0.0-next.47

11 months ago

4.0.0-next.30

11 months ago

4.0.0-next.33

11 months ago

4.0.0-next.34

11 months ago

4.0.0-next.31

11 months ago

4.0.0-next.32

11 months ago

4.0.0-next.37

11 months ago

4.0.0-next.38

11 months ago

4.0.0-next.35

11 months ago

4.0.0-next.36

11 months ago

4.0.0-next.39

11 months ago

4.0.0-next.22

11 months ago

4.0.0-next.23

11 months ago

4.0.0-next.20

11 months ago

4.0.0-next.21

11 months ago

4.0.0-next.26

11 months ago

4.0.0-next.27

11 months ago

4.0.0-next.24

11 months ago

4.0.0-next.25

11 months ago

4.0.0-next.28

11 months ago

4.0.0-next.29

11 months ago

4.0.0-next.19

11 months ago

4.0.0-next.18

11 months ago

4.0.0-next.11

11 months ago

4.0.0-next.12

11 months ago

4.0.0-next.10

11 months ago

4.0.0-next.15

11 months ago

4.0.0-next.16

11 months ago

4.0.0-next.13

11 months ago

4.0.0-next.14

11 months ago

4.0.0-next.17

11 months ago

4.0.0-next.9

11 months ago

4.0.0-next.8

12 months ago

4.0.0-next.7

12 months ago

4.0.0-next.6

12 months ago

4.0.0-next.5

12 months ago

4.0.0-next.4

12 months ago

4.0.0-next.3

12 months ago

4.0.0-next.2

12 months ago

3.7.1

12 months ago

3.7.2

12 months ago

4.0.0-next.1

12 months ago

3.7.0

12 months ago

3.6.1

12 months ago

3.2.2

1 year ago

3.2.1

1 year ago

3.2.4

1 year ago

3.2.3

1 year ago

3.6.0

1 year ago

3.5.0

1 year ago

3.4.0

1 year ago

3.4.1

1 year ago

3.3.0

1 year ago

3.2.0

1 year ago

3.1.0

1 year ago

3.0.0

1 year ago

2.14.0

1 year ago

2.13.0

1 year ago

2.11.0

1 year ago

2.10.1

1 year ago

2.10.2

1 year ago

2.10.7

1 year ago

2.10.5

1 year ago

2.10.6

1 year ago

2.10.3

1 year ago

2.10.4

1 year ago

2.12.0

1 year ago

2.10.0

1 year ago

2.9.0

1 year ago

2.8.1

1 year ago

2.8.0

1 year ago

2.7.0

1 year ago

2.6.1

1 year ago

2.6.0

1 year ago

2.5.2

1 year ago

2.4.0

1 year ago

2.5.0

1 year ago

2.5.1

1 year ago

2.3.0

1 year ago

2.3.2

1 year ago

2.2.1

1 year ago

2.2.0

1 year ago

2.0.0-beta.316

1 year ago

2.1.0

1 year ago

2.0.0

1 year ago

2.0.0-beta.314

1 year ago

2.0.0-beta.315

1 year ago

2.0.0-beta.307

1 year ago

2.0.0-beta.308

1 year ago

2.0.0-beta.309

1 year ago

2.0.0-beta.310

1 year ago

2.0.0-beta.311

1 year ago

2.0.0-beta.312

1 year ago

2.0.0-beta.313

1 year ago

2.0.0-beta.300

1 year ago

2.0.0-beta.301

1 year ago

2.0.0-beta.302

1 year ago

2.0.0-beta.303

1 year ago

2.0.0-beta.304

1 year ago

2.0.0-beta.305

1 year ago

2.0.0-beta.306

1 year ago

2.0.0-beta.296

1 year ago

2.0.0-beta.297

1 year ago

2.0.0-beta.298

1 year ago

2.0.0-beta.299

1 year ago

2.0.0-beta.290

1 year ago

2.0.0-beta.291

1 year ago

2.0.0-beta.292

1 year ago

2.0.0-beta.293

1 year ago

2.0.0-beta.294

1 year ago

2.0.0-beta.295

1 year ago

2.0.0-beta.285

1 year ago

2.0.0-beta.286

1 year ago

2.0.0-beta.287

1 year ago

2.0.0-beta.288

1 year ago

2.0.0-beta.289

1 year ago

2.0.0-beta.284

1 year ago

2.0.0-beta.278

1 year ago

2.0.0-beta.279

1 year ago

2.0.0-beta.280

1 year ago

2.0.0-beta.281

1 year ago

2.0.0-beta.282

1 year ago

2.0.0-beta.283

1 year ago

2.0.0-beta.274

1 year ago

2.0.0-beta.275

1 year ago

2.0.0-beta.276

1 year ago

2.0.0-beta.277

1 year ago

2.0.0-beta.271

1 year ago

2.0.0-beta.272

1 year ago

2.0.0-beta.273

1 year ago

2.0.0-beta.268

1 year ago

2.0.0-beta.269

1 year ago

2.0.0-beta.270

1 year ago

2.0.0-beta.265

1 year ago

2.0.0-beta.266

1 year ago

2.0.0-beta.267

1 year ago

2.0.0-beta.231

2 years ago

2.0.0-beta.232

2 years ago

2.0.0-beta.233

2 years ago

2.0.0-beta.234

2 years ago

2.0.0-beta.235

2 years ago

2.0.0-beta.236

2 years ago

2.0.0-beta.237

2 years ago

2.0.0-beta.238

2 years ago

2.0.0-beta.239

2 years ago

2.0.0-beta.241

2 years ago

2.0.0-beta.242

2 years ago

2.0.0-beta.243

2 years ago

2.0.0-beta.244

2 years ago

2.0.0-beta.245

2 years ago

2.0.0-beta.246

2 years ago

2.0.0-beta.247

2 years ago

2.0.0-beta.248

2 years ago

2.0.0-beta.240

2 years ago

2.0.0-beta.249

2 years ago

2.0.0-beta.252

2 years ago

2.0.0-beta.253

2 years ago

2.0.0-beta.254

2 years ago

2.0.0-beta.255

2 years ago

2.0.0-beta.256

1 year ago

2.0.0-beta.257

1 year ago

2.0.0-beta.258

1 year ago

2.0.0-beta.259

1 year ago

2.0.0-beta.250

2 years ago

2.0.0-beta.251

2 years ago

2.0.0-beta.263

1 year ago

2.0.0-beta.264

1 year ago

2.0.0-beta.260

1 year ago

2.0.0-beta.261

1 year ago

2.0.0-beta.262

1 year ago

2.0.0-beta.227

2 years ago

2.0.0-beta.228

2 years ago

2.0.0-beta.229

2 years ago

2.0.0-beta.230

2 years ago

0.0.0-replace

2 years ago

2.0.0-beta.224

2 years ago

2.0.0-beta.225

2 years ago

2.0.0-beta.226

2 years ago

2.0.0-beta.223

2 years ago

2.0.0-beta.42

2 years ago

1.10.7

2 years ago

2.0.0-beta.9

2 years ago

2.0.0-beta.8

2 years ago

2.0.0-beta.40

2 years ago

2.0.0-beta.41

2 years ago

2.0.0-beta.33

2 years ago

2.0.0-beta.32

2 years ago

2.0.0-beta.31

2 years ago

2.0.0-beta.30

2 years ago

2.0.0-beta.37

2 years ago

2.0.0-beta.36

2 years ago

2.0.0-beta.35

2 years ago

2.0.0-beta.34

2 years ago

2.0.0-beta.39

2 years ago

2.0.0-beta.38

2 years ago

2.0.0-beta.22

2 years ago

2.0.0-beta.21

2 years ago

2.0.0-beta.20

2 years ago

2.0.0-beta.26

2 years ago

2.0.0-beta.25

2 years ago

2.0.0-beta.24

2 years ago

2.0.0-beta.23

2 years ago

2.0.0-beta.29

2 years ago

2.0.0-beta.28

2 years ago

2.0.0-beta.27

2 years ago

2.0.0-beta.11

2 years ago

2.0.0-beta.10

2 years ago

2.0.0-beta.15

2 years ago

2.0.0-beta.14

2 years ago

2.0.0-beta.13

2 years ago

2.0.0-beta.12

2 years ago

2.0.0-beta.19

2 years ago

2.0.0-beta.18

2 years ago

2.0.0-beta.17

2 years ago

2.0.0-beta.16

2 years ago

1.10.5

3 years ago

1.10.4

3 years ago

1.10.6

3 years ago

2.0.0-beta.7

3 years ago

2.0.0-beta.2

3 years ago

2.0.0-beta.1

3 years ago

2.0.0-beta.0

3 years ago

2.0.0-beta.6

3 years ago

2.0.0-beta.5

3 years ago

2.0.0-beta.4

3 years ago

2.0.0-beta.3

3 years ago

1.10.3

3 years ago

1.10.2

3 years ago

1.10.1

3 years ago

1.10.0

3 years ago

1.9.16

3 years ago

1.9.15

3 years ago

1.9.14

3 years ago

1.9.13

3 years ago

1.9.12

3 years ago

1.9.11

3 years ago

1.6.4

3 years ago

1.8.1

3 years ago

1.6.3

3 years ago

1.4.5

3 years ago

1.8.0

3 years ago

1.6.2

3 years ago

1.4.4

3 years ago

1.6.1

3 years ago

1.4.3

3 years ago

1.6.0

3 years ago

1.4.2

3 years ago

1.2.4

3 years ago

1.4.1

3 years ago

1.2.3

3 years ago

1.4.0

3 years ago

1.9.10

3 years ago

1.9.9

3 years ago

1.9.8

3 years ago

1.9.7

3 years ago

1.9.6

3 years ago

1.9.5

3 years ago

1.6.11

3 years ago

1.9.4

3 years ago

1.6.10

3 years ago

1.9.3

3 years ago

1.9.2

3 years ago

1.9.1

3 years ago

1.9.0

3 years ago

1.7.2

3 years ago

1.7.1

3 years ago

1.7.0

3 years ago

1.5.1

3 years ago

1.5.0

3 years ago

1.3.1

3 years ago

1.3.0

3 years ago

1.5.0-beta.0

3 years ago

1.6.9

3 years ago

1.6.8

3 years ago

1.6.7

3 years ago

1.6.6

3 years ago

1.6.5

3 years ago

1.2.0

3 years ago

1.0.2

3 years ago

1.1.0

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago

1.2.2

3 years ago

1.2.1

3 years ago

1.0.0-beta.2

3 years ago

1.0.0-beta.3

3 years ago

1.0.0-beta.4

3 years ago

1.0.0-beta.5

3 years ago

1.0.0-beta.0

3 years ago

1.0.0-beta.1

3 years ago

1.0.0-beta.11

3 years ago

1.0.0-beta.10

3 years ago

1.0.0-beta.6

3 years ago

1.0.0-beta.7

3 years ago

1.0.0-beta.8

3 years ago

1.0.0-beta.9

3 years ago

0.0.7

3 years ago

0.0.6

3 years ago

0.0.5

3 years ago

0.0.4

3 years ago

0.0.3

3 years ago

0.0.2

3 years ago

0.0.1

3 years ago