任意的形如 z = F(x,y)的曲面生成与显示---基于OpenGL Core Profile
运行结果:
(圆锥面)
(抛物面)
(马鞍面)
其中的做法是:从顶部看上去就是一个平面网格、每个点的 z、x的位置都是程序细分出来的(指定起始、结束、步长)、比较固定、但高度 y 的计算使用 用户指定的函数去计算
把每个顶点的信息传入 vbo、再计算出每个三角面片的索引号、传入ebo、最后glDrawElement()进行绘制!
由于这是opengl而不是高等数学、所以y应该是向上的、这些细节在生成点的时候可以交换一下变量从而得到解决
同样应该把这种模型封装到类里。
相关的成员变量:
Xs:X坐标的start
Xe:X坐标的end
Y同理
Fxy:用 stl 的方法传递函数、而不是用函数指针
pointCount:指出有多少个顶点、用于给vbo传数据
totalIndices:指出ebo有多少个索引元素、绘制时有用
Q:一列有多少个点
P:一行有多少个点


传递函数到类内、并保存起来的的代码:
void setFunction(std::function<float(float, float)> fxy) {
this->Fxy = fxy;
this->isFunctionInit = true;
}
计算PQ的代码: 可以先带个小的数验算一下: 比如 从【-1,1】、delta = 0.5,那就是 -1, -0.5 , 0 ,0.5, 1 五个点、确实等于 ((1-(-1))/0.5)+1
总的点数那么肯定是 Q*P 了
Q = ((Ye - Ys) / delta ) + 1 ;
P = ((Xe - Xs) / delta) + 1;
pointCount = Q * P;
接下来就可以程序化生成点和索引号了:
生成点的代码是从第一列开始、然后每列处理完了就进行下一列
所以可以知道、这个网格的左上角的点是第一个被处理的、它的逻辑坐标是(0,0)、ebo 要索引 vbo 的下标是 0
从而 定义一个 index宏 表示网格上 以 x,y 为坐标(不是实际的浮点数坐标、而是从 j ∈ [0...Q - 1], i ∈ [0...P - 1]的逻辑坐标)对应的点在 vbo 内的索引号
比如: (0,0)--> 0 : 左上角的点是第0个点
(1,0)--> col = Q 左上角的那个点的右邻居确实索引是 Q、 因为第一列点的索引是从 [0....Q-1] (共Q个点)
总共的索引数是 (P-1)*(Q-1)* 6 ,因为如果有 P 个点、那么就有 P -1 个间距、从而整个网只有 (P-1)*(Q-1)个正方块、我们用三角形再切开每个面、需要两个三角形、每个三角形又有三个顶点必须指定。
从这张图可以清楚分析出哪几个点应该是一个三角面片

后面生成VAO、VBO、EBO的代码就不用多说了!!注意思考好到底开多大的显存!这里很容易算错
1 #define index(x,y,col) (x)*(col)+(y)
2
3 void FuncMesh::genMesh() {
4 if (this->isFunctionInit == false) {
5 return;
6 }
7
8 auto points = new Vector3[pointCount];
9 size_t id1 = 0;
10 for (float curX = Xs; curX <= Xe ; curX += deltaH)
11 {
12 for (float curY = Ys; curY <= Ye ; curY+= deltaH)
13 {
14 Vector3 v3;
15 v3.x = curX;
16 v3.z = curY;
17 v3.y = Fxy(curX, curY);
18 points[id1] = v3;
19 id1++;
20 }
21 }
22 totalIndices = (P-1) * (Q-1) * 6;
23 GLuint* eboArr = new GLuint[totalIndices];
24 for (size_t i = 0; i <= P-2; i++)
26 {
27 for (size_t j = 0; j <= Q-2; j++)
28 {
29 eboArr[k++] = index(i, j, Q);
30 eboArr[k++] = index(i+1, j, Q);
31 eboArr[k++] = index(i, j+1, Q);
32
33 eboArr[k++] = index(i, j+1, Q);
34 eboArr[k++] = index(i+1, j, Q);
35 eboArr[k++] = index(i+1, j+1, Q);
36 }
37 }
38 GLuint vbo;
39 GLuint ebo;
40
41
42 glGenVertexArrays(1,&vao);
43 glBindVertexArray(vao);
44
45 glGenBuffers(1, &vbo);
46 glBindBuffer(GL_ARRAY_BUFFER, vbo);
47 glBufferData(GL_ARRAY_BUFFER, pointCount*(sizeof(Vector3)), points, GL_STATIC_DRAW);
48 glEnableVertexAttribArray(0);
49 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
50
51 glGenBuffers(1, &ebo);
52 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
53 glBufferData(GL_ELEMENT_ARRAY_BUFFER, totalIndices * sizeof(GLuint), eboArr, GL_STATIC_DRAW);
54
55 glBindVertexArray(0);
56
57 }
vshader的话、就用一个简单的MVP矩阵变换、
fshader的话、就用一个简单的输出单一颜色即可
顺便说一下VS中配置相对路径从而引用第三方库到底怎么写:
比如我的目录:

--》包含

Project1中是:

这个黄色箭头指向的文件夹里有vs的项目文件:

third中是:

那么、我们在VS中要配置附加包含目录和附加库目录、其实就是相对那个 vxproj 进行配置的!
右击---》属性

