【问题标题】:Calculate radius of helix so that models in helix are inside the frustum计算螺旋的半径,使螺旋中的模型位于截锥体内
【发布时间】:2016-06-01 14:47:43
【问题描述】:

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

螺旋线位于屏幕中心 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 参数但结果不一致...

【问题讨论】:

标签: javascript 3d three.js viewport frustum


【解决方案1】:

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

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

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

【讨论】:

  • 我最终做了同样的事情。您的想法是正确的,这首先是问题所在,感谢您的宝贵时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2023-03-28
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多