Canvas
Canvas
import React from "react";
import { Canvas } from "@react-three/fiber";
const App = () => (
<Canvas>
<pointLight position={[10, 10, 10]} />
<mesh>
<sphereGeometry />
<meshStandardMaterial color="hotpink" />
</mesh>
</Canvas>
);
PROP | DESCRIPTION | DEFAULT |
---|---|---|
children | three.js JSX elements or regular components | |
gl | Props that go into the default renderer, or your own renderer. Also accepts a synchronous callback like gl={canvas => new Renderer({ canvas })} |
{} |
camera | Props that go into the default camera, or your own THREE.Camera |
{ fov: 75, near: 0.1, far: 1000, position: [0, 0, 5] } |
shadows | Props that go into gl.shadowMap , can also be set true for PCFsoft |
false |
raycaster | Props that go into the default raycaster | {} |
frameloop | Render mode: always, demand, never | always |
resize | Resize config, see react-use-measure’s options | { scroll: true, debounce: { scroll: 50, resize: 0 } } |
orthographic | Creates an orthographic camera | false |
dpr | Pixel-ratio, use window.devicePixelRatio , or automatic: [min, max] |
[1, 2] |
legacy | Enables THREE.ColorManagement.legacyMode in three r139 or later | false |
linear | Switch off automatic sRGB encoding and gamma correction | false |
events | Configuration for the event manager, as a function of state | import { events } from "@react-three/fiber" |
eventSource | The source where events are being subscribed to, HTMLElement | React.MutableRefObject<HTMLElement> , gl.domElement.parentNode |
eventPrefix | The event prefix that is cast into canvas pointer x/y events | offset |
flat | Use THREE.NoToneMapping instead of THREE.ACESFilmicToneMapping |
false |
onCreated | Callback after the canvas has rendered (but not yet committed) | (state) => {} |
onPointerMissed | Response for pointer clicks that have missed any target | (event) => {} |
Custom Canvas
CreateRoot
创建一个针对画布的根,渲染
import * as THREE from "three";
import { extend, createRoot, events } from "@react-three/fiber";
// Register the THREE namespace as native JSX elements.
// See below for notes on tree-shaking
extend(THREE);
// Create a react root
const root = createRoot(document.querySelector("canvas"));
// Configure the root, inject events optionally, set camera, etc
root.configure({ events, camera: { position: [0, 0, 50] } });
// createRoot by design is not responsive, you have to take care of resize yourself
window.addEventListener("resize", () => {
root.configure({
size: { width: window.innerWidth, height: window.innerHeight },
});
});
// Trigger resize
window.dispatchEvent(new Event("resize"));
// Render entry point
root.render(<App />);
// Unmount and dispose of memory
// root.unmount()
Tree-shaking
import { extend, createRoot } from "@react-three/fiber";
import { Mesh, BoxGeometry, MeshStandardMaterial } from "three";
extend({ Mesh, BoxGeometry, MeshStandardMaterial });
createRoot(canvas).render(
<>
<mesh>
<boxGeometry />
<meshStandardMaterial />
</mesh>
</>
);
有一个官方的
// In:
import { createRoot } from "@react-three/fiber";
createRoot(canvasNode).render(
<mesh>
<boxGeometry />
<meshStandardMaterial />
</mesh>
);
// Out:
import { createRoot, extend } from "@react-three/fiber";
import {
Mesh as _Mesh,
BoxGeometry as _BoxGeometry,
MeshStandardMaterial as _MeshStandardMaterial,
} from "three";
extend({
Mesh: _Mesh,
BoxGeometry: _BoxGeometry,
MeshStandardMaterial: _MeshStandardMaterial,
});
createRoot(canvasNode).render(
<mesh>
<boxGeometry />
<meshStandardMaterial />
</mesh>
);