..\..\ 表示往父级后退两步、从哪里开始退呢?就是从 vxproj (一个solution里可能有多个project、以目前右击的那个为准)所在的那个文件夹处后退两步、可以看到这确实会退到只有 {Project1、third} 这两个文件夹的那个文件夹、然后再步进到third中就行了!

完整的工程下载(自带一堆三方库):
链接:https://pan.baidu.com/s/1KWGrK8yfddlHCVolBWn2sA
提取码:bby7
任意的形如 z = F(x,y)的曲面生成与显示---基于OpenGL Core Profile的更多相关文章
- Z+F激光扫描仪
链接:https://zhuanlan.zhihu.com/p/48589754 三维扫描仪有三个误差来源: ● 线性误差(激光雷达部分/LARA) ● 测距噪声(激光雷达部分/LARA) ● 测角误 ...
- Highcharts属性与Y轴数据值刻度显示Y轴最小最大值
Highcharts 官网:https://www.hcharts.cn/demo/highcharts Highcharts API文档:https://api.hcharts.cn/highcha ...
- easyUI的分页,只显示第X 共Y页。改为显示 第X 页 共Y页
如下图,easyUI的分页,只显示第X 共Y页. 需求需要显示 第X 页 共Y页. 解决办法:在easyui-lang-zh_CN.js更改以下代码,即可.也就是在 “共{pages}页”前面加个 “ ...
- z+f profiler 9012
角度分辨率/角度精度 0.0088°/0.02°RMS
- z+f数据解析
1.先打开cmd2.把D:\qcc\编译和解析\debug_jiexi\SampleZFS.exe 拉进来.3.SampleZFS.exe -i *.zfs -o D:\*.txt 注意:*号代表文件 ...
- echarts使用记录(三):x/y轴数据和刻度显示及坐标中网格显示、格式化x/y轴数据
1.去掉坐标轴刻度线,刻度数据,坐标轴网格,以Y轴为例,同理X轴 xAxis: [{ type: 'category', axisTick: {//决定是否显示坐标刻度 alignWithLabel: ...
- 如何猜出 Y combinator
先约定几个记号: 定义用一个冒号加等号表示":=", 表达式全等用两个等号表示"==", 归约意义上的相等用一个等号表示"="," ...
- Problem D: 求(x-y+z)*2
Description 编写一个程序,求解以下三个函数: f(x,y,z)=2*(x-y+z) f(x,y) =2*(x-y) f(x) =2*(x-1) 函数调用格式见append.cc. ...
- C# 语言规范_版本5.0 (第7章 表达式)
1. 表达式 表达式是一个运算符和操作数的序列.本章定义语法.操作数和运算符的计算顺序以及表达式的含义. 1.1 表达式的分类 一个表达式可归类为下列类别之一: 值.每个值都有关联的类型. 变量.每个 ...
- 漫谈格兰杰因果关系(Granger Causality)——第一章 野火烧不尽,春风吹又生
2017年7月9日上午6点10分,先师胡三清同志--新因果关系的提出者.植入式脑部电极癫痫治疗法的提出者.IEEE高级会员,因肺癌医治无效于杭州肿瘤医院去世,享年50岁.余蒙先师厚恩数载,一朝忽闻先师 ...
随机推荐
- Demo of canvas, canvas optimization and svg
It used the canvas to draw the curves in the old project, and the client felt that it was vague, so ...
- 综合java admin后台记录
在新冠将来未来的气氛下,做一些年终封箱吧,这个事没做完,但暂时可能也没时间做,待来年了 https://hooray.gitee.io/fantastic-admin/ https://github. ...
- HDLbits——Lfsr32
//Build a 32-bit Galois LFSR with taps at bit positions 32, 22, 2, and 1. 草图 verilog描述 module top_mo ...
- viewpager加fragment可滑动加radio跟随滑动
public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, V ...
- SpringBoot2.2.2+SpringCloud-Hoxton.SR1整合eureka/gateway
1.最近在学习SpringCloud分布式项目的知识,所以打算把自己学习到的知识也记录下来,为什么选择学习SpringCloud呢?因为分布式框架还有dubbo,如下图应该可以成为我为什么想学习Spr ...
- python 识别登陆验证码图片(完整代码)
在编写自动化测试用例的时候,每次登录都需要输入验证码,后来想把让python自己识别图片里的验证码,不需要自己手动登陆,所以查了一下识别功能怎么实现,做一下笔记. 首选导入一些用到的库,re.Imag ...
- drf从入门到飞升仙界 07
认证组件 ## 认证组件逻辑 # 1.登录认证的限制: - 访问接口,有的需要登陆后才能访问,有的接口,不登录就能访问 # 2.准备: -User表 : 存储用户名,密码 -UserToken表:存储 ...
- 《Unix/Linux系统编程》第十四章学习笔记 20201209戴骏
MySQL数据库系统 知识点总结 一.MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一 ...
- 054_VisualForce Ajax 01
为获得最佳性能,请在使用少量数据时使用AJAX Toolkit: 由于信息是通过浏览器传送的,所以AJAX最适合于相对较少的数据量(最多约200条记录)六个字段各有50个字符的数据).返回的数据集越大 ...
- memoの二维码分享WiFi
用下面的网址就好了. https://zxing.appspot.com/generator 不自己动手多没意思!借助python,自己生成一下. 二维码生成库 pip install qrcode, ...