我正在开发一个应用程序,在这个应用程序中,我展示了一些有纹理的飞机。然而,我想要计算螺旋的半径(我在计算中使用它来创建一个螺旋),动态地基于锥宽和摄像机位置。
螺旋位于屏幕x=0、y=0、z=0的中心。
我希望这个考虑到屏幕的方向(风景/肖像),.So,远远的,这是我的代码,但似乎我遗漏了什么,因为左边和右边的飞机不在视口内。
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参数,但是结果不一致.
发布于 2016-03-01 05:19:03
我想知道以下是否解释了你的剪裁。
你计算你的圆锥曲线特征,然后用圆锥曲线的宽度(宽度或高度取决于屏幕的角度)计算螺旋半径.我可能在这里搞错了一些细节,因为你的问题没有完全解释细节,但是一般的概念仍然有效。下面的图片是场景的顶部视图,它显示了一个代表包围螺旋的圆柱体的圆圈。我相信你计算过radius1了。如果是这样的话,请注意圆柱体(阴影区)和螺旋线在气缸中心的“前面”会有剪裁。

相反,您需要计算圆柱体/螺旋半径,如第二幅图像所示,即需要radius2。如果图像左边的大角度是fov (再说一次,vFOV?或者hFOV?,等等,取决于你的螺旋是向上-向下,还是边对边,等等,那么它的半角是fov/2。这是相同的角度显示在圆柱体的中心。因此,您需要减小螺旋半径如下:radius2 = radius1 * cos(fov/2)。

https://stackoverflow.com/questions/35515305
复制相似问题