首页 文章

将相机保持在地面上(使用OrbitControls.js)

提问于
浏览
2

所以我有一个非常简单的情况,地平面基本上是y = 0的地方,我想让摄像机始终保持在地面以上 . 我也想要一些感觉直观(并且与触摸兼容)的好控件,并且我发现OrbitControls.js看起来最适合这个,也因为我可以通过将maxPolarAngle设置为小于或等于Math的数字来轻松限制极角 . PI / 2(四分之一转) .

尽管如此,即使这样做,用户也可以在地面下平移,除非完全禁用平移(我不想这样做) . 手动限制,以便y永远不会消极感到奇怪,但我认为只是忽略y轴上的任何变化,例如将第165行(panUp功能)更改为以下内容

panOffset.set( te[ 4 ], 0, te[ 6 ] );
panOffset.normalize();

导致一个快速而肮脏的解决方案,做了我想要的 .

但现在用户现在只能通过缩放来改变相机高度 .

你能想到更好的解决方案吗?也许这个主题可以作为官方解决方案的思考,我相信我不会是唯一一个从这样的解决方案中受益的人 .

/编辑:我最初没有规范化偏移向量,导致另一个问题,现在改变了 .

2 回答

  • 1

    以防有人需要答案:

    您可以找到相对于控制目标的角度和摄像机的地面位置(无论高度如何)并指定maxPolarAngle . 调整你的向上轴,我的是Y.在控制改变事件内:

    var centerPosition = controls.target.clone();
    centerPosition.y = 0;
    var groundPosition = camera.position.clone();
    groundPosition.y = 0;
    var d = (centerPosition.distanceTo(groundPosition));
    
    var origin = new THREE.Vector2(controls.target.y,0);
    var remote = new THREE.Vector2(0,d); // replace 0 with raycasted ground altitude
    var angleRadians = Math.atan2(remote.y - origin.y, remote.x - origin.x);
    controls.maxPolarAngle = angleRadians;
    
  • 0

    我有问题让OrbitsControls.js按我的意愿工作 . 对我来说最有效的疗法是创建我自己的CamaraControls,它按照我的要求运行 . 我怀疑这不是你想要的答案,因为它涉及一些工作 . 您可以随时添加自己的更新函数来钳制值 .

    THREE.OrbitControls.clampedUpdate = function () {
        THREE.OrbitControls.update.call(this);
        if (this.object.position.y < 0) {
            this.object.position.y = 0;
        }
    }
    

相关问题