Javascript 计算螺旋半径,使螺旋中的模型位于平截头体内部

Javascript 计算螺旋半径,使螺旋中的模型位于平截头体内部,javascript,3d,three.js,viewport,frustum,Javascript,3d,Three.js,Viewport,Frustum,我正在构建一个应用程序,在其中我展示了一些带有纹理的平面。但是,我想根据平截头体宽度和相机位置动态计算螺旋线的半径(我在计算中使用它来创建螺旋线) 螺旋线位于屏幕中心x=0、y=0、z=0 我希望这能考虑屏幕方向(横向/纵向)。到目前为止,这是我的代码,但似乎我遗漏了一些东西,因为左侧和右侧的平面不在视口内 App.prototype.calculateHelixRadius = function(){ // plane width = height = 512; var

我正在构建一个应用程序,在其中我展示了一些带有纹理的平面。但是,我想根据平截头体宽度和相机位置动态计算螺旋线的半径(我在计算中使用它来创建螺旋线)

螺旋线位于屏幕中心x=0、y=0、z=0

我希望这能考虑屏幕方向(横向/纵向)。到目前为止,这是我的代码,但似乎我遗漏了一些东西,因为左侧和右侧的平面不在视口内

App.prototype.calculateHelixRadius = function(){

    // plane width = height =  512;

    var friend = this.getFriend();
    var vFOV = friend.camera.fov * Math.PI / 180;
    var dist = utils.getAbsPointsDistance3D(friend.camera.position, friend.scene.position);
    var aspect = friend.settings.container.clientWidth / friend.settings.container.clientHeight;

    var frustumHeight = 2.0 * dist * Math.tan(0.5 * vFOV);
    var frustumWidth = frustumHeight * aspect;

    return utils.isLandscape() ? frustumHeight / 2 : frustumWidth / 2 ;

};
我做错了什么?为什么屏幕边缘的平面不在里面

此处还有
getAbsPointsDistance3D

var utils = {

   // other helpers...

   getAbsPointsDistance3D: function(p1, p2) {

        var xd = p2.x - p1.x;
        var yd = p2.y - p1.y;
        var zd = p2.z - p1.z;

        return Math.sqrt(xd * xd + yd * yd + zd * zd);
    }

};
更新


我尝试减小dist参数,但结果不一致…

我想知道下面是否解释了您的剪辑

计算平截头体特征,然后使用平截头体宽度(宽度或高度取决于屏幕外观…我可能在这里得到了一些错误的细节,因为你的问题没有完全解释细节,但一般概念仍然适用)。下图是场景的俯视图,其中显示了一个圆,表示包围螺旋线的圆柱体。我相信你已经计算了半径1。如果是这样,请注意,在圆柱体中心的“前面”将有圆柱体(阴影区域)的剪裁,从而有螺旋线

相反,您需要计算圆柱体/螺旋半径,如第二幅图所示,即需要
半径2
。如果图像左侧的大角度为
fov
(同样,vFOV?或hFOV?等,取决于螺旋线是上下还是侧对侧等),则其半角为
fov/2
。这与气缸中心显示的角度相同。因此,您需要按如下方式减小螺旋半径:
radius2=radius1*cos(fov/2)


1,2.3.一个你想要达到的目标的屏幕截图,将有助于解决这个问题。我最终做了完全相同的事情。你的想法是正确的,这是第一个问题&谢谢你抽出时间