How to make the controller always behind the motion model

Hey,guys!I’m here again.
Recently, I’ve been looking for ways to keep the controller behind model. Regardless of rotation or translation.The following picture is just a model move without controller.I’m just learning and looking for advice :innocent:

1 Like

Sorry but it’s not really clear what you are looking for. In general, it’s more efficient to share a live example that shows your current work of progress instead of sharing screenshots of code. This makes it easier to debug and update the example with a possible solution. Consider to use a website like jsfiddle to make your demo: https://jsfiddle.net/f2Lommf5/. And please also describe in more detail your expected behavior.

Emmm…,jsfiddle can’t be opened here.all my code is that:

    <body >
    <div id="index" ></div>
      <script type="module">
        import * as THREE from '../build/three.module.js'
        import {OrbitControls} from './jsm/controls/OrbitControls.js'
        import {GLTFLoader} from './jsm/loaders/GLTFLoader.js'
        let buildFlag=true,model,GLTFObject, moveforward=false,moveback=false, moveleft=false,moveright=false;
        let direction=new THREE.Vector3(), velocity=new THREE.Vector3(),prevTime=performance.now(),vec=new THREE.Vector3()
        let scene,renderer,camera,orbitcontrol,light,amlight;
        let screenWidth=window.innerWidth,
            screenHeight=window.innerHeight;
            mounted()
        function initParam(){
            scene=new THREE.Scene()

            renderer=new THREE.WebGLRenderer()//{canvas:demo}
            renderer.setSize( screenWidth, screenHeight)
            renderer.setClearColor(0xffffff)
            document.getElementById('index').appendChild(  renderer.domElement)
      
            camera=new THREE.PerspectiveCamera(45, screenWidth/ screenHeight,0.1,1000)
            camera.position.set(0, 6,20)
            camera.up.set(0,1,0)
              
            orbitcontrol=new OrbitControls(camera,renderer.domElement)
            orbitcontrol.enableZoom=false
            orbitcontrol.maxPolarAngle=Math.PI/2
            orbitcontrol.minPolarAngle=Math.PI/2
            window.addEventListener('keydown',keyDownOperation,false)
            window.addEventListener('keyup',keyUpOperation,false)
      
            light=new THREE.DirectionalLight(0xffffff,1,100)
            light.position.set(0,200,-500)
            light.castShadow=true
            amlight=new THREE.AmbientLight(0xffffff)
            scene.add(amlight)
    
            createAxis(new THREE.Vector3( 1, 0, 0 ),new THREE.Vector3( 0, 0, 0 ),10,0xff0000)
            createAxis(new THREE.Vector3( 0, 1, 0 ),new THREE.Vector3( 0, 0, 0 ),10,0x00ff00)
            createAxis(new THREE.Vector3( 0, 0, 1 ),new THREE.Vector3( 0, 0, 0 ),10,0x0000ff)          
            }

        function  createAxis(dir,origin,length,hex){
            dir.normalize();
            let arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );
            scene.add( arrowHelper );
            }
        function  keyDownOperation(e){
            switch(e.code){
              case 'KeyQ': 
                ;break;
              case 'KeyW': 
                moveforward=true
                ;break;
              case 'KeyA': 
                moveleft=true
                ;break;
              case 'KeyS':
                moveback=true
                ;break;
              case 'KeyD': 
                moveright=true
                ;break;
              default:break;
            }
          }
        function    keyUpOperation(e){
            switch(e.code){
              case 'KeyQ': 
                ;break;
              case 'KeyW': 
                moveforward=false
                ;break;
              case 'KeyA': 
                moveleft=false
                ;break;
              case 'KeyS':
                moveback=false
                ;break;
              case 'KeyD': 
                moveright=false
                ;break;
              default:break;
            }
          }
      
        function  initModel(){
            let gridHelper = new THREE.GridHelper( 100, 100 );
            scene.add( gridHelper );
            GLTFObject=new GLTFLoader()
            GLTFObject.load(`${buildFlag?'../../static/model/RobotExpressive.glb':'static/model/RobotExpressive.glb'}`, (gltf)=> {
            model=gltf.scene
            model.position.set(0,0,10)
            model.rotation.y=Math.PI
            scene.add(model)
              })
          }
        function  moveForward ( distance ) {
              vec.setFromMatrixColumn( model.children[0].matrix, 0 );
              vec.crossVectors( model.children[0].up, vec );
          model.children[0].position.addScaledVector( vec, distance );
          
          orbit_moveForward(-distance)
          }
        function  moveRight( distance ) {
              vec.setFromMatrixColumn( model.children[0].matrix, 0 );
          model.children[0].position.addScaledVector( vec, distance );
          
          	orbit_moveRight(-distance)
        }
        function orbit_moveForward ( distance ) {
              vec.setFromMatrixColumn( orbitcontrol.object.matrix, 0 );
              vec.crossVectors( orbitcontrol.object.up, vec );
          orbitcontrol.object.position.addScaledVector( vec, distance );
          }
        function  orbit_moveRight( distance ) {
              vec.setFromMatrixColumn( orbitcontrol.object.matrix, 0 );
              orbitcontrol.object.position.addScaledVector( vec, distance );
          }
        function  animations(){
              requestAnimationFrame(animations)
              if(model){
                model.children[0].rotation.copy(orbitcontrol.object.rotation)
              let time=performance.now()
              let delta = ( time - prevTime ) / 1000;
              orbitcontrol.target=new THREE.Vector3(model.position.x,model.position.y+4,model.position.z)
              velocity.x -= velocity.x * 10.0 * delta;
              velocity.z -= velocity.z * 10.0 * delta;
              direction.z = Number(moveforward) - Number(moveback);
              direction.x = Number(moveright) - Number(moveleft);
              direction.normalize();
              if (moveforward || moveback)
                velocity.z -= direction.z * 200.0 * delta;
              if (moveleft || moveright)
                velocity.x -= direction.x * 200.0 * delta;
                moveForward(velocity.z * delta);
                moveRight(velocity.x * delta);
                prevTime=time;
                }
            renderer.render(scene,camera)
              }	

            function  mounted(){
              initParam()
              initModel()
              animations()
          }
      </script>
</body>

When I move, then rotate the OrbitControls, the position of the model changes strangely, it not according to my target。Debugged, but I still don’t know what went wrong. :thinking: :thinking:

It is working.Details determine success or failure :thinking:

moveForward ( distance ) {
      vec.setFromMatrixColumn( model.children[0].matrix, 0 );
      vec.crossVectors( model.children[0].up, vec );
      model.position.addScaledVector( vec, -distance );
      orbit_moveForward(-distance)
  },
  moveRight( distance ) {
      vec.setFromMatrixColumn( model.children[0].matrix, 0 );
      model.position.addScaledVector( vec, -distance );
      orbit_moveRight(-distance)
  },