group/mesh 内的三个 js 和 react 按钮调用我的添加功能
Three js and react button inside group/mesh to call for my add function
这是我的 three.js 反应代码,我想在 glb 文件的组内添加按钮,我该怎么做?
我尝试了其中的大部分,我使用 <mesh>
作为按钮不起作用,同样适用于 <block>
还有我如何在我的 onChange 上添加颜色,它没有读取它。
function Violon({ ...props }) {
const group = useRef()
const snap = useSnapshot(state)
// Animate model
const [violonBody, setviolonBody] = useState('')
const [violonStick, setviolonStick] = useState('')
const [violonChincrest, setviolonChincrest] = useState('')
const addCustomizations = () => {
//{object}
Axios.post('http://localhost:5000/customizations', {
violonBody: violonBody,
violonStick: violonStick,
violonChincrest: violonChincrest,
user: JSON.parse(localStorage.getItem('user'))
}).then(() => {
console.log('success')
})
}
// Cursor showing current color
const [hovered, set] = useState(null)
const { nodes, materials } = useGLTF('v.glb')
return (
<group
ref={group}
dispose={null}
onPointerOver={(e) => (e.stopPropagation(), set(e.object.material.name))}
onPointerOut={(e) => e.intersections.length === 0 && set(null)}
onPointerMissed={() => (state.current = null)}
onPointerDown={(e) => (e.stopPropagation(), (state.current = e.object.material.name))}>
<mesh
geometry={nodes.subD3_Bout001.geometry}
material={materials.defaultMat002}
material-color={snap.items.defaultMat002}
rotation={[Math.PI / 2, 0, 0]}
onChange={(event) => {
setviolonBody(event.target.value)
}}
/>
<mesh
geometry={nodes.subD3_Bridge.geometry}
material={materials.defaultMat003}
material-color={snap.items.defaultMat003}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Chincrest.geometry}
material={materials.defaultMat004}
material-color={snap.items.defaultMat004}
rotation={[Math.PI / 2, 0, 0]}
onChange={(event) => {
setviolonChincrest(event.target.value)
}}
/>
<mesh
geometry={nodes.subD3_End_pin.geometry}
material={materials.defaultMat005}
material-color={snap.items.defaultMat005}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Eyelet.geometry}
material={materials.defaultMat006}
material-color={snap.items.defaultMat006}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Fingerboard.geometry}
material={materials.defaultMat007}
material-color={snap.items.defaultMat007}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Hair.geometry}
material={materials.defaultMat008}
material-color={snap.items.defaultMat008}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Pegs.geometry}
material={materials.defaultMat009}
material-color={snap.items.defaultMat009}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes['subD3_Scroll-and-neck'].geometry}
material={materials.defaultMat010}
material-color={snap.items.defaultMat010}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Stick.geometry}
material={materials.defaultMat011}
material-color={snap.items.defaultMat011}
rotation={[Math.PI / 2, 0, 0]}
onChange={(event) => {
setviolonStick(event.target.value)
}}
/>
<mesh
geometry={nodes.subD3_Strings.geometry}
material={materials.defaultMat012}
material-color={snap.items.defaultMat012}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Tailpiece.geometry}
material={materials.defaultMat013}
material-color={snap.items.defaultMat013}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Tuners.geometry}
material={materials.defaultMat014}
material-color={snap.items.defaultMat014}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Violin001.geometry}
material={materials.defaultMat015}
material-color={snap.items.defaultMat015}
rotation={[Math.PI / 2, 0, 0]}
/>
</group>
)
}
这是我的 three.js 反应代码,我想在 glb 文件的组内添加按钮,我该怎么做?
感谢您的帮助!
有一个名为 Drei 的库,它允许您将 Html 部分转换为 3D 网格。
您可以尝试类似的方法:
<mesh geometry={nodes.subD3_Bout001.geometry}
material={materials.defaultMat002}
material-color={snap.items.defaultMat002}
rotation={[Math.PI / 2, 0, 0]}
onChange={(event) => {
setviolonBody(event.target.value)
}}
/>
<Html transform occlude>
<Button ...props />
</Html>
</Mesh>
Lucas 的解决方案:使用 Drei 的一个警告是,目前 Firefox 中存在一个错误,会导致 <Html>
组件呈现完全模糊。
这是我的 three.js 反应代码,我想在 glb 文件的组内添加按钮,我该怎么做?
我尝试了其中的大部分,我使用 <mesh>
作为按钮不起作用,同样适用于 <block>
还有我如何在我的 onChange 上添加颜色,它没有读取它。
function Violon({ ...props }) {
const group = useRef()
const snap = useSnapshot(state)
// Animate model
const [violonBody, setviolonBody] = useState('')
const [violonStick, setviolonStick] = useState('')
const [violonChincrest, setviolonChincrest] = useState('')
const addCustomizations = () => {
//{object}
Axios.post('http://localhost:5000/customizations', {
violonBody: violonBody,
violonStick: violonStick,
violonChincrest: violonChincrest,
user: JSON.parse(localStorage.getItem('user'))
}).then(() => {
console.log('success')
})
}
// Cursor showing current color
const [hovered, set] = useState(null)
const { nodes, materials } = useGLTF('v.glb')
return (
<group
ref={group}
dispose={null}
onPointerOver={(e) => (e.stopPropagation(), set(e.object.material.name))}
onPointerOut={(e) => e.intersections.length === 0 && set(null)}
onPointerMissed={() => (state.current = null)}
onPointerDown={(e) => (e.stopPropagation(), (state.current = e.object.material.name))}>
<mesh
geometry={nodes.subD3_Bout001.geometry}
material={materials.defaultMat002}
material-color={snap.items.defaultMat002}
rotation={[Math.PI / 2, 0, 0]}
onChange={(event) => {
setviolonBody(event.target.value)
}}
/>
<mesh
geometry={nodes.subD3_Bridge.geometry}
material={materials.defaultMat003}
material-color={snap.items.defaultMat003}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Chincrest.geometry}
material={materials.defaultMat004}
material-color={snap.items.defaultMat004}
rotation={[Math.PI / 2, 0, 0]}
onChange={(event) => {
setviolonChincrest(event.target.value)
}}
/>
<mesh
geometry={nodes.subD3_End_pin.geometry}
material={materials.defaultMat005}
material-color={snap.items.defaultMat005}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Eyelet.geometry}
material={materials.defaultMat006}
material-color={snap.items.defaultMat006}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Fingerboard.geometry}
material={materials.defaultMat007}
material-color={snap.items.defaultMat007}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Hair.geometry}
material={materials.defaultMat008}
material-color={snap.items.defaultMat008}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Pegs.geometry}
material={materials.defaultMat009}
material-color={snap.items.defaultMat009}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes['subD3_Scroll-and-neck'].geometry}
material={materials.defaultMat010}
material-color={snap.items.defaultMat010}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Stick.geometry}
material={materials.defaultMat011}
material-color={snap.items.defaultMat011}
rotation={[Math.PI / 2, 0, 0]}
onChange={(event) => {
setviolonStick(event.target.value)
}}
/>
<mesh
geometry={nodes.subD3_Strings.geometry}
material={materials.defaultMat012}
material-color={snap.items.defaultMat012}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Tailpiece.geometry}
material={materials.defaultMat013}
material-color={snap.items.defaultMat013}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Tuners.geometry}
material={materials.defaultMat014}
material-color={snap.items.defaultMat014}
rotation={[Math.PI / 2, 0, 0]}
/>
<mesh
geometry={nodes.subD3_Violin001.geometry}
material={materials.defaultMat015}
material-color={snap.items.defaultMat015}
rotation={[Math.PI / 2, 0, 0]}
/>
</group>
)
}
这是我的 three.js 反应代码,我想在 glb 文件的组内添加按钮,我该怎么做? 感谢您的帮助!
有一个名为 Drei 的库,它允许您将 Html 部分转换为 3D 网格。
您可以尝试类似的方法:
<mesh geometry={nodes.subD3_Bout001.geometry}
material={materials.defaultMat002}
material-color={snap.items.defaultMat002}
rotation={[Math.PI / 2, 0, 0]}
onChange={(event) => {
setviolonBody(event.target.value)
}}
/>
<Html transform occlude>
<Button ...props />
</Html>
</Mesh>
Lucas 的解决方案:使用 Drei 的一个警告是,目前 Firefox 中存在一个错误,会导致 <Html>
组件呈现完全模糊。