目录

  • 1、成果
  • 2、myInit初始化函数
  • 3、加载纹理数据
  • 4、打开光照和材质
  • 5、显示列表封装绘制函数
    • 5.1显示列表封装绘制函数:绘制树干
    • 5.2显示列表封装绘制函数:绘制花朵
    • 5.3显示列表封装绘制函数:花与树干的连接
    • 5.4显示列表封装绘制函数:天空盒和地板
  • 6、投影变换
  • 7、封装树的绘制函数
  • 8、键盘响应函数&照相机的移动
  • 9、摄像机、视锥体、局部坐标系、世界坐标系的关系
  • 完整代码在我上传的资源处下载
  • 完整代码在我上传的资源处下载
  • 完整代码在我上传的资源处下载
  • 没有下载积分请把你qq私信发我
  • 没有下载积分请把你qq私信发我
  • 没有下载积分请把你qq私信发我

1、成果

2、myInit初始化函数

该函数中是一个初始化环境的函数,负责开启深度测试、自动法向、加载纹理数据、调用光照函数、材质设置以及调用生成列表函数。

void myInit() {glClearColor(1.0, 1.0, 1.0, 1.0);glDisable(GL_CULL_FACE);//自动法向防止变形glEnable(GL_NORMALIZE);glEnable(GL_DEPTH_TEST);//输入的深度值小于参考值,则通过glDepthFunc(GL_LESS);//纹理载入……//打开纹理glEnable(GL_TEXTURE_2D);//调用打开光照函数……//调用设置材质函数……//调用显示列表函数……
}

3、加载纹理数据

在myInit函数中设计for循环,依次图片路径数组读取图片,并依次加载进纹理数组中并分配编号,供后续贴图使用。每个编号均使用宏定义,更语义化。同时使用auxDIBImageLoad读取图片的宽高以及数据,不过VS2019中需要对图片路径字符转换为宽字符才能使用。

