我正在写一个网格编辑器,在其中我有操纵器,在它的帮助下,我改变了网格的顶点。任务是渲染具有恒定尺寸的机械手,在改变摄像机和视口参数时不会改变。投影矩阵是透视矩阵。我将感谢如何实现不变尺度几何学的想法。
发布于 2017-06-06 06:33:58
如果我做对了,您想要呈现一些标记(例如顶点拖动编辑区域),对于它们呈现到的任何深度都具有相同的视觉大小。
这方面有两种方法:
P0是你的相机位置,而Z是你的相机视图,方向单位矢量(通常是Z轴)。然后,对于任何位置,P计算如下所示的标度:
深度=点(P-P0,Z)
现在,这个比例取决于某些指定的size0上想要的可视depth0。现在使用我们想要的三角形相似性:
大小/深度=大小0/深度0=大小0*深度/深度0
因此,使用size或缩放depth/depth0呈现您的标记。如果使用缩放,您需要缩放您的目标位置P,否则您的标记将转移到两侧(因此,转换,缩放,翻译回来)。x,y位置。记住这一点,在过去,这将使你的标记只是使用它,而不是真正的位置。对于这种渲染传递,要么使用一定的深度(距离相机的距离),要么使用非透视视图矩阵。有关更多信息,请参见Understanding 4x4 homogenous transform matrices
Edit1像素大小
为此,您需要使用FOVx,FOVy投影角度和视图/屏幕分辨率(xs,ys)。这意味着,如果深度为znear,且坐标为角度的一半,则投影坐标将转到屏幕边缘:
tan(FOVx/2) = (xs/2)*pixelx/znear
tan(FOVy/2) = (ys/2)*pixely/znear
---------------------------------
pixelx = 2*znear*tan(FOVx/2)/xs
pixely = 2*znear*tan(FOVy/2)/ys其中pixelx,pixely的大小(每轴)表示单个像素的视觉深度,znear。如果展位大小相同(所以像素是方形的),那么您就有了所需的一切。如果它们不相等(像素不是正方形),那么您需要在屏幕轴对齐坐标中呈现标记,所以接近#2更适合这种情况。
因此,如果选择depth0=znear,则可以将size0设置为n*pixelx和/或n*pixely,以获得n像素的可视大小。或者使用任何dept0并重写计算,以便:
pixelx = 2*depth0*tan(FOVx/2)/xs
pixely = 2*depth0*tan(FOVy/2)/ys只是为了完整:
size0x = size_in_pixels*(2*depth0*tan(FOVx/2)/xs)
size0y = size_in_pixels*(2*depth0*tan(FOVy/2)/ys)
-------------------------------------------------
sizex = size_in_pixels*(2*depth0*tan(FOVx/2)/xs)*(depth/depth0)
sizey = size_in_pixels*(2*depth0*tan(FOVy/2)/ys)*(depth/depth0)
---------------------------------------------------------------
sizex = size_in_pixels*(2*tan(FOVx/2)/xs)*(depth)
sizey = size_in_pixels*(2*tan(FOVy/2)/ys)*(depth)
---------------------------------------------------------------
sizex = size_in_pixels*2*depth*tan(FOVx/2)/xs
sizey = size_in_pixels*2*depth*tan(FOVy/2)/yshttps://stackoverflow.com/questions/44378936
复制相似问题