android - OpenGL ES 2 中的投影和平移
问题描述
我有一个关于 OpenGL ES 2 中的转换的问题。我目前正在使用三角形风扇绘制一个矩形,如下图所示。原点位于其中心,其宽度和高度分别为0.6
和2
。我假设这些尺寸与模型空间有关。但是,为了在平板电脑或手机上保持高度和宽度的比例,必须进行考虑设备长度比例的投影(同样是宽度和高度)。这就是我打电话orthoM(projectionMatrix, 0, -aspectRatio, aspectRatio, -1f, 1f, -1f, 1f);
的原因,并且 aspectRatio 由float aspectRatio = (float) width / (float) height
. 这最终导致了下图中显示的矩形。现在,我想将矩形沿 x 轴移动到屏幕的边框。但是,我无法提出正确的计算方法,要么我移动的太少要么太多。那么计算会是什么样子呢?此外,我对模型空间中给出的尺寸有点困惑。在那里可以达到的最大值和最小值是多少?
非常感谢!
解决方案
矩形的顶点位置在世界空间中。一种方法是获取您想要移动到的屏幕坐标,然后将它们转换为世界空间。
例如:
如果屏幕是 300 x 200 并且您在世界空间的中心 0,0(或屏幕空间的 150、100)。你想翻译成300。
所以转换应该是 screen_position 到标准化的设备坐标,然后乘以 inverseOf(projection matrix * view matrix) 并除以 w 分量。
这里解释了鼠标它最终是一样的,只是你知道z,因为它已经是你用于矩形的那个(如果它在平面x,y上):OpenGL Math - Projecting Screen space to World空间坐标。
推荐阅读
- python - 为选定月份设置多年的每小时频率的 date_range
- ssis - ssis中的varchar到nvarchar
- java - java.lang.ClassNotFoundException:net.corda.testing.core.DummyCommandData
- ruby-on-rails - rspec/rails 似乎无法加载 Ruby 2.7.1
- python - 如何在数据框中间添加一个新列,其值基于前一列?
- c++ - 如何通过 CGAL 生成 3d 网格的截面图
- c++ - 在 NAO 上部署 C++:“加载共享库 libboost_thread.so.1.64.0 时出错:无法打开共享对象文件”
- python - 如何将 df 的多列拆分为多行?
- cron - 在多工作人员环境中安排时间间隔/cron 作业
- c++ - C++ 菜单 sfml 中心所有东西