NgtpDotScreen
import { ChangeDetectionStrategy, Component } from '@angular/core';import { PostprocessingWrapper } from '@postprocessing/wrapper.ts';import { NgtCanvas, provideNgtRenderer } from 'angular-three/dom';import { SceneGraph } from './scene-graph';
@Component({ selector: 'app-dot-screen', template: ` <ngt-canvas [camera]="{ position: [0, 0, 5], fov: 50 }"> <app-postprocessing-wrapper *canvasContent [lights]="true"> <app-scene-graph /> </app-postprocessing-wrapper> </ngt-canvas> `, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'dot-screen-demo relative block h-full' }, imports: [NgtCanvas, PostprocessingWrapper, SceneGraph],})export default class DotScreen { static clientProviders = [provideNgtRenderer()];}import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, viewChild } from '@angular/core';import { beforeRender, NgtArgs } from 'angular-three';import { NgtpBrightnessContrast, NgtpDotScreen, NgtpEffectComposer } from 'angular-three-postprocessing';import * as THREE from 'three';
@Component({ selector: 'app-scene-graph', template: ` <ngt-mesh #mesh> <ngt-torus-geometry *args="[1, 0.4, 32, 64]" /> <ngt-mesh-standard-material color="#ff6b6b" /> </ngt-mesh>
<ngtp-effect-composer> <ngtp-dot-screen [options]="{ scale: 0.8, angle: 0.5 }" /> <ngtp-brightness-contrast [options]="{ contrast: 0.3 }" /> </ngtp-effect-composer> `, schemas: [CUSTOM_ELEMENTS_SCHEMA], changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgtArgs, NgtpEffectComposer, NgtpDotScreen, NgtpBrightnessContrast],})export class SceneGraph { private meshRef = viewChild.required<ElementRef<THREE.Mesh>>('mesh');
constructor() { beforeRender(({ delta }) => { const mesh = this.meshRef().nativeElement; mesh.rotation.x += delta * 0.3; mesh.rotation.y += delta * 0.5; }); }}The dot screen effect creates a halftone pattern similar to printed media, converting the image into a pattern of dots.
import { NgtpEffectComposer, NgtpDotScreen } from 'angular-three-postprocessing';
@Component({ template: ` <ngtp-effect-composer> <ngtp-dot-screen [options]="{ scale: 1.0, angle: Math.PI * 0.5 }" /> </ngtp-effect-composer> `, imports: [NgtpEffectComposer, NgtpDotScreen],})export class SceneGraph { protected Math = Math;}Options
Section titled “Options”| Property | Type | Default | Description |
|---|---|---|---|
scale | number | 1.0 | Scale of the dot pattern |
angle | number | 1.57 | Rotation angle of the pattern in radians |
Example: Comic Book Style
Section titled “Example: Comic Book Style”@Component({ template: ` <ngt-mesh> <ngt-torus-geometry *args="[1, 0.4, 16, 32]" /> <ngt-mesh-standard-material color="yellow" /> </ngt-mesh>
<ngtp-effect-composer> <ngtp-dot-screen [options]="{ scale: 0.8, angle: 0.5 }" /> <!-- Add contrast for bolder dots --> <ngtp-brightness-contrast [options]="{ contrast: 0.2 }" /> </ngtp-effect-composer> `, imports: [NgtpEffectComposer, NgtpDotScreen, NgtpBrightnessContrast, NgtArgs], schemas: [CUSTOM_ELEMENTS_SCHEMA],})export class SceneGraph {}- Smaller
scalevalues create finer dot patterns - Adjust
angleto change the orientation of the dot grid - Combine with high contrast for a bold comic book or pop art look
- Works well with
NgtpColorAveragefor black-and-white halftone