问题描述
import { OrbitControls,Environment } from "@react-three/drei"
import { HexColorPicker } from 'react-colorful'
import * as THREE from 'three'
import React,{Suspense,useRef,useState } from 'react'
import { useGLTF } from '@react-three/drei'
import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader'
import { proxy,useSnapshot } from 'valtio'
import "./index.scss"
const state = proxy({
current:null,dress_color: "#bc4b4b",items:{
M003:"#bc4b4b",mat:"#bc4b4b",M001:"#bc4b4b",M002:"#bc4b4b",M007:"#bc4b4b",M008:"#bc4b4b",MM001:"#bc4b4b",flower:"#bc4b4b",}
})
type GLTFResult = GLTF & {
nodes: {
Mesh_0: THREE.Mesh
Mesh_1: THREE.Mesh
Mesh_2: THREE.Mesh
Mesh_3: THREE.Mesh
Mesh_4: THREE.Mesh
Mesh_5: THREE.Mesh
Mesh_6: THREE.Mesh
Plane: THREE.Mesh
}
materials: {
['Material.M003']: THREE.MeshStandardMaterial
['mat']: THREE.MeshStandardMaterial
['Material.M001']: THREE.MeshStandardMaterial
['Material.M002']: THREE.MeshStandardMaterial
['Material.M007']: THREE.MeshStandardMaterial
['Material.M008']: THREE.MeshStandardMaterial
['None.MM001']: THREE.MeshStandardMaterial
['flower']: THREE.MeshStandardMaterial
}
}
function Model(props:JSX.IntrinsicElements['group']) {
const group = useRef<THREE.Group>()
const snap = useSnapshot(state)
const { nodes,materials } = useGLTF('/untitled.glb') as GLTFResult
const [hovered,set] = useState(null)
return (
<group ref={group} {...props} dispose={null}
onPointerOver={(e:any) => {
e.stopPropagation();set(e.object.material.name)
}}
onPointerOut={(e) => {
e.intersections.length === 0 && set(null)
}}
onPointerDown={(e:any) => {
e.stopPropagation();(state.current = e.object.material.name)
}}
onPointerMissed={(e) => {
state.current = null
}}
>
<group rotation={[-Math.PI / 2,0]}>
<mesh material-color={snap.items.M003} geometry={nodes.Mesh_0.geometry} material={materials['Material.M003']} />
<mesh material-color={snap.items.mat} geometry={nodes.Mesh_1.geometry} material={materials['mat']} />
<mesh material-color={snap.items.M001} geometry={nodes.Mesh_2.geometry} material={materials['Material.M001']} />
<mesh material-color={snap.items.M002} geometry={nodes.Mesh_3.geometry} material={materials['Material.M002']} />
<mesh material-color={snap.items.M007} geometry={nodes.Mesh_4.geometry} material={materials['Material.M007']} />
<mesh material-color={snap.items.M008} geometry={nodes.Mesh_5.geometry} material={materials['Material.M008']} />
<mesh material-color={snap.items.MM001} geometry={nodes.Mesh_6.geometry} material={materials['None.MM001']} />
</group>
<mesh material-color={snap.items.flower} geometry={nodes.Plane.geometry} material={materials['flower']} position={[0,52.7,0]} />
</group>
)
}
function Picker(){
const snap = useSnapshot(state)
return(
<div className="picker">
<HexColorPicker style={{
position: 'absolute',right: '8%',top: '20%',transform: 'translate(-50%,-50%)'}}
color={snap.items[snap.current]}
onChange={(color) => (state.items[snap.current] = color)}/>
</div>
)
}
const EditableObject = () => {
return (
<div id="the-3d-object">
<>
<Canvas
camera={{ position: [40.1813,10,70],fov: 33}}
>
{/* <ambientLight intensity={0.5} /> */}
<axesHelper />
<Suspense fallback={null}>
<Model />
<Environment files="hdr.hdr" />
</Suspense>
<OrbitControls/>
</Canvas>
<Picker/>
</>
</div>
)
}
useGLTF.preload('/untitled.glb')
export default EditableObject
在 div 中的 Picker 函数中找到颜色线,在该线下为 snap.current,这些线应该可以帮助我从面板中选择颜色,并将其应用于网格和材料,但我有那个错误说 Type 'null' 不能用作索引。当我在活动之前使用电流并帮助我选择材料时,但是当我尝试在此功能中使用它时,我收到该错误,我准备了其他帖子和文档,但我没有找到任何答案或修复它的方法。 down是错误所在的代码部分
const snap = useSnapshot(state)
return(
<div className="picker">
<HexColorPicker style={{
position: 'absolute',-50%)'}}
color={snap.items[snap.current]}
onChange={(color) => (state.items[snap.current] = color)}/>
</div>
)
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)