2016-02-19 114 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