首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不变尺度几何

不变尺度几何
EN

Stack Overflow用户
提问于 2017-06-05 22:59:26
回答 1查看 239关注 0票数 4

我正在写一个网格编辑器,在其中我有操纵器,在它的帮助下,我改变了网格的顶点。任务是渲染具有恒定尺寸的机械手,在改变摄像机和视口参数时不会改变。投影矩阵是透视矩阵。我将感谢如何实现不变尺度几何学的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-06 06:33:58

如果我做对了,您想要呈现一些标记(例如顶点拖动编辑区域),对于它们呈现到的任何深度都具有相同的视觉大小。

这方面有两种方法:

  1. 具有深度的标度 计算垂直距离的相机视图(简单的点积),并缩放标记大小,因此它有相同的视觉尺寸不变的深度。 因此,如果P0是你的相机位置,而Z是你的相机视图,方向单位矢量(通常是Z轴)。然后,对于任何位置,P计算如下所示的标度: 深度=点(P-P0,Z) 现在,这个比例取决于某些指定的size0上想要的可视depth0。现在使用我们想要的三角形相似性: 大小/深度=大小0/深度0=大小0*深度/深度0 因此,使用size或缩放depth/depth0呈现您的标记。如果使用缩放,您需要缩放您的目标位置P,否则您的标记将转移到两侧(因此,转换,缩放,翻译回来)。
  2. 计算屏幕位置并使用非透视图呈现 因此,您转换目标坐标的方式与图形管道一样,直到获得屏幕x,y位置。记住这一点,在过去,这将使你的标记只是使用它,而不是真正的位置。对于这种渲染传递,要么使用一定的深度(距离相机的距离),要么使用非透视视图矩阵。

有关更多信息,请参见Understanding 4x4 homogenous transform matrices

Edit1像素大小

为此,您需要使用FOVx,FOVy投影角度和视图/屏幕分辨率(xs,ys)。这意味着,如果深度为znear,且坐标为角度的一半,则投影坐标将转到屏幕边缘:

代码语言:javascript
运行
复制
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并重写计算,以便:

代码语言:javascript
运行
复制
pixelx = 2*depth0*tan(FOVx/2)/xs
pixely = 2*depth0*tan(FOVy/2)/ys

只是为了完整:

代码语言:javascript
运行
复制
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)/ys
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44378936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档