android opengl es 总结

2023-11-18

什么是OpenGL ES?

  • OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。
  • 为桌面版本OpenGL 的一个子集。
  • OpenGL ES 定义了一个在移动平台上能够支持OpenGL最基本功能的精简标准,以适应如手机,PDA或其它消费者移动终端的显示系统。
  • Khronos Group 定义和管理了OpenGL ES标准。

OpenGL 与 OpenGL ES的关系

OpenGL ES 是基于桌面版本OpenGL 的:
  • OpenGL ES 1.0  基于OpenGL 1.3 , 在2003年发布
  • OpenGL ES 1.1   基于OpenGL 1.5 ,  在2004年发布
  • OpenGL ES 2.0  基于OpenGL2.0,   在2007年发布
  • OpenGL 2.0 向下兼容OpenGL 1.5   而 OpenGL ES 2.0 和OpenGL ES 1.x 不兼容,是两种完全不同的实现。

OpenGL ES管道(Pipeline)

OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工的工序是固定的,但是可以通过打开或关闭开关来设置参数或者打开关闭某些功能。OpenGL ES 2.0 允许提供编程来控制一些重要的工序,一些“繁琐”的工序比如栅格化等仍然是固定的。(这些开关被就是state,注意应该尽量少的改变state,以免影响性能)
  • 管道“工序”大致可以分为 Transformation Stage 和 Rasterization Stage两大步。
  • OpenGL ES 支持的基本图形为 点Point, 线Line, 和三角形Triangle ,其它所有复制图形都是通过这几种基本几何图形组合而成。
  • 在发出绘图指令后,会对顶点(Vertices)数组进行指定的坐标变换或光照处理。
  • 顶点处理完成后,通过Rasterizer 来生成像素信息,称为”Fragments“ 。
  • 对于Fragment 在经过Texture Processing, Color Sum ,Fog 等处理并将最终处理结果存放在内存中(称为FrameBuffer)。
  • OpenGL 2.0可以通过编程来修改上述红色的部分的步骤,称为Programmable Shader.

