Я пытаюсь использовать шейдеры с React-three-fiber и Typescript. Файл шейдера:
import { ShaderMaterial } from "three"
import { extend } from "react-three-fiber"
class CustomMaterial extends ShaderMaterial {
constructor() {
super({
vertexShader: `...`,
fragmentShader: `...`,
uniforms: [...]
})
}
}
extend({ CustomMaterial })
и файл компонента:
<mesh
key = {el.name}
material = {el.material}
receiveShadow
castShadow
>
<bufferGeometry attach = "geometry" {...el.geometry} />
<customMaterial attach = "material" />
</mesh>
Я получаю сообщение об ошибке:
Свойство customMaterial не существует для типа 'JSX.IntrinsicElements'.
Пытаться:
declare global {
namespace JSX {
interface IntrinsicElements {
customMaterial: ReactThreeFiber.Object3DNode<CustomMaterial, typeof CustomMaterial>
}
}
}
Вам также может понадобиться вставить следующее в ваш импорт:
import { extend } from 'react-three-fiber'
...
extend ({ CustomMaterial })
Просто хотел бы добавить, что если вы пытаетесь добавить что-то кроме пользовательского материала, вы можете использовать ReactThreeFiber.Object3DNode.
Я пытался заставить OrbitControls работать, и мне удалось сделать это с помощью следующего метода:
import { extend } from '@react-three/fiber';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
declare global {
namespace JSX {
interface Intrinsicelements {
orbitControls: ReactThreeFiber.Node<OrbitControls, typeof OrbitControls>;
}
}
}
extend({ OrbitControls });
извините за то, что выкопал старую ветку, но я застрял в этой же проблеме. Куда мне поместить это объявление global ?