首页 > 其他分享 >调整屏幕的宽高比

调整屏幕的宽高比

时间:2024-02-02 21:22:40浏览次数:28  
标签:正交投影 矩阵 0.7 0f 1f 宽高比 屏幕 调整

一.前言

  我们将上一篇文章中写的应用程序再次运行起来,然后将屏幕横过来,我们会发现空气曲棍球的桌子被压扁了。这之所以会发生,是因为我们没有考虑屏幕的宽高比,直接将坐标传递给了OpenGL。在这片文章中,我们会弄清楚为什么桌子被压扁了,以及如何使用投影解决这个问题。

 二.宽高比的问题

  我们现在都知道一个事实:在OpenGL中,我们要渲染的一切物体,都要映射到x,y和z轴的[-1,1]范围内,这个范围内的坐标被称为归一化设备坐标,其独立于屏幕实际的形状和尺寸。不幸的是,由于它独立于实际的屏幕尺寸和形状,我们直接使用就会出现问题,例如横屏模式下桌子被压扁了。

  我们现在假设设备的分辨率是1280x720,并且OpenGL占据整个屏幕,那么[-1,1]的范围对应1280像素的高,却只有720像素的宽,图像在x轴上就会显得扁平,同样的问题在y轴上也会发生。想要解决这个问题,我们需要调整坐标空间,以使它把屏幕形状考虑在内。我们可以把较小的范围固定在[-1,1]内,而按屏幕尺寸的比例调整较大的范围。举例来说,在竖屏模式下,可以把宽度限制在[-1,1]内,把高度限制在[-1280/720,1280/720]内。同理,在横屏模式下,可以将高度限制在[-1,1]中,而把高度限制在[-1280/720,1280/720]中。通过这个方法,无论是在竖屏还是横屏下,物体的形状都是一样的,我们所进行的操作就是正交投影。

三.定义正交投影

  要定义正交投影,我们要借助Android的Matrix类,这个类有一个称为orthoM()的方法,它可以为我们生成一个正交投影,这个函数的定义如下:

public static void orthoM(
  float[] m, //目标数组,这个目标数组的长度至少16个元素,这样才能存储正交投影矩阵
  int mOffset,//结果矩阵起始的偏移值
  float left, //x轴的最小范围
  float right, //x轴的最大范围
  float bottom, //y轴的最小范围
  float top,//y轴的最大范围
  float near, //z轴的最小范围
  float far//z轴的最大范围
)

  当我们调用这个函数的时候,它会给我们生成一个4x4的矩阵,这个正交投影矩阵会把所有在左右之间,上下之间和远近之间的事物映射到归一化设备坐标中[-1,1]的范围中,在这个范围内的东西在屏幕上都是可见的。

四.加入正交投影

  让我们加入正交投影,并修复那个被压扁的桌子。首先我们需要修改顶点着色器,在里面接收这个投影矩阵,代码修改如下:

#version 300 es
layout(location=0) in vec4 a_Position;
layout(location=0) uniform mat4 u_Matrix;
layout(location=1) in vec4 a_Color;
out vec4 v_Color;
void main() {
    gl_Position=u_Matrix*a_Position;
    v_Color=a_Color;
    gl_PointSize=10.0;
}

  然后在MyRenderer类的顶部加入如下代码:private val projectionMatrix:FloatArray=FloatArray(16)//存储投影矩阵

  接着再更新onSurfaceChanged()函数,在末尾加入如下代码:

     //根据屏幕方向生成投影矩阵
        val aspectRatio=if(width>height) width.toFloat()/height.toFloat() else height.toFloat()/width.toFloat()
        if(width>height){
            Matrix.orthoM(projectionMatrix,0,-aspectRatio,aspectRatio,-1f,1f,-1f,1f)
        }
        else{
            Matrix.orthoM(projectionMatrix,0,-1f,1f,-aspectRatio,aspectRatio,-1f,1f)
        }

  最后,将生成的投影矩阵传入顶点着色器,在onDrawFrame()函数中的glClear()函数后加入如下代码即可:

//传入投影矩阵
glUniformMatrix4fv(0,1,false,projectionMatrix,0)

  第一个参数指uniform变量的位置,第二个参数指矩阵的个数。

  最后,我们可以修改下桌子的结构,让桌子更高点,这样看起来效果更好,只需要修改y值即可。更新后的结构如下:

