1

I am trying to make a spider have a certain velocity when control keys are pressed using react three cannon. The 3D model rolls along with the sphere.

The code is as follows:

// import { useFBX } from "@react-three/drei"
import { useSphere } from "@react-three/cannon"
import { useAnimations } from "@react-three/drei"
import { useLoader } from "@react-three/fiber"
import { useEffect, useState } from "react"
import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader'



const Spider = (props) => {
    const [position, setPosition] = useState(props.position)
    const model = useLoader(FBXLoader, '../assets/models3D/spider/Spider.fbx')

    console.log(model)

    const animations = useAnimations(model.animations, model)
    const actions = {
        jump: {
            anim: animations.actions["Spider_Armature|Jump"],
            keys: [' '],
            active: false
        },
        normal: {
            anim: animations.actions["Spider_Armature|normal"],
            keys: [],
            active: false
        },
        wait: {
            anim: animations.actions["Spider_Armature|warte_pose"],
            keys: [],
            active: true
        },
        walkForward: {
            anim: animations.actions["Spider_Armature|walk_ani_vor"],
            keys: ['ArrowUp', 'w'],
            active: false
        },
        walkBackward: {
            anim: animations.actions["Spider_Armature|walk_ani_back"],
            keys: ['ArrowDown', 's'],
            active: false
        },
        walkLeft: {
            anim: animations.actions["Spider_Armature|walk_left"],
            keys: ['ArrowLeft', 'a'],
            active: false
        },
        walkRight: {
            anim: animations.actions["Spider_Armature|walk_right"],
            keys: ['ArrowRight', 'd'],
            active: false
        },
    }

    const [ref, api] = useSphere(() => ({ mass: 1, position: position, allowSleep: false, type: "Dynamic" }))


    useEffect(() => {
        actions.wait.anim.play()

        window.addEventListener("keydown", ({ key }) => {
            Object.keys(actions).forEach(i => {
                let action = actions[i]
                if (action.keys.indexOf(key) > -1) {
                    action.active = true
                    action.anim.play()
                    api.velocity.set(0, 0, -1);
                }
            })
        })
        window.addEventListener("keyup", ({ key }) => {
            Object.keys(actions).forEach(i => {
                let action = actions[i]
                if (action.keys.indexOf(key) > -1) {
                    action.active = false
                    action.anim.stop()
                    api.velocity.set(0, 0, 0);
                }
            })
        })
    }, [])


    return (<>
        <primitive object={model} scale={0.05} position={position} ref={ref} />
    </>)
}

export default Spider

How can the spider move along with the sphere without rolling? What could be a solution if useBox was used instead? Is reducing friction a good idea? If so how can it be done.

Please pardon my newness and thanks in advance!!

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.