OpenGL ES API 命名习惯

 
  • 定义的常量都以GL_为前缀。比如GL10.GL_COLOR_BUFFER_BIT
  • OpenGL ES 指令以gl开头 ,比如gl.glClearColor
  • 某些OpenGL指令以3f 或4f结尾,3和4代表参数的个数,f代表参数类型为浮点数,如gl.glColor4f ,i,x 代表 int如 gl.glColor4x
  • 对应以v结尾的OpenGL ES 指令,代表参数类型为一个矢量(Vector) ,如 glTexEnvfv
  • 所有8-bit整数对应到byte 类型,16-bit 对应到short类型,32-bit整数(包括GLFixed)对应到int类型,而所有32-bit 浮点数对应到float 类型。
  • GL_TRUE,GL_FALSE 对应到boolean类型
  • C字符串((char*)) 对应到Java 的 UTF-8 字符串。 
  •  

     

     
    创建简单的opengl es实例
     
     
     

    基本几何图形定义

    OpenGL ES 支持绘制的基本几何图形分为三类:点,线段,三角形。也就是说OpenGL ES 只能绘制这三种基本几何图形。任何复杂的2D或是3D图形都是通过这三种几何图形构造而成的。

    OpenGL ES提供了两类方法来绘制一个空间几何图形:

    • public abstract void glDrawArrays(int mode, int first, int count) 使用VetexBuffer 来绘制,顶点的顺序由vertexBuffer中的顺序指定。
    • public abstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由indices Buffer 指定。
    mode列表: GL_POINTS 绘制独立的点、 GL_LINE_STRIP绘制一条线段、 GL_LINE_LOOP绘制一条封闭线段(首位相连)、 GL_LINES绘制多条线段、 GL_TRIANGLES绘制多个三角形(两两不相邻)、 GL_TRIANGLE_STRIP绘制多个三角形(两两相邻)、 GL_TRIANGLE_FAN以一个点为顶点绘制多个相邻的三角形

    对应顶点除了可以为其定义坐标外,还可以指定颜色,材质,法线(用于光照处理)等。

    glEnableClientState 和 glDisableClientState 可以控制的pipeline开关可以有:GL_COLOR_ARRAY (颜色) ,GL_NORMAL_ARRAY (法线), GL_TEXTURE_COORD_ARRAY (材质), GL_VERTEX_ARRAY(顶点), GL_POINT_SIZE_ARRAY_OES等。

    对应的传入颜色,顶点,材质,法线的方法如下:

    glColorPointer(int size,int type,int stride,Buffer pointer)
    glVertexPointer(int size, int type, int stride, Buffer pointer)
    glTexCoordPointer(int size, int type, int stride, Buffer pointer)
    glNormalPointer(int type, int stride, Buffer pointer)
    OpenGL ES 内部存放图形数据的Buffer有COLOR ,DEPTH (深度信息)等,在绘制图形只前一般需要清空COLOR 和 DEPTH Buffer。

    三维坐标系及坐标变换初步

    OpenGL ES图形库最终的结果是在二维平面上显示3D物体,这个过程可以分成三个部分:
    • 坐标变换,坐标变换通过使用变换矩阵来描述,因此学习3D绘图需要了解一些空间几何,矩阵运算的知识。三维坐标通常使用齐次坐标来定义。变换矩阵操作可以分为视角(Viewing),模型(Modeling)和投影(Projection)操作,这些操作可以有选择,平移,缩放,正侧投影,透视投影等。
    • 由于最终的3D模型需要在一个矩形窗口中显示,因此在这个窗口之外的部分需要裁剪掉以提高绘图效率,对应3D图形,裁剪是将处在剪切面之外的部分扔掉。
    • 在最终绘制到显示器(2D屏幕),需要建立起变换后的坐标和屏幕像素之间的对应关系,这通常称为“视窗”坐标变换(Viewport) transformation.
    如果我们使用照相机拍照的过程做类比,可以更好的理解3D 坐标变换的过程。
    1. 拍照时第一步是架起三角架并把相机的镜头指向需要拍摄的场景,对应到3D 变换为viewing transformation (平移或是选择Camera )
    2. 然后摄影师可能需要调整被拍场景中某个物体的角度,位置,比如摄影师给架好三角架后给你拍照时,可以要让你调整站立姿势或是位置。对应到3D绘制就是Modeling transformation (调整所绘模型的位置,角度或是缩放比例)。
    3. 之后摄影师可以需要调整镜头取景(拉近或是拍摄远景),相机取景框所能拍摄的场景会随镜头的伸缩而变换,对应到3D绘图则为Projection transformation(裁剪投影场景)。
    4. 按下快门后,对于数码相机可以直接在屏幕上显示当前拍摄的照片,一般可以充满整个屏幕(相当于将坐标做规范化处理NDC),此时你可以使用缩放放大功能显示照片的部分。对应到3D绘图相当于viewport transformation (可以对最终的图像缩放显示等)
    对于Viewing transformation (平移,选择相机)和Modeling transformation(平移,选择模型)可以合并起来看,只是应为向左移动相机,和相机不同将模型右移的效果是等效的。

    在OpenGL ES 中,

    • 使用GL10.GL_MODELVIEW 来同时指定viewing matrix 和modeling matrix.
    • 使用GL10.GL_PROJECTION 指定投影变换,OpenGL 支持透视投影(3D)和正侧投影(2D)。
    • 使用glViewport 指定 Viewport 变换。
     
     

    通用的矩阵变换指令

     
    这里介绍对应指定的坐标系(比如viewmodel, projection或是viewport) Android OpenGL ES支持的一些矩阵运算及操作。
    矩阵本身可以支持加减乘除,对角线全为1的4X4 矩阵成为单位矩阵Identity Matrix 。
    • 将当前矩阵设为单位矩阵的指令 为glLoadIdentity().
    • 矩阵相乘的指令glMultMatrix*() 允许指定任意矩阵和当前矩阵相乘。
    • 选择当前矩阵种类glMatrixMode() OpenGL ES 可以运行指定GL_PROJECTION,GL_MODELVIEW等坐标系,后续的矩阵操作将针对选定的坐标。
    • 将当前矩阵设置成任意指定矩阵glLoadMatrix*()
    • 在栈中保存当前矩阵和从栈中恢复所存矩阵,可以使用glPushMatrix()glPopMatrix()
    • 特定的矩阵变换平移glTranslatef(),旋转glRotatef() 和缩放glScalef()
    方法public abstract void glTranslatef (float x, float y, float z) 用于坐标平移变换。
    方法public abstract void glRotatef(float angle, float x, float y, float z)用来实现选择坐标变换,单位为角度。 (x,y,z)定义旋转的参照矢量方向。多次旋转的顺序非常重要。
    方法public abstract void glScalef (float x, float y, float z)用于缩放变换。

    在进行平移,旋转,缩放变换时,所有的变换都是针对当前的矩阵(与当前矩阵相乘),如果需要将当前矩阵回复最初的无变换的矩阵,可以使用单位矩阵(无平移,缩放,旋转)。

    public abstract void glLoadIdentity()。

    在栈中保存当前矩阵和从栈中恢复所存矩阵,可以使用

    public abstract void glPushMatrix()

    public abstract void glPopMatrix()。

    在进行坐标变换的一个好习惯是在变换前使用glPushMatrix保存当前矩阵,完成坐标变换操作后,再调用glPopMatrix恢复原先的矩阵设置。
     
     

    Viewing和Modeling(MODELVIEW) 变换

     

    ndroid OpenGL ES 的GLU包有一个辅助函数gluLookAt提供一个更直观的方法来设置modelview 变换矩阵:

    void gluLookAt(GL10 gl, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
    • eyex,eyey,eyez 指定观测点的空间坐标。
    • tarx,tary,tarz ,指定被观测物体的参考点的坐标。
    • upx,upy,upz 指定观测点方向为“上”的向量。(0,1,0)
     
     
     
    投影变换Projection
    投影变换则对应于调整相机镜头远近来取景。
    下面代码设置当前Matrix模式为Projection投影矩阵:
    gl.glMatrixMode(GL_PROJECTION);
    gl.glLoadIdentity();
    OpenGL ES可以使用两种不同的投影变换:透视投影(Perspective Projection)和正侧投影(Orthographic Projection)。
    Android OpenGL ES提供了一个辅助方法gluPerspective()可以更简单的来定义一个透视投影变换:

    GLU.gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)

    • fovy: 定义视锥的view angle.
    • aspect:  定义视锥的宽高比。
    • zNear: 定义裁剪面的近距离。就是前面距离原点的距离
    • zFar: 定义创建面的远距离。就是后面距离原点的距离
    正侧投影(Orthographic Projection)
    正侧投影,它的视锥为一长方体,特点是物体的大小不随到观测点的距离而变化,投影后可以保持物体之间的距离和夹角。

     

     

    定义3D模型的前面和后面

    下面代码设置逆时针方法为面的“前面”: gl.glFrontFace(GL10.GL_CCW);
    打开 忽略“后面”设置: gl.glEnable(GL10.GL_CULL_FACE);然后 明确指明“忽略“哪个面的代码如下:
    gl.glCullFace(GL10.GL_BACK);

    FrameBuffer、Depth Buffer

    OpenGL ES 中的FrameBuffer 指的是存储像素的内存空间 。对应一个二维图像,如果屏幕分辨率为1280X1024 ,如果屏幕支持24位真彩色 (RGB),则存储这个屏幕区域的内存至少需要1024X1280X3个字节。此外如果需要支持透明度(Alpha),则一个像素需要4个字节。
    在最终OpenGL ES写入这些Buffer时,OpenGL ES提供一些Mask 函数可以控制Color Buffer 中RGBA通道,是否允许写入Depth Buffer 等,这些Mask 函数可以打开或是关闭某个通道,只有通道打开后,对应的分量才会写入指定Buffer,比如你可以关闭红色通道,这样最后写道Color Buffer中就不含有红色。
    OpenGL ES 中Depth Buffer 保存了像素与观测点之间的距离信息,在绘制3D图形时,将只绘制可见的面而不去绘制隐藏的面,这个过程叫”Hidden surface removal” ,采用的算法为”The depth buffer algorithm”。
    The depth buffer algorithm 在OpenGL ES 3D绘制的过程中这个算法是自动被采用的,但是了解这个算法有助于理解OpenGL ES 部分API的使用。

    下面给出了OpenGL ES中与Depth Buffer相关的几个方法:

    • gl.Clear(GL10.GL_DEPTH_BUFFER_BIT) 清空Depth Buffer (赋值为1.0)通常清空Depth Buffer和Color Buffer同时进行。
    • gl.glClearDepthf(float depth) 指定清空Depth Buffer是使用的值,缺省为1.0,通常无需改变这个值,
    • gl.glEnable(GL10.GL_DEPTH_TEST) 打开depth Test
    • gl.glDisable(GL10.GL_DEPTH_TEST) 关闭depth Test
     

    OpenGL光照模型

    为了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去和一个二维平面上圆没什么差别
    OpenGL 光照模型中最终的光照效果可以分为四个组成部分:Emitted(光源), ambient(环境光),diffuse(漫射光)和specular(镜面反射光),最终结果由这四种光叠加而成。

    Emitted : 一般只发光物体或者光源,这种光不受其它光源的影响。

    ambient: 环境光如果射到某个平面,其反射方向为所有方向。Ambient 没有位置方向,只有颜色。

    diffuse:当一束平行的入射光线射到粗糙的表面时,因面上凹凸不平,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。这个反射的光则称为漫射光。漫射光射到某个平面时,其反射方向也为所有方向。diffuse 只依赖于光源的方向和法线的方向。

    specular : 一般指物体被光源直射的高亮区域,也可以成为镜面反射区,如金属。 specular依赖于光源的方向,法线的方向和视角的方向。

    设置光照效果Set Lighting

    OpenGL ES API如何使用光照效果:
    • 设置光源
    • 定义法线
    • 设置物体材料光学属性

    光源

    OpenGL ES中可以最多同时使用八个光源,分别使用0到7表示。

    OpenGL ES光源可以分为

    • 平行光源(Parallel light source), 代表由位于无限远处均匀发光体,太阳可以近似控制平行光源。
    • 点光源(Spot light source)  如灯泡就是一个点光源,发出的光可以指向360度,可以为点光源设置光衰减属性(attenuation)或者让点光源只能射向某个方向(如射灯)。
    下面方法可以打开某个光源,使用光源首先要开光源的总开关:gl.glEnable(GL10.GL_LIGHTING);
    然后可以再打开某个光源如0号光源:gl.glEnable(GL10.GL_LIGHT0);
    设置光源方法如下:
    • public void glLightfv(int light,int pname, FloatBuffer params)
    • public void glLightfv(int light,int pname,float[] params,int offset)
    • public void glLightf(int light,int pname,float param)
    • light 指光源的序号,OpenGL ES可以设置从0到7共八个光源。
    • pname: 光源参数名称,可以有如下:GL_SPOT_EXPONENT, GL_SPOT_CUTOFF, GL_CONSTANT_ATTENUATION,  GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION, GL_AMBIENT, GL_DIFFUSE,GL_SPECULAR, GL_SPOT_DIRECTION, GL_POSITION
    • params 参数的值(数组或是Buffer类型)。
    其中为光源设置颜色的参数类型为上述蓝色值,可以分别指定R,G,B,A 的值。
    指定光源的位置的参数为GL_POSITION,值为(x,y,z,w): 平行光将w 设为0.0,(x,y,z)为平行光的方向。
    法线
    在场景中设置好光源后,下一步要为所绘制的图形设置法线(Normal),只有设置了法线,光源才能在所会物体上出现光照效果。三维平面的法线是垂直于该平面的三维向量。曲面在某点P处的法线为垂直于该点切平面的向量

     

    打开法线数组gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); 

    和设置颜色类似,有两个方法可以为平面设置法线,一是 public void glNormal3f(float nx,float ny,float nz)

    这个方法为后续所有平面设置同样的方向,直到重新设置新的法线为止。

    为某个顶点设置法线:public void glNormalPointer(int type,int stride, Buffer pointer)

    • type  为Buffer 的类型,可以为GL_BYTE, GL_SHORT, GL_FIXED,或 GL_FLOAT
    • stride: 每个参数之间的间隔。
    • pointer: 法线值。
    规范化法向量,比如使用坐标变换(缩放),如果三个方向缩放比例不同的话,顶点或是平面的法线可能就有变化,此时需要打开规范化法线设置: gl.glEnable(GL10.GL_NORMALIZE);
    经过规范化后法向量为单位向量(长度为1)。同时可以打开缩放法线设置 gl.glEnable(GL10.GL_RESCALE_NORMAL);
    设置物体材料光学属性

    设置物体表面材料(Material)的反光属性(颜色和材质)的方法如下:

            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, ambient, 0); 
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, diffuse, 0); 
            gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, specular, 0);  

     

            gl.glEnable(GL10.GL_COLOR_MATERIAL);  

    此外,方法glLightModleXX给出了光照模型的参数

    public void glLightModelf(int pname,float param)
    public void glLightModelfv(int pname,float[] params,int offset)
    public void glLightModelfv(int pname,FloatBuffer params)

    • pname: 参数类型,可以为GL_LIGHT_MODEL_AMBIENT和GL_LIGHT_MODEL_TWO_SIDE
    • params: 参数的值。

    最终顶点的颜色由这些参数(光源,材质光学属性,光照模型)综合决定(光照方程计算出)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android opengl es 总结 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo

随机推荐

  • delphi listview动态添加图片_南通启东【长泰海滨城】售楼处电话-位置-价格-开盘时间-最新动态【官网】...

    南通启东 长泰海滨城 售楼处电话 位置 价格 开盘时间 最新动态 官网 2020 10 29 14 38 来源 搜狐焦点淮北站 原标题 南通启东 长泰海滨城 售楼处电话 位置 价格 开盘时间 最新动态 官网 南通启东 长泰海滨城 售楼中心
  • 05笔趣阁小说爬取--爬取作者所有小说

    前面的程序已经实现了从笔趣阁自动爬取整部小说 接下来在之前的基础上 将功能进一步扩展 实现自动爬取某一作者在笔趣阁中的所有小说 继续以方想为例 下图是方想作品列表的页面 https www 52bqg com modules article
  • 伺服怎么接单相220伏_220v电表怎么接线?如何接单相电表?普通家用电表怎么接线...

    以下文章来源于电工电气学习 作者 电工电气学习 单相有功电度表 简称 单相电度表 由接线端子 电流线圈 电压线圈 计量转盘 计数器构成 只要电流线圈通过电流 同时电压线圈加有电压 转盘就受到电磁力而转动 单相电度表共有5个接线端子 其中有两
  • 如何把桌面显示的文件都放在D盘

    1 改目录 具体如下 先在d盘建一个文件夹 然后点开始 运行 regedit 点击HKEY CURRENT USER Software Microsoft Windows CurrentVersion Explorer user Shell
  • leetcode 34. 在排序数组中查找元素的第一个和最后一个位置

    虽然只是一道中等难度的题目 但是看了官方的解答 有很精彩的地方 但是总体代码写得不算优雅 class Solution returns leftmost or rightmost index at which target should b
  • 使用 mock 模拟登录接口数据

    mock js模拟登录接口 第一步 打开apipost 通过mock服务来进行编写登录接口 选择为mock环境 第二步 编写自己的登录接口 apipost支持 req body对象 当 post 请求以 x www form urlenco
  • SpringSecurity+JWT认证流程解析

    楔子 本文适合 对Spring Security有一点了解或者跑过简单demo但是对整体运行流程不明白的同学 对SpringSecurity有兴趣的也可以当作你们的入门教程 示例代码中也有很多注释 大家在做系统的时候 一般做的第一个模块就是
  • 【内外网映射】通过外网ip来访问虚拟机服务器【原创】

    经试验 可以通过外网访问家里笔记本win 7里面的虚拟机vmvare的Ubuntn服务器 比如用手机来访问笔记本电脑的虚拟机的服务器等 注意 win 7的ip地址和虚拟机的ip地址的网段是不一样的 特别注意 只适用于公网ip是固定的 不固定
  • 一看就懂的ReactJs入门教程-精华版

    现在最热门的前端框架有AngularJS React Bootstrap等 自从接触了ReactJS ReactJs的虚拟DOM Virtual DOM 和组件化的开发深深的吸引了我 下面来跟我一起领略ReactJs的风采吧 文章有点长 耐
  • Dbeaver 修改SQL编辑器字体

    Dbeaver 版本 23 1 0 字体链接 YaHei Consolas Hybrid 1 12 YaHei Consolas Hybrid 1 12 如何换字体 窗口 gt 首选项 gt 用户界面 gt Appearance gt Co
  • 30数据类型检测

  • Mysql数据库Sql优化

    1 选择合适的字段属性 mysql中表越小 查询速度越快 所以 我们在创建表时 字段尽可能的设置最小 如果可以的话 可以用MEDIUMINT而不是BIGIN来定义整型字段 应该尽量把字段设置为NOTNULL 这样在将来执行查询的时候 数据库
  • 华为OD机试真题- 书籍叠放-2023年OD统一考试(B卷)

    题目描述 书籍的长 宽都是整数对应 l w 如果书A的长宽度都比B长宽大时 则允许将B排列放在A上面 现在有一组规格的书籍 书籍叠放时要求书籍不能做旋转 请计算最多能有多少个规格书籍能叠放在一起 输入描述 输入 books 20 16 15
  • mybatis之foreach用法

    在做mybatis的mapper xml文件的时候 我们时常用到这样的情况 动态生成sql语句的查询条件 这个时候我们就可以用mybatis的foreach了 foreach元素的属性主要有item index collection ope
  • 选择器函数querySelector和querySelectorAll

    选择器是Css非常强大的功能 早先一般是通过getElementById和getElementsByTagName来获取页面元素 在一些场景下就很不方便 后来DOM扩展出了Selector API标准 其中 Selector API Lev
  • 移植uboot-支持yaffs烧写,打补丁

    1 修改uboot支持yaffs 首先 每个命令都会对应一个文件 比如nand命令对应的common cmd nand c 而我们使用nand命令时 便会进入do nand 函数 位于common cmd nand c 1 1do nand
  • 产品经理的思考-ChatGPT的影响

    最近ChatGPT的不断升温 公司开始全面布局和应用人工智能 本以为今年的赋智会有个过渡过程 没想到来的这么凶猛 随着应用的深入 越来越多的开始了灵魂质问 随着大模型的不断深入应用 什么职位会被取代 我们应该如何与ChatGPT共存 Cha
  • 2017年10米分辨率全球土地覆盖产品(FROM-GLC10)Python下载爬虫

    此为2017清华大学地球系统科学系宫鹏教授团队研发的重大成果世界首套 2017年10米分辨率全球土地覆盖产品 FROM GLC10 爬虫下载爬虫分享 一 参考网站 1 全国各省10米分辨率的土地利用数据的制作与分享 2 世界首套2017年1
  • vs2019编译c语言提示有病毒,关于VS2019代码编译的问题(C++)

    代码很长 这里就不打出来了 1 严重性代码说明项目文件行禁止显示状态 错误C2664 BOOL SetFileAttributesW LPCWSTR DWORD 无法将参数 1 从 const char 36 转换为 LPCWSTR Pro
  • android opengl es 总结

    什么是OpenGL ES OpenGL ES 为OpenGL for Embedded System的缩写 为适用于嵌入式系统的一个免费二维和三维图形库 为桌面版本OpenGL 的一个子集 OpenGL ES 定义了一个在移动平台上能够支持