val tableVertices=floatArrayOf(
            //Triangle fan
            0f,0f,1f,1f,1f,
            -0.5f,-0.8f,0.7f,0.7f,0.7f,
            0.5f,-0.8f,0.7f,0.7f,0.7f,
            0.5f,0.8f,0.7f,0.7f,0.7f,
            -0.5f,0.8f,0.7f,0.7f,0.7f,
            -0.5f,-0.8f,0.7f,0.7f,0.7f,
            //Mid Line
            -0.5f,0f,1f,0f,0f,
            0.5f,0f,1f,0f,0f,
            //Mallets
            0f,-0.4f,0f,0f,1f,
            0f,0.4f,1f,0f,0f
        )

  最后,可以运行程序了,看看效果是不是和我们期待的那样。

 

标签:正交投影,矩阵,0.7,0f,1f,宽高比,屏幕,调整
From: https://www.cnblogs.com/luqman/p/18003747

相关文章

  • 最小的调整次数 od
    最小调整顺序次数、特异性双端队列逻辑分析题目描述有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据.小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据......
  • 问题:如何调整剖面框的位置?()
    问题:如何调整剖面框的位置?()A.调整视图范围的深度B.调整比例C.在图元属性中设置D.拖拽剖面框面上的三角形夹点,调整其范围到需要的剖切位置参考答案如图所示问题:A.民间故事B.现实生活C.幻想世界D.神话传说参考答案如图所示......
  • 编译着色器并在屏幕上绘图
    一.前言  本篇文章会继续上一篇文章开始的工作,在这篇文章中,我们首先会加载并编译前面定义的着色器,然后把他们链接在一起放在OpenGL的一个程序里,接下来就可以使用这个着色器程序在屏幕上绘制空气曲棍球桌子结构了。 二.加载着色器1.我们已经为着色器写了代码,下一步则要把......
  • android setprop getprop, 调整app heap 堆 大小
    网上的截图: 通过setprop设置的更改的属性,重启之后就会消失。 调整app堆大小。      一些基本的了解。  ......
  • 在Tkinter中,`Frame`的大小可以通过多种方式进行调整: 1. **设置宽度和高度**:在创建`Fr
    在Tkinter中,`Frame`的大小可以通过多种方式进行调整:1.**设置宽度和高度**:在创建`Frame`时,可以直接设置其宽度(`width`)和高度(`height`)¹⁴。例如:  ```python  frame=tk.Frame(root,width=200,height=100)  frame.pack()  ```2.**自适应窗口大小**:可以使......
  • 照片尺寸调整
    fromPILimportImagedefconvert_image3(image_path,width_mm,height_mm,dpi):#打开原始图片image=Image.open(image_path)#计算目标像素尺寸width_px=int(width_mm/25.4*dpi)height_px=int(height_mm/25.4*dpi)#调整......
  • 电脑监控软件大盘点:10款最值得使用的电脑屏幕监控软件丨人气高频使用
    电脑监控软件是一种用于监控、记录和分析电脑使用情况的工具,可以帮助管理者或家长监控员工或孩子的电脑使用行为,提高工作效率、保护孩子健康成长。电脑监控软件通过实时监控员工电脑屏幕、文件、进程和网络活动,帮助管理者提高工作效率,规范上网行为,保护企业信息安全,从而为企业创造......
  • [word] WPS 如何在 word 里调整横向文字间距
    今天教大家一个小技巧,如何在Word里调整横向文字间距。第1步先选中要调整间距的文字,具体操作如下图所示: ......
  • [word] Word表格跨页怎么调整?三个解决方法
    在Word中频繁会用到表格数据,但是在Word表格的使用过程中经常会遇到这样一个问题:表格跨页显示,这应该怎么调整呢?下面分享三种解决的方法,大家可以试试。1、设置表格与下段同页选中整个表格,之后点击开始-段落设置按钮,接着在换行和分页的界面中,勾选上与下段同页,点击确定,表格自动显示在一......
  • calc配合rem自适应屏幕宽度
    css的calc是计算函数,可以通过搜索引擎学习其他的计算思路。这是该计算函数兼容性。这里直接开门见山!!1920设计稿html{    font-size:calc(100w/19.2)}在1920设计稿中1rem等于100px,.32rem等于32px随着屏幕的宽度缩小或放大会变比如:div{    width:......