使用ThreeJs,有没有办法限制x,y z运动?

时间:2013-12-29 14:17:09

标签: three.js

在ThreeJS中,我使用firstpersoncontrols来移动相机;我想设置一个限制(最大和最小),观察者可以在x和z方向上移动。我有可以使用的财产吗?

目前我已尝试修改firstPersoncontrols.js中的代码,但效果不是很好:

var targetPosition = this.target,             position = this.object.position;

    var maxx = Math.sqrt(Math.pow(6000,2) - Math.pow(position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta ) + 500,2)) - 500;
    var minx = - Math.sqrt(Math.pow(6000,2) - Math.pow(position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta ) + 500,2)) + 500;
    var maxz = Math.sqrt(Math.pow(6000,2) - Math.pow(position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta ) - 500,2)) - 500;
    var minz = - Math.sqrt(Math.pow(6000,2) - Math.pow(position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta ) - 500,2)) + 500;

    if (position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta ) <= maxx && position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta ) >= minx) {
        targetPosition.x = position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta );
    } else {
        position.x = position.x - 100 * Math.sin( this.phi ) * Math.cos( this.theta );
        targetPosition.x = position.x;
    }

    targetPosition.y = position.y + 100 * Math.cos( this.phi );

    if (position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta ) <= maxz && position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta ) >= minz) {
    targetPosition.z = position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta );
    } else {
        position.z = position.z - 100 * Math.sin( this.phi ) * Math.sin( this.theta );
        targetPosition.z = position.z
    }

    this.object.lookAt( targetPosition );

1 个答案:

答案 0 :(得分:0)

最终,问题针对的是熟悉threejs图书馆第一人称控件的人。

我想要将最大值和最小值放在x和z上,以防止用户/相机朝任何方向移动;我找到的解决方案(上面的一个和后来的改进版本)并不复杂,导致了抖动和其他问题。

最终,我从代码中删除了firstpersoncontrols,并改为使用路径,以便在3D空间周围自动引导用户。这不是理想的,我宁愿用户指导他们的自我,但有边界阻止他们偏离定义的场景。