3.7.2 • Published 11 months ago

angular-three v3.7.2

Weekly downloads
-
License
MIT
Repository
github
Last release
11 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

11 months ago

4.0.0-next.96

11 months ago

4.0.0-next.93

11 months ago

4.0.0-next.94

11 months ago

4.0.0-next.84

12 months ago

4.0.0-next.85

12 months ago

4.0.0-next.88

12 months ago

4.0.0-next.89

12 months ago

4.0.0-next.86

12 months ago

4.0.0-next.87

12 months ago

4.0.0-next.91

12 months ago

4.0.0-next.92

11 months ago

4.0.0-next.90

12 months ago

4.0.0-next.82

12 months ago

4.0.0-next.83

12 months ago

4.0.0-next.73

12 months ago

4.0.0-next.74

12 months ago

4.0.0-next.71

12 months ago

4.0.0-next.72

12 months ago

4.0.0-next.77

12 months ago

4.0.0-next.78

12 months ago

4.0.0-next.75

12 months ago

4.0.0-next.76

12 months ago

4.0.0-next.79

12 months ago

4.0.0-next.80

12 months ago

4.0.0-next.81

12 months ago

4.0.0-next.69

12 months ago

4.0.0-next.70

12 months ago

4.0.0-next.59

12 months ago

4.0.0-next.62

12 months ago

4.0.0-next.63

12 months ago

4.0.0-next.60

12 months ago

4.0.0-next.61

12 months ago

4.0.0-next.66

12 months ago

4.0.0-next.67

12 months ago

4.0.0-next.64

12 months ago

4.0.0-next.65

12 months ago

4.0.0-next.68

12 months ago

4.0.0-next.55

1 year ago

4.0.0-next.56

1 year ago

4.0.0-next.53

1 year ago

4.0.0-next.54

1 year ago

4.0.0-next.57

12 months ago

4.0.0-next.58

12 months ago

4.0.0-next.51

1 year ago

4.0.0-next.52

1 year ago

4.0.0-next.50

1 year ago

4.0.0-next.40

1 year ago

4.0.0-next.41

1 year ago

4.0.0-next.44

1 year ago

4.0.0-next.45

1 year ago

4.0.0-next.42

1 year ago

4.0.0-next.43

1 year ago

4.0.0-next.48

1 year ago

4.0.0-next.49

1 year ago

4.0.0-next.46

1 year ago

4.0.0-next.47

1 year ago

4.0.0-next.30

1 year ago

4.0.0-next.33

1 year ago

4.0.0-next.34

1 year ago

4.0.0-next.31

1 year ago

4.0.0-next.32

1 year ago

4.0.0-next.37

1 year ago

4.0.0-next.38

1 year ago

4.0.0-next.35

1 year ago

4.0.0-next.36

1 year ago

4.0.0-next.39

1 year ago

4.0.0-next.22

1 year ago

4.0.0-next.23

1 year ago

4.0.0-next.20

1 year ago

4.0.0-next.21

1 year ago

4.0.0-next.26

1 year ago

4.0.0-next.27

1 year ago

4.0.0-next.24

1 year ago

4.0.0-next.25

1 year ago

4.0.0-next.28

1 year ago

4.0.0-next.29

1 year ago

4.0.0-next.19

1 year ago

4.0.0-next.18

1 year ago

4.0.0-next.11

1 year ago

4.0.0-next.12

1 year ago

4.0.0-next.10

1 year ago

4.0.0-next.15

1 year ago

4.0.0-next.16

1 year ago

4.0.0-next.13

1 year ago

4.0.0-next.14

1 year ago

4.0.0-next.17

1 year ago

4.0.0-next.9

1 year ago

4.0.0-next.8

1 year ago

4.0.0-next.7

1 year ago

4.0.0-next.6

1 year ago

4.0.0-next.5

1 year ago

4.0.0-next.4

1 year ago

4.0.0-next.3

1 year ago

4.0.0-next.2

1 year ago

3.7.1

1 year ago

3.7.2

1 year ago

4.0.0-next.1

1 year ago

3.7.0

1 year ago

3.6.1

1 year 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

2 years ago

2.0.0-beta.315

2 years ago

2.0.0-beta.307

2 years ago

2.0.0-beta.308

2 years ago

2.0.0-beta.309

2 years ago

2.0.0-beta.310

2 years ago

2.0.0-beta.311

2 years ago

2.0.0-beta.312

2 years ago

2.0.0-beta.313

2 years ago

2.0.0-beta.300

2 years ago

2.0.0-beta.301

2 years ago

2.0.0-beta.302

2 years ago

2.0.0-beta.303

2 years ago

2.0.0-beta.304

2 years ago

2.0.0-beta.305

2 years ago

2.0.0-beta.306

2 years ago

2.0.0-beta.296

2 years ago

2.0.0-beta.297

2 years ago

2.0.0-beta.298

2 years ago

2.0.0-beta.299

2 years ago

2.0.0-beta.290

2 years ago

2.0.0-beta.291

2 years ago

2.0.0-beta.292

2 years ago

2.0.0-beta.293

2 years ago

2.0.0-beta.294

2 years ago

2.0.0-beta.295

2 years ago

2.0.0-beta.285

2 years ago

2.0.0-beta.286

2 years ago

2.0.0-beta.287

2 years ago

2.0.0-beta.288

2 years ago

2.0.0-beta.289

2 years ago

2.0.0-beta.284

2 years ago

2.0.0-beta.278

2 years ago

2.0.0-beta.279

2 years ago

2.0.0-beta.280

2 years ago

2.0.0-beta.281

2 years ago

2.0.0-beta.282

2 years ago

2.0.0-beta.283

2 years ago

2.0.0-beta.274

2 years ago

2.0.0-beta.275

2 years ago

2.0.0-beta.276

2 years ago

2.0.0-beta.277

2 years ago

2.0.0-beta.271

2 years ago

2.0.0-beta.272

2 years ago

2.0.0-beta.273

2 years ago

2.0.0-beta.268

2 years ago

2.0.0-beta.269

2 years ago

2.0.0-beta.270

2 years ago

2.0.0-beta.265

2 years ago

2.0.0-beta.266

2 years ago

2.0.0-beta.267

2 years 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

2 years ago

2.0.0-beta.257

2 years ago

2.0.0-beta.258

2 years ago

2.0.0-beta.259

2 years ago

2.0.0-beta.250

2 years ago

2.0.0-beta.251

2 years ago

2.0.0-beta.263

2 years ago

2.0.0-beta.264

2 years ago

2.0.0-beta.260

2 years ago

2.0.0-beta.261

2 years ago

2.0.0-beta.262

2 years 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

3 years ago

2.0.0-beta.9

3 years ago

2.0.0-beta.8

3 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

3 years ago

2.0.0-beta.10

3 years ago

2.0.0-beta.15

3 years ago

2.0.0-beta.14

3 years ago

2.0.0-beta.13

3 years ago

2.0.0-beta.12

3 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

3 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