three.js(102版)如何使用OrbitControls设置相机的默认位置和旋转

时间:2019-03-23 03:44:45

标签: javascript three.js orbit

我创建了一个场景,无需使用OrbitControls就可以了。 当我使用OrbitControls时,我发现相机的位置和旋转发生了变化,因此无法对其进行修改。

有人可以告诉我如何使用OrbitControls设置相机的默认位置和旋转角度。

谢谢! three.js - OrbitControls

1 个答案:

答案 0 :(得分:2)

async def on_message(msg): if msg.content.startswith("Bot, start"): findProgram = msg.content.split(" ") ServerKind = findProgram[2] servers = {"MainWorld": MainWorld, "SpinOffWorld": SpinOffWorld, "AnyOtherServer": AnyOtherServer} if ServerKind in servers: servers[ServerKind].Run() # ... else: await client.say(msg.channel, "Sorry, Server Not Recognised") 需要OrbitControls。设置target,以便获得相同的视图。

target

  camera.position.set(1, 8, 7);

  const controls = new THREE.OrbitControls(camera, canvas);
  controls.target.set(0, 3, 0);
  controls.update();  
'use strict';

/* global THREE */

function main() {
  const canvas = document.querySelector('#c');
  const renderer = new THREE.WebGLRenderer({canvas: canvas});

  const fov = 75;
  const aspect = 2;  // the canvas default
  const near = 0.1;
  const far = 500;
  const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  camera.position.set(1, 8, 7);
  
  const controls = new THREE.OrbitControls(camera, canvas);
  controls.target.set(0, 3, 0);
  controls.update();  

  const scene = new THREE.Scene();

  {
    const color = 0xFFFFFF;
    const intensity = 1;
    const light = new THREE.DirectionalLight(color, intensity);
    light.position.set(-1, 2, 4);
    scene.add(light);
  }

  {
    const boxWidth = 1;
    const boxHeight = 10;
    const boxDepth = 1;
    const geometry = new THREE.BoxBufferGeometry(boxWidth, boxHeight, boxDepth);
    const material = new THREE.MeshPhongMaterial({color: 'red'});

    const cube = new THREE.Mesh(geometry, material);
    scene.add(cube);
    cube.position.y = .5;
  }
  
  {
    const geometry = new THREE.PlaneBufferGeometry(10, 10);
    const material = new THREE.MeshPhongMaterial({color: 'gray'});

    const plane = new THREE.Mesh(geometry, material);
    scene.add(plane);
    plane.rotation.x = Math.PI * -0.5;
  }

  function resizeRendererToDisplaySize(renderer) {
    const canvas = renderer.domElement;
    const width = canvas.clientWidth;
    const height = canvas.clientHeight;
    const needResize = canvas.width !== width || canvas.height !== height;
    if (needResize) {
      renderer.setSize(width, height, false);
    }
    return needResize;
  }

  function render(time) {
    if (resizeRendererToDisplaySize(renderer)) {
      const canvas = renderer.domElement;
      camera.aspect = canvas.clientWidth / canvas.clientHeight;
      camera.updateProjectionMatrix();
    }

    renderer.render(scene, camera);

    requestAnimationFrame(render);
  }

  requestAnimationFrame(render);
}

main();
body { margin: 0; }
#c { width: 100vw; height: 100vh; display: block; }

或者您可以根据当前相机视图计算目标。 <canvas id="c"></canvas> <script src="https://threejsfundamentals.org/threejs/resources/threejs/r102/three.min.js"></script> <script src="https://threejsfundamentals.org/threejs/resources/threejs/r102/js/controls/OrbitControls.js"></script>围绕目标飞行,因此您需要选择距摄像机的距离作为目标

OrbitControls

请注意, const camera = new THREE.PerspectiveCamera(fov, aspect, near, far); camera.position.set(1, 2, 5); camera.rotation.set(.1, .2, 0); // get the direction of the camera const direction = new THREE.Vector3(); camera.getWorldDirection(direction); const controls = new THREE.OrbitControls(camera, canvas); // point the target from the camera in the // target direction camera.getWorldPosition(controls.target); controls.target.addScaledVector(direction, 5); controls.update(); 中的5表示目标将在照相机面向的方向上位于照相机前方5个单位。 5是否是正确的距离取决于您。在我的示例场景中,摄像头从z = 5开始,因此摄像头前方5个单位似乎是放置目标的合理位置

addScaledVector
'use strict';

/* global THREE */

function main() {
  const canvas = document.querySelector('#c');
  const renderer = new THREE.WebGLRenderer({canvas: canvas});

  const fov = 75;
  const aspect = 2;  // the canvas default
  const near = 0.1;
  const far = 500;
  const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  camera.position.set(1, 2, 5);
  camera.rotation.set(.1, .2, 0);

  // compute a target direction
  const direction = new THREE.Vector3();
  camera.getWorldDirection(direction);

  const controls = new THREE.OrbitControls(camera, canvas);
  // point the target from the camera in the
  // target direction
  camera.getWorldPosition(controls.target);
  controls.target.addScaledVector(direction, 5);
  controls.update();  

  const scene = new THREE.Scene();

  {
    const color = 0xFFFFFF;
    const intensity = 1;
    const light = new THREE.DirectionalLight(color, intensity);
    light.position.set(-1, 2, 4);
    scene.add(light);
  }

  {
    const boxWidth = 1;
    const boxHeight = 10;
    const boxDepth = 1;
    const geometry = new THREE.BoxBufferGeometry(boxWidth, boxHeight, boxDepth);
    const material = new THREE.MeshPhongMaterial({color: 'red'});

    const cube = new THREE.Mesh(geometry, material);
    scene.add(cube);
    cube.position.y = .5;
  }
  
  {
    const geometry = new THREE.PlaneBufferGeometry(10, 10);
    const material = new THREE.MeshPhongMaterial({color: 'gray'});

    const plane = new THREE.Mesh(geometry, material);
    scene.add(plane);
    plane.rotation.x = Math.PI * -0.5;
  }

  function resizeRendererToDisplaySize(renderer) {
    const canvas = renderer.domElement;
    const width = canvas.clientWidth;
    const height = canvas.clientHeight;
    const needResize = canvas.width !== width || canvas.height !== height;
    if (needResize) {
      renderer.setSize(width, height, false);
    }
    return needResize;
  }

  function render(time) {
    if (resizeRendererToDisplaySize(renderer)) {
      const canvas = renderer.domElement;
      camera.aspect = canvas.clientWidth / canvas.clientHeight;
      camera.updateProjectionMatrix();
    }

    renderer.render(scene, camera);

    requestAnimationFrame(render);
  }

  requestAnimationFrame(render);
}

main();
body { margin: 0; }
#c { width: 100vw; height: 100vh; display: block; }