【问题标题】:How to rotate object with offset by orbit control in three.js?如何在three.js中通过轨道控制旋转具有偏移量的对象?
【发布时间】:2019-01-01 03:57:30
【问题描述】:

我想像这样控制对象:

现在相机绕 Y 坐标移动,但需要绕新 Y 移动。代码在这里:

var material = new THREE.MeshLambertMaterial({color: 0x00ff00});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
var controls = new THREE.OrbitControls(camera);
cube.position.x = 300;
// controls.target = THREE.Vector3(300, 0, 0);

我发现target选项可以设置控件的焦点,但是如果我添加这个代码:controls.target = THREE.Vector3(300, 0, 0);对象回到屏幕的中心,但它应该在右边缘。

此外,当我将new THREE.OrbitControls(camera); 设置为new THREE.OrbitControls(cube); 并添加controls.target = THREE.Vector3(300, 0, 0); 时,控件不起作用,但是当我设置controls.target = THREE.Vector3(301, 0, 0); 时,它是受管理的,但不像相机

【问题讨论】:

标签: javascript three.js


【解决方案1】:

OrbitControls.target 设置控件的焦点,.object 围绕它运行。但这是手动操作。如文档中所述,OrbitControls.update() 必须在手动更改相机变换后调用。

例如

controls.target = new THREE.Vector3(1, 0, 0)
controls.update();

看例子:

(function onLoad() {
  var container, camera, scene, renderer, controls;
  
  init();
  animate();

  function init() {
    container = document.getElementById('container');
    
    renderer = new THREE.WebGLRenderer({
      antialias: true
    });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.shadowMap.enabled = true;
    container.appendChild(renderer.domElement);

    camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
    camera.position.set(0, 1.0, -4);
    
    scene = new THREE.Scene();
    scene.background = new THREE.Color(0xffffff);
    scene.add(camera);
    window.onresize = resize;
    
    var ambientLight = new THREE.AmbientLight(0x404040);
    scene.add(ambientLight);

    var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
    directionalLight.position.set(1,2,1.5);
    scene.add( directionalLight );

    controls = new THREE.OrbitControls(camera, container);
    controls.target = new THREE.Vector3(3, 0, 0)
    controls.update();
    controls.autoRotate = true;
    controls.autoRotateSpeed = 5.0
            
    var axis = new THREE.AxesHelper(1000);
    scene.add(axis);

    var material = new THREE.MeshPhongMaterial({color:'#b090b0'});
    var geometry = new THREE.BoxGeometry( 1, 1, 1 );
    var mesh = new THREE.Mesh(geometry, material);

    scene.add(mesh);
  }


  function resize() {   
    var aspect = window.innerWidth / window.innerHeight;
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = aspect;
    camera.updateProjectionMatrix();
  }

  function animate() {
    requestAnimationFrame(animate);
    controls.update();
    render();
  }

  function render() {
    renderer.render(scene, camera);
  }
})();
<script src="https://cdn.jsdelivr.net/npm/three@0.115/build/three.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.115/examples/js/controls/OrbitControls.js"></script>

<div id="container"></div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多