【问题标题】:Three.js: Unable to Set Maximum and Minimum Zoom LevelThree.js:无法设置最大和最小缩放级别
【发布时间】:2017-08-29 11:13:28
【问题描述】:

我将这个示例用于我的 WebGL 全景立方体: https://threejs.org/examples/?q=pano#webgl_panorama_equirectangular

我想在限制范围内放大和缩小,即设置最大和最小缩放级别,但不是像代码默认提供的那样无限。对于无限缩放,如果滚动太多,稍后会反转视图,上面示例中的函数如下所示:

    function onDocumentMouseWheel( event ) {
            camera.fov += event.deltaY * 0.05;
            camera.updateProjectionMatrix();
    }

为了解决我尝试在允许范围内更新 FOV 的问题:

    function onDocumentMouseWheel( event ) {
        var fovMAX = 95;
        var fovMIN = 5;
        var newFov = camera.fov + event.deltaY * 0.05;
        if (newFov > fovMIN && newFov < fovMAX) {
            camera.fov = newFov;
            camera.updateProjectionMatrix();
        };
    }

请注意我的 FOV 是 90:

camera = new THREE.PerspectiveCamera( 90, window.innerWidth / window.innerHeight), 0.1, 100 );

这似乎对于最大放大级别非常有效 - 当 FOV 为 5 时它会停止并且不会进一步放大。但是,当我缩小到 FOV 95 时,它会停止,但如果我继续用鼠标进一步缩小,我会再次无限放大,即使 FOV 仍然是 95。

如何停止/控制无限缩小?

【问题讨论】:

  • 你使用的是轨道控制器还是类似的东西?
  • 是的 OrbitController 我正在使用
  • 这可能会覆盖您的价值观。您可以禁用它并仅测试您的缩放逻辑吗?

标签: javascript three.js webgl


【解决方案1】:

您的代码在下面的最小示例中按预期工作。 (我确实做了一个小改动,因为我使用的是&gt;=/&lt;=,而不是&gt;/&lt;。)

var renderer, scene, camera, controls, stats;

var WIDTH = window.innerWidth,
  HEIGHT = window.innerHeight,
  FOV = 35,
  NEAR = 1,
  FAR = 1000;

var fovMax = 95,
  fovMin = 5,
  fovTmp = 0;

function zoom(event) {
  event.preventDefault();
  fovTmp = camera.fov + (event.deltaY * 0.05);
  if (fovTmp >= fovMin && fovTmp <= fovMax) {
    camera.fov = fovTmp;
    camera.updateProjectionMatrix();
  }
}

function init() {
  document.body.style.backgroundColor = "slateGray";

  renderer = new THREE.WebGLRenderer({
    antialias: true,
    alpha: true
  });

  document.body.appendChild(renderer.domElement);
  document.body.style.overflow = "hidden";
  document.body.style.margin = "0";
  document.body.style.padding = "0";

  scene = new THREE.Scene();

  camera = new THREE.PerspectiveCamera(FOV, WIDTH / HEIGHT, NEAR, FAR);
  camera.position.z = 50;
  scene.add(camera);

  var light = new THREE.PointLight(0xffffff, 1, Infinity);
  camera.add(light);

  stats = new Stats();
  stats.domElement.style.position = 'absolute';
  stats.domElement.style.top = '0';
  document.body.appendChild(stats.domElement);

  resize();
  window.onresize = resize;

  // POPULATE EXAMPLE
  var cubeGeo = new THREE.BoxBufferGeometry(1, 1, 1),
    cubeMat = new THREE.MeshPhongMaterial({
      color: "red"
    });
  var mesh = new THREE.Mesh(cubeGeo, cubeMat);
  scene.add(mesh);

  window.addEventListener("wheel", zoom);

  animate();
}

function resize() {
  WIDTH = window.innerWidth;
  HEIGHT = window.innerHeight;
  if (renderer && camera) {
    renderer.setSize(WIDTH, HEIGHT);
    camera.aspect = WIDTH / HEIGHT;
    camera.updateProjectionMatrix();
  }
}

function render() {
  renderer.render(scene, camera);
}

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

function threeReady() {
  init();
}

(function() {
  function addScript(url, callback) {
    callback = callback || function() {};
    var script = document.createElement("script");
    script.addEventListener("load", callback);
    script.setAttribute("src", url);
    document.head.appendChild(script);
  }

  addScript("https://threejs.org/build/three.js", function() {
    addScript("https://threejs.org/examples/js/libs/stats.min.js", function() {
      threeReady();
    })
  })
})();

其他东西正在改变您相机的数据。你确定你没有在任何地方更新camera.zoom

不管怎样,修​​改 FOV 的唯一其他(核心)three.js 方法是 PerspectiveCamera.setFocalLength

根据新信息进行编辑

啊,你的问题。我不知道您使用的是外接鼠标控制器。 OrbitControls 不会调整 FOV 来创建缩放效果。相反,它实际上将相机移近/远离控件的target。您的放大可能(偶然)对应于它达到 0 距离。但是因为它可以缩小到无限远,所以它继续缩小。

在您的评论中禁用缩放应该可以解决问题。

三个.js r87

【讨论】:

  • 谢谢。我发现这条线导致问题的问题:camera.position.z = 0.01;但是,当我删除它时,我无法再平移图像。缩放在最大缩小时停止,但我现在如何处理平移?
  • 我想我找到了解决方案:我需要这些行存在:controls.enableZoom = false; controls.enablePan = false;
  • @Vad 我已经在OrbitControls 上添加了更多信息来编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2012-01-29
  • 2013-11-04
  • 2011-05-13
相关资源
最近更新 更多