2016-02-19 32 views
7

我正在构建一个应用程序,其中我呈现了一些带有纹理的平面。但是,我想计算螺旋线的半径(我在计算中用于创建螺旋线),动态基于截锥体宽度和相机位置。计算螺旋线的半径,以便螺旋线中的模型位于平截头体内

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

+0

1. http://stackoverflow.com/questions/14614252/how-to-fit-camera-to-object,2. http://stackoverflow.com/questions/20059612/calculate- camera-zoom-required-for-object-to-fit-in-screen-height,3. http://stackoverflow.com/questions/16462848/three-js-zoom-to-fit-width-of-objects-忽略 - 高度 – gaitat

+3

你试图达到的截图,将有助于解决这个问题。 – ProllyGeek

回答

1

我不知道以下解释你的裁剪。

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

enter image description here

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

enter image description here

+0

我最终做了完全相同的事情。你的想法是正确的,那就是首先要解决的问题,谢谢你的时间 – Syd