for (int i = 0; i < 9; i++) {//生成纹理编号glGenTextures(1, &ImagesIDs[i]);glBindTexture(GL_TEXTURE_2D, ImagesIDs[i]);WCHAR wfilename[256];memset(wfilename, 0, sizeof(wfilename));//该函数映射一个字符串到一个宽字符(unicode)的字符串MultiByteToWideChar(CP_ACP, 0, szFiles[i], strlen(szFiles[i]) + 1, wfilename, sizeof(wfilename) / sizeof(wfilename[0]));Images[i] = auxDIBImageLoad(wfilename);  //加载图片//Images[i] = auxDIBImageLoadA(szFiles[i]);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Images[i]->sizeX, Images[i]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Images[i]->data);//纹理被放大(一个纹元对应多个像素)//选择距像素中心最近的四个texel的加权平均值作为像素的颜色glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//纹理被缩小(多个纹元对应一个像素)//选择距像素中心最近的四个texel的加权平均值作为像素的颜色glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//纹理第一维坐标大于1小于0时,表现为裁剪glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);//纹理第二维坐标大于1小于0时,表现为裁剪glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);//纹理环境//直接使用纹理图片替换glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);}

4、打开光照和材质

设置光照和材质的函数都比较常规。在光照函数mySetupLights中,要设置环境光为白色,同时光源的位置中,最后一个参数为0,这样的光就是平行的光,更能模拟自然的太阳。

//灯光参数
void mySetupLights() {//环境光:白色的太阳光GLfloat ambientLight[] = { 1.0, 1.0, 1.0, 1.0 };//glColor3f(0.91f, 0.56f, 0.64f);//光源的颜色与物体的颜色值相乘(叉乘)GLfloat diffuseLight[] = { 0.9, 0.9, 0.9, 1.0 };  //散射光//镜面光:白色GLfloat specularLight[] = { 1.0, 1.0, 1.0, 1.0 };//阳光,模拟平行,第四个参数为0.0,定义相应的光源是定向光源,光线几乎是互相平行GLfloat posLight[] = { 0.0, 0.0, 0.0, 0.0 };GLfloat local_view[] = { 0.0 };//平滑模式glShadeModel(GL_SMOOTH);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);glLightfv(GL_LIGHT0, GL_POSITION, posLight);glEnable(GL_LIGHT0);//镜面反射角度glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
}//材质相关函数
void myMaterial() {glEnable(GL_COLOR_MATERIAL);//物体对各种光的强度GLfloat mat_ambient[] = { 1.0, 0.0, 0.0, 1.0 };GLfloat mat_diffuse[] = { 0.9, 0.38, 0.1, 1.0 };GLfloat mat_specular[] = { 1.0, 0.0, 0.0, 1.0 };GLfloat env_ambient[] = { 0.9, 0.38, 0.1, 1.0 };GLfloat mat_shinness[] = { 50.0 };glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shinness);//全局设置整个场景的环境光强度glLightModelfv(GL_LIGHT_MODEL_AMBIENT, env_ambient);
}

5、显示列表封装绘制函数

把绘制模型的函数,通过显示列表封装在myCreateList函数中,并提前在myInit函数中加载好,后续会在myTree函数中反复调用生成模型。每一个显示列表都用使用了glPushMatrix与glPopMatrix,这样所作变换操作就不会影响下一个变换,有些列表还使用了glPushAttrib与glPopAttrib,保证顶点处理时候的一些属性不影响后续顶点。

void myCreateList(void) {//创建树干绘制显示列表glNewList(TRUNK, GL_COMPILE);……//保护现场,不污染其他绘制glPushMatrix();……glPopMatrix();//删除曲面glEndList();//创建花朵绘制显示列表,八个大部分glNewList(FLOWER, GL_COMPILE);glPushMatrix();//保护花朵的颜色等属性不污染其他绘制glPushAttrib(GL_ALL_ATTRIB_BITS);……glPopAttrib();glPopMatrix();glEndList();//花朵和树干连接glNewList(FLOWERANDTRUNK, GL_COMPILE);glPushMatrix();glPushAttrib(GL_LIGHTING_BIT);
……glPopAttrib();glPopMatrix();glEndList();//地板的显示列表glNewList(LAND, GL_COMPILE);glPushMatrix();……glPopMatrix();glEndList();//天空盒的显示列表glNewList(SKYBOX, GL_COMPILE); glPushMatrix();……glPopMatrix();glEndList();
}

5.1显示列表封装绘制函数:绘制树干

通过gluNewQuadric函数可以绘制出底大顶小的圆柱体,但是需要注意的是默认绘制的圆柱轴与世界坐标系中z轴是平行的,如图8中的Ⅰ,所以在树干进行旋转变换(所有的模型变换都是基于局部坐标系)glRotatef(-90, 1.0, 0.0, 0.0)。这个时候树干在坐标系中效果为图8-Ⅲ、图8-Ⅳ。
图8 树干局部坐标系的变换

//创建树干绘制显示列表glNewList(TRUNK, GL_COMPILE);//二次曲面 cylquad = gluNewQuadric();//绑定纹理glBindTexture(GL_TEXTURE_2D, ImagesIDs[0]);//二次曲面绑定纹理gluQuadricTexture(cylquad, GL_TRUE);//保护现场glPushMatrix();//默认绘制的圆柱轴与z轴平行glRotatef(-90, 1.0, 0.0, 0.0);//绘制圆柱gluCylinder(cylquad, 0.1, 0.08, 1.7, 10, 10);glPopMatrix();//删除曲面gluDeleteQuadric(cylquad);
glEndList();

5.2显示列表封装绘制函数:绘制花朵

使用在线抠图网站,把模型描边(图9)扣出来。使用ppt,让坐标系图片与模型描边叠值(图10),人工读取花瓣特征坐标。为了贴图方便每一朵花瓣都切割为多个四边形,根据每片花瓣的长势,最少划分为2部分,最后划分为5部分。

//创建花朵绘制显示列表,八个大部分glNewList(FLOWER, GL_COMPILE);glPushMatrix();//保护花朵的颜色glPushAttrib(GL_ALL_ATTRIB_BITS);glBindTexture(GL_TEXTURE_2D, ImagesIDs[1]);//粉色glColor3f(0.91f, 0.56f, 0.64f);glBegin(GL_QUADS); //part1-1glTexCoord2f(0.0, 0.22); glVertex3f(0.0, 0.0, 0.0);glTexCoord2f(0.6, 0.044); glVertex3f(0.30, -0.09, 0.0);glTexCoord2f(0.8, 0.22); glVertex3f(0.44, 0.0, 0.0);glTexCoord2f(1.0, 1.0);  glVertex3f(0.46, 0.19, 0.0);glEnd();glBegin(GL_QUADS); //part1-2……glEnd();glBegin(GL_QUADS); //part2-1……glEnd();//省略了很多,详情见工程文件…………glBegin(GL_QUADS);//part8-5……glEnd();glPopAttrib();glPopMatrix();glEndList();


图11 绘制的花朵

5.3显示列表封装绘制函数:花与树干的连接

从这里开始就体现了glPushMatrix与glPopMatrix的作用。因为绘制树干与花朵都是各自的glPushMatrix与glPopMatrix中,则树干与花朵都是基于世界坐标系(0,0,0)建模。在封装花朵与树干的连接的时候,先绘制树干,然后进行glTranslatef(0.0, 1.7, 0.0)把花朵的局部坐标系向y轴平移1.7个单位,这个时候花朵才是在树干头顶开始绘制。坐标系如图12、13、14。

//花朵和树干连接glNewList(FLOWERANDTRUNK, GL_COMPILE);glPushMatrix();glPushAttrib(GL_LIGHTING_BIT);glCallList(TRUNK);glTranslatef(0.0, 1.7, 0.0);glPushMatrix();glRotatef(90, 0.0, 1.0, 0.0);glRotatef(50, 1.0, 0.0, 0.0);glCallList(FLOWER);glPopMatrix();glPushMatrix();glRotatef(180, 0.0, 1.0, 0.0);glRotatef(60, 1.0, 0.0, 0.0);glCallList(FLOWER);glPopMatrix();glPopAttrib();glPopMatrix();glEndList();

图12花朵未平移图图13 花朵平移后图

图14 花朵平移坐标系示意图

5.4显示列表封装绘制函数:天空盒和地板

天空盒就是一个正六面体,然后按照顺序贴图。地板就是一块平行于世界坐标系的x0y面的正方形区域

//天空盒的显示列表glNewList(SKYBOX, GL_COMPILE); //天空背景glPushMatrix();glBindTexture(GL_TEXTURE_2D, ImagesIDs[3]);/** 绘制背面 */glBegin(GL_QUADS);/** 指定纹理坐标和顶点坐标 */glTexCoord2f(1.0f, 0.0f); glVertex3f(10, -10, -10);glTexCoord2f(1.0f, 1.0f); glVertex3f(10, 10, -10);glTexCoord2f(0.0f, 1.0f); glVertex3f(-10, 10, -10);glTexCoord2f(0.0f, 0.0f); glVertex3f(-10, -10, -10);glEnd();glPopMatrix();/** 绘制前面 */glBindTexture(GL_TEXTURE_2D, ImagesIDs[4]);glBegin(GL_QUADS);/** 指定纹理坐标和顶点坐标 */glTexCoord2f(1.0f, 0.0f); glVertex3f(10, -10, 10);glTexCoord2f(1.0f, 1.0f); glVertex3f(10, 10, 10);glTexCoord2f(0.0f, 1.0f); glVertex3f(-10, 10, 10);glTexCoord2f(0.0f, 0.0f); glVertex3f(-10, -10, 10);glEnd();/** 绘制底面 */glBindTexture(GL_TEXTURE_2D, ImagesIDs[5]);glBegin(GL_QUADS);/** 指定纹理坐标和顶点坐标 */glTexCoord2f(1.0f, 0.0f); glVertex3f(10, -10, 10);glTexCoord2f(1.0f, 1.0f); glVertex3f(10, -10, -10);glTexCoord2f(0.0f, 1.0f); glVertex3f(-10, -10, -10);glTexCoord2f(0.0f, 0.0f); glVertex3f(-10, -10, 10);glEnd();/** 绘制顶面 */glBindTexture(GL_TEXTURE_2D, ImagesIDs[6]);glBegin(GL_QUADS);/** 指定纹理坐标和顶点坐标 */glTexCoord2f(1.0f, 0.0f); glVertex3f(10, 10, 10);glTexCoord2f(1.0f, 1.0f); glVertex3f(10, 10, -10);glTexCoord2f(0.0f, 1.0f); glVertex3f(-10, 10, -10);glTexCoord2f(0.0f, 0.0f); glVertex3f(-10, 10, 10);glEnd();/** 绘制左面 */glBindTexture(GL_TEXTURE_2D, ImagesIDs[7]);glBegin(GL_QUADS);/** 指定纹理坐标和顶点坐标 */glTexCoord2f(1.0f, 1.0f); glVertex3f(-10, 10, -10);glTexCoord2f(0.0f, 1.0f); glVertex3f(-10, 10, 10);glTexCoord2f(0.0f, 0.0f); glVertex3f(-10, -10, 10);glTexCoord2f(1.0f, 0.0f); glVertex3f(-10, -10, -10);glEnd();///** 绘制右面 */glBindTexture(GL_TEXTURE_2D, ImagesIDs[8]);glBegin(GL_QUADS);/** 指定纹理坐标和顶点坐标 */glTexCoord2f(0.0f, 1.0f); glVertex3f(10, 10, -10);glTexCoord2f(1.0f, 1.0f); glVertex3f(10, 10, 10);glTexCoord2f(1.0f, 0.0f); glVertex3f(10, -10, 10);glTexCoord2f(0.0f, 0.0f); glVertex3f(10, -10, -10);glEnd();glEndList();}//地板的显示列表glNewList(LAND, GL_COMPILE);glPushMatrix();glBindTexture(GL_TEXTURE_2D, ImagesIDs[2]);glBegin(GL_QUADS);glTexCoord2d(0.0, 0.0);   glVertex3f(10, 0, 10);glTexCoord2d(1.0, 0.0);   glVertex3f(10, 0, -10);glTexCoord2d(1.0, 1.0);   glVertex3f(-10, 0, -10);glTexCoord2d(0.0, 1.0);   glVertex3f(-10, 0, 10);glEnd();glPopMatrix();glEndList()

6、投影变换

gluPerspective函数2个功能:一是产生一个视锥体让平面的图形开始有立体感,在世界坐标系中的z轴上平移时候有近大远小的变化。另外一个就是窗口发生变化时候,计算新的窗口的宽高比进行重绘视口,这样保证图形不变形。同时注意,变换之后,一定要变换回模型坐标系,以便正确接下来的模型绘制与变换。

//防止窗口变形函数
void myOnReshape(int w, int h) {WinWidth = w;WinHeight = h;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1, 30.0);//恢复为模型变换的矩阵,当然也可以写在myDisplay中glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}

7、封装树的绘制函数

树的绘制函数是本次实验中建模的关键。 采用递归思想,对函数进行封装,先写好只有一个树干,一朵花的函数(图13)。通过反复调用该函数生成若干个枝条,在正确进行拼接,最终得到一颗完整的树。三个要点:
 每段枝条都是生长在前一段枝条的末端
 每段枝条比前一条细
 花朵有大有小
if语句块决定递归的深度,以及正真的调用绘制。else语句块决定随机的模型变换矩阵,通过递归变换矩阵会随函数调用栈逐步相乘,最终起到逐步缩小枝条、缩小花朵、后一段枝条与前一段枝条的拼接的3大效果。

//生成树的函数
void myTree(int m) {long savedseed;//结束递归的标志//数字越大,枝条越细,也越多if (m == 8) {glPushMatrix();glRotatef(60.0 + myRand() * 120.0, 0.0, 1.0, 0.0);//正真的开始绘制树枝和连接处glCallList(FLOWERANDTRUNK);glPopMatrix();}else {//这里面只是决定递归的层数//调用树干glCallList(TRUNK);glPushMatrix();//把局部坐标系移到木桩的顶部开始glTranslatef(0.0, 1.7, 0.0);//绘制的花都很大,都缩小点glScalef(0.75, 0.75, 0.75);//生成随机数savedseed = rand();//递归调用glPushMatrix();//随机绕y轴旋转,表现形式就是屏幕平面上旋转(左升右下)glRotatef(10.0 + myRand() * 10.0, 0.0, 1.0, 0.0);//随机绕z轴旋转,表现形式往屏幕外面旋转glRotatef(20.0 + myRand() * 30.0, 0.0, 0.0, 1.0);//结束递归调用myTree(m + 1);glPopMatrix();//初始化新的随机数种子seedsrand(savedseed);savedseed = rand();//被包裹在最开始的push与pop中,缩放效果的到叠加glPushMatrix();//随机绕y轴旋转,表现形式就是屏幕平面上旋转(左升右下)glRotatef(250.0 + myRand() * 80.0, 0.0, 1.0, 0.0);glRotatef(60.0 + myRand() * 30.0, 0.0, 0.0, 1.0);myTree(m + 1);glPopMatrix();//让随机数更随机一点srand(savedseed);savedseed = rand();glPushMatrix();glRotatef(180.0 + myRand() * 90.0, 0.0, 1.0, 0.0);glRotatef(30.0 + myRand() * 30.0, 0.0, 0.0, 1.0);myTree(m + 1);glPopMatrix();glPopMatrix();}
}

8、键盘响应函数&照相机的移动

通过绑定键盘按键和变量,控制照相机在世界坐标系中的位置,达到移动效果。完成上面代码后,运行编译,发现绘制的树太高了,超出屏幕上方看不见了,这个时候使用glPushMatrix与glPopMatrix对树与地板在他们的局部坐标系中往y轴与z轴方向平移。使的树与地板相对世界坐标系或者投影坐标系中往下与往后移动,得以看到树的全貌。

//myDisplay中调用绘制函数
void myDisplay(void) {//清除颜色缓冲和深度缓冲glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//摄像机位置gluLookAt(g_LandR, g_UandD, g_Z, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//绘制树的时候,打开光照glEnable(GL_LIGHTING);//只想让树平移,而不想影响天空盒glPushMatrix();//相对世界坐标系的左右,前后,上下glTranslatef(0.0, -2.0, -2.0);//绘制树myTree(0);//绘制土地glCallList(LAND);glPopMatrix();glDisable(GL_LIGHTING);  //绘制天空背景的时候,关闭光照glCallList(SKYBOX);//交换缓冲glutSwapBuffers();
}//键盘控制交互
void myKey(unsigned char key, int x, int y) {switch (key) {case 'w':g_UandD += 0.1;glutPostRedisplay();break;case 's':g_UandD -= 0.1;glutPostRedisplay();break;case 'a':g_LandR -= 0.1;glutPostRedisplay();break;case 'd':g_LandR += 0.1;glutPostRedisplay();break;case 'q':g_Z += 0.1;glutPostRedisplay();break;case 'e':g_Z -= 0.1;break;default:break;}//重要myOnReshape(WinWidth,WinHeight);glutPostRedisplay();
}

9、摄像机、视锥体、局部坐标系、世界坐标系的关系

所有代码完成后,并注释myDisplay函数中的这条glTranslatef语句后。所有代码之后造成的坐标系为图15。注意这个图是从计算机屏幕右侧面绘制的

//只想让树平移,而不想影响天空盒glPushMatrix();//相对世界坐标系的左右,前后,上下//glTranslatef(0.0, -2.0, -2.0);//绘制树myTree(0);//绘制土地glCallList(LAND);glPopMatrix();

图15 建模后的坐标系与投影变换

OpenGL植物建模(附完整代码、注释清晰、分步讲解)相关推荐

  1. 【仿真】Carla之收集数据快速教程 (附完整代码)

    收集过程可视化展示,随后进入正文: 参考与前言 看到仿真群对这类任务下(用carla收集数据然后再做训练等) 需求量大,顺手马上写一个好了,首先收集数据需要考虑清楚: 收集什么数据,需要什么样的数据格 ...

  2. 基于pytorch搭建多特征CNN-LSTM时间序列预测代码详细解读(附完整代码)

    系列文章目录 lstm系列文章目录 1.基于pytorch搭建多特征LSTM时间序列预测代码详细解读(附完整代码) 2.基于pytorch搭建多特征CNN-LSTM时间序列预测代码详细解读(附完整代码 ...

  3. 数学分析模型(一):数据的无量纲处理方法及示例(附完整代码)

    数据的无量纲处理方法及示例(附完整代码) (1)极值化方法 (2)标准化方法 (3)均值化方法 示例 要求 建模步骤 程序 结果 备注 在对实际问题建模过程中,特别是在建立指标评价体系时,常常会面临不 ...

  4. 对“科大讯飞2021丨广告点击率预估挑战赛 Top1方案(附完整代码)_Jack_Yang的博客-CSDN博客”的补充。

    这篇文章的初衷是针对科大讯飞2021丨广告点击率预估挑战赛 Top1方案(附完整代码)_Jack_Yang的博客-CSDN博客进行补充. 博客的信息量很少,对任务背景的介绍也不太对,说实话令人费解.我 ...

  5. 想要快速爬取整站图片?速进(附完整代码)

      大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...

  6. 喷管流动的守恒型CFD解法及激波捕捉(附完整代码)

    入门CFD,主要参考书目<计算流体力学基础及其应用>(John D.Anderson 著,吴颂平等 译) 实现了 第 7.6 节 激波捕捉  的代码,采用的是 MacCormack 方法, ...

  7. php 3d animation,css3D+动画的例子(附完整代码)

    本篇文章给大家带来的内容是关于css3D+动画的例子(附完整代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 最近玩了玩用css来构建3D效果,写了几个demo,所以博客总 ...

  8. Py之pygame:有趣好玩—利用pygame库实现鱼儿自动实时目标跟踪(附完整代码)

    Py之pygame:有趣好玩-利用pygame库实现鱼儿自动实时目标跟踪(附完整代码) 目录 输出结果 实现代码 输出结果 实现代码 #Py之pygame:利用pygame库实现鱼儿自动实时目标跟踪i ...

  9. c++代码好玩_Py之pygame:有趣好玩—利用pygame库实现鱼儿自动实时目标跟踪(附完整代码)...

    Py之pygame:有趣好玩-利用pygame库实现鱼儿自动实时目标跟踪(附完整代码) 目录 输出结果 实现代码 输出结果 ​ 实现代码 #Py之pygame:利用pygame库实现鱼儿自动实时目标跟 ...

  10. OpenCV基本线性变换轨迹栏的实例(附完整代码)

    OpenCV基本线性变换轨迹栏的实例 OpenCV基本线性变换轨迹栏的实例 OpenCV基本线性变换轨迹栏的实例 OpenCV基本线性变换轨迹栏的实例(附完整代码) #include "op ...

最新文章

  1. Python学习之路—2018/7/14
  2. ESP32的FLASH、NVS、SPIFFS、OTA等存储分布以及启动过程
  3. 关于网狐棋牌6603源码的整理、编译和搭建
  4. java虚拟机调优_Java虚拟机中JVM参数调优及其有用的命令
  5. 弹层蒙版(mask),ios滚动穿透,我们项目的解决方案
  6. from表单iframe原网页嵌入
  7. (转)在编写Spring框架的配置文件时,标签无提示符的解决办法
  8. nginx 负载均衡+keepalived实现双机热备
  9. ————————C语言中快速排序方法——————————————
  10. 最受互联网争抢的web前端工程师
  11. 没有基础怎么学习Web前端?相关学习路线又是什么?
  12. 虚拟服务器配置推荐,如何选择虚拟主机配置
  13. Spring @Aspect实现切面编程
  14. 论文笔记_S2D.35-2017-IROS_利用CNNs联合预测RGB图像的深度、法线和表面曲率
  15. java的path含义_java中path和CLASSPATH的配置和意义解析
  16. linux电容触摸屏驱动参数,linux 电容触摸屏驱动-1
  17. PNG,JPEG,BMP,JIF图片格式详解及其对比
  18. accept搭配用法_accept for的用法与搭配
  19. 纯HTML写国际象棋棋盘
  20. 80端口进不去问题解析

热门文章

  1. 数据采集入门——Flume应用
  2. buuoj Pwn writeup 186-190
  3. Win11限制第三方浏览器工具:默认打开需用微软的edge浏览器
  4. 细看MKV争当视频格式新宠儿
  5. GDI+: Curved Shapes
  6. 华为云 · 云桌面 Workspace(介绍)
  7. 【自动驾驶工程师的自我修养】自动驾驶技术体系及相关术语(随时更新)
  8. linux 打印相关备忘
  9. 【浅墨Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑
  10. [办公自动化]windows7 仿宋GB2312字体打印不对