
计算机图形学
文章平均质量分 55
McQueen_LT
talk is cheap, show me your code!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Modern OpenGL---做一些好玩的东西03 动态绘制点云模型
这次增加了一些键盘控制功能,通过 wasd 来控制 上下左右四个方向,通过x键来进行缩小,z键进行放大。大致思路就是通过注册一个键盘相应函数,来控制坐标和缩放因子,放大缩小只需要对坐标乘上缩放因子,上下左右平移只需要对坐标进行加减操作即可。然后通过uniform来将这些全局变量传入到顶点着色器中即可。代码:#include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>#include <fstr原创 2021-08-31 14:46:53 · 1513 阅读 · 0 评论 -
Modern OpenGL---09 纹理(纹理单元可贴多个纹理)
对之前画的矩形基础上贴上纹理。在片段着色器中,声明一个采样器,表示纹理位置,每个纹理位置叫做纹理单元,比如 0、1等,当只有一个纹理事时,纹理单元默认为0,当有一个以上的纹理时,则需要通过uniform从外部设置每个纹理单元的值。需要注意的是,在一个以上的纹理绑定过程中,需要激活纹理单元的位置,然后进行绑定当前纹理。比如需要绑定第2个纹理时,需要先通过 glActiveTexture(GL_TEXTURE1),来激活位置为 1 的纹理单元,然后再通过 glBindTexture()来绑定纹理对象。(第1个原创 2021-08-12 17:18:57 · 692 阅读 · 0 评论 -
Modern OpenGL---做一些好玩的东西02 四个顶点同时闪烁的矩形
之前做了两个同时闪烁的三角形,是通过两个vao对象分别绘制三角形达到闪烁的效果的。那么如果将顶点的颜色属性作为顶点着色器的输出并作为片段着色器的输入,那么就能够分别对每个顶点的颜色单独绘制了,这样就能够使得每个顶点的颜色都不一样。那么如何使每个顶点闪烁起来呢?那么可以通过uniform来改变片段着色器中颜色变量中的某个值,比如只改变RGBA中的R值。代码:#include <GL/glew.h>#include <GLFW/glfw3.h>#include <iost原创 2021-08-11 11:28:28 · 339 阅读 · 0 评论 -
Modern OpenGL---08 顶点着色器与片段着色器间的通信
一个顶点数据可能会包含多个属性,比如2维坐标和4维的颜色,那么一个顶点数据就有6个维度了。通过顶点着色器,将每个顶点的颜色传递到片段着色器中。传递颜色时,现在顶点着色器中声明一个输出颜色变量,然后再在片段着色器中声明一个输入颜色变量,这两个颜色变量的类型要一致,变量名也要相同,这样着色器程序就能够默认将这两个变量认为是同一个变量,就可以进行不同着色器之间的通信了。值得注意的是,在增加了顶点数组中的颜色属性的数据后,在后面创建vbo对象后复制顶点数据时,需要修改复制顶点数据的大小,同时在启用顶点属性指针时原创 2021-08-10 15:03:33 · 413 阅读 · 0 评论 -
Modern OpenGL---做一些好玩的东西 01(绘制两个同时闪烁的三角形)
在刚刚学习了现代OpenGL后,想做一些好玩的东西。这是第一个,想做两个三角形,然后这两个三角形的颜色会一直变化,就能达到闪烁的效果。绘制两个不同颜色的三角形的话,首先应该将顶点的索引分成两个ibo对象,然后通过两个vao对象来进行绑定,而顶点数据vbo对象可以共用两个,只不过需要在两个vao对象上分别绑定一次;不同颜色的三角形,则需要两个不同的片段着色器(疑问:能否只用同一个片段着色器达到两种不同的颜色?),然后分别在不同的FragmentShader中设置不同的颜色,然后在窗口循环中进行渲染时,分原创 2021-08-10 13:11:56 · 487 阅读 · 0 评论 -
Modern OpenGL---07抽象化VertexBuffer和IndexBuffer
这节课将原本在主函数中的对创建的VertexBuffer和IndexBuffer抽象成一个类,逐渐C++化。值得注意的是,主函数中需要额外添加一对“{}”,来防止由GLCall()导致的死循环。#include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>#include <fstream>#include <string>#include <sstream>原创 2021-08-08 16:28:17 · 670 阅读 · 0 评论 -
Modern OpenGL---06 使用GLFW_OPENGL_CORE_PROFILE,绑定VertexArray
在使用GLFW_OPENGL_COMPAT_PROFILE时,内部有一个默认的glBindVertexArray()过程,当在glfwWindowHinit()初始化时,使用了GLFW_OPENGL_CORE_PROFILE,则需要通过显示创建一个VertexArray(VAO),并将其绑定,绑定后,每当需要绘制这些vertices时,只需要绑定vao即可,不需要再绑定buffer和glEnableVetexAttribPointer()了,方便很多。代码:#include <GL/glew.h&原创 2021-08-08 15:19:41 · 911 阅读 · 0 评论 -
Modern OpenGL---05 使用uniform改变shader的颜色
可以通过 glGetUniformLocation()获得指定着色器所在的location,然后使用glUniform4f() 为着色器中的颜色进行赋值或修改。在while循环中利用glUnifor4f()修改颜色可实现动画。#include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>#include <fstream>#include <string>#include原创 2021-08-08 12:57:43 · 422 阅读 · 0 评论 -
Modern OpenGL---04 OpenGL函数错误的处理
在写opengl函数过程中,容易出现编译通过了,但是出来的窗口确实黑的,或者跟预期的不一样,那么就说明应该是某个函数出错了,其中默认类型转换就是最容易出现的错误,比如 GL_UNSIGNED_INT 被 错误的写成了 CL_INT,这样就会导致整个函数失效了。可以通过宏定义来解决这个问题,就是通过定义一个宏函数,然后将每个gl函数都用这个宏函数调用,这样可以实现对每个函数进行检测是否出现了错误,并且在控制台打印出错的具体位置。另外,如果在调试模式下(F5),会直接在出错的地方break,能够直接定位到错误原创 2021-08-07 23:20:33 · 551 阅读 · 0 评论 -
Modern OpenGL---03 绘制矩形(两个三角形)
在 02 的基础上可以增添到6个顶点,来依次绘制6个顶点(2个三角形)可以得到一个四边形,但是其中有2个点是重复的,这样会浪费内存,所以可以通过创建一个 索引缓存(indices buffer)来存储position数组中需要绘制的点的索引顺序,然后将indices buffer与position一样绑定到GPU内存中。代码#include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>#include原创 2021-08-07 22:06:12 · 481 阅读 · 0 评论 -
Modern OpenGL---02 着色器文件的处理(新建.shader文件)
目录结构代码#include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>#include <fstream>#include <string>#include <sstream>struct ShaderProgramSource{ std::string VertexSource; std::string FragmentSouce;};s原创 2021-08-07 19:12:03 · 754 阅读 · 0 评论 -
Modern OpenGL---01 用顶点着色器和片段着色器绘制红色三角形
代码:#include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>static unsigned int CompiledShader(unsigned int type, const std::string &source){ unsigned int id = glCreateShader(type); //创建一个着色器 const char* src = sour原创 2021-08-07 14:59:40 · 405 阅读 · 0 评论 -
CGAL 凹包(alpha-Shape)
本文转自https://doc.cgal.org/latest/Alpha_shapes_2/index.html。IntroductionAssume we are given a set S of points in 2D or 3D and we would like to have something like “the shape formed by these points”. This is quite a vague notion and there are probably many转载 2021-07-14 17:49:41 · 3638 阅读 · 4 评论 -
PCL点云边缘检测源码解析(过程记录)---AngleCriterion (附C++代码)
一、概述在PCL中集成了一个非常经典的点云边缘检测算法,这个算法也在 PCL边缘检测 这篇博客中讲解了。那篇文章中只介绍了AC算法的思想步骤以及它的接口调用。那么它的内部具体是如何实现的呢,如果知道了它的具体实现,那么在某些情况下,就可以直接在它的源码基础上做一些小的改动,就能够更好地适应不同的需求了。这里只对AC边缘检测算法做个源码解析及修改后调用的过程记录,若以后需要解析其他PCL功能,也可以借鉴一下。二、PCL边缘检测源码(AC)定位过程首先,定位什么功能的源码,前提是已经知道了它调用的接口是原创 2021-06-29 09:33:55 · 8030 阅读 · 11 评论 -
如何提取出MeshLab中计算法线的功能---详细过程记录
一、概述最近复现了几个点云相关的算法,复现完成后进行测试。由于算法的输入要求点云具有法线,所以一开始进行测试的时候,利用MeshLab对点云进行了法线的计算。但是后来在对算法封装的时候,在内部用了PCL的NormalEstimation来计算点云法线。封装完成后进行测试时发现输出的结果与之前测试相比差了一些。后来排查问题的时候发现原因就是出在法线计算上。在对比了PCL计算的法线与MeshLab计算的法线后得到结论:PCL计算的法线没有MeshLab计算的法线精准。所以问题来了,就要去看MeshLab的源码原创 2021-06-23 16:55:49 · 3153 阅读 · 6 评论 -
PCL点云边界特征检测 (附完整代码 C++)
一、概述点云特征在定义上(以我个人理解)大致可以分为两大类:一类是类似于深度学习的featrue map意义,通过计算一些算子来描述点云局部,这种描述只是一种标识符,并没有实际的几何意义,比如 PFH或者 FPFH 之类的,它们只是通过对每个点的局部邻域计算一个 125125125 维或者 333333 维的向量来描述当前点,这跟机器学习中的 featurefeaturefeature 是一样的,通过这类特征可以用来做点云的配准(其中某些特征可以进一步处理【模式识别】得到几何特征,因为某一类的几何特征在原创 2021-06-22 11:58:45 · 17402 阅读 · 15 评论 -
点云配准算法---ICP(迭代最近邻点)详解 附C++代码
一、概述现在是2021.6.2晚21:24,闲着也是闲着,写个ICP吧,再从头到尾思考一遍,做一个详细的记录。ICP算法是一种点云配准时常用的方法,它是一种细配准方法,通常在配准时要配合其他粗配准方法进行使用,先将两帧差异非常大的点云进行粗配准,得到初步具有重合部分的点云,然后再利用ICP将其进一步配准,使得重合区域最大。二、ICP思想步骤ICP:Iterative Closest Point,顾名思义,这是一种迭代的思想。通过不断地迭代,每次在前一次的计算结果之上再计算出新的变换矩阵,最终当迭代次数原创 2021-06-08 17:41:01 · 9739 阅读 · 4 评论 -
对点云添加高斯噪声并保存到本地(PCL 附C++代码)
代码#include <stdio.h>#include <stdlib.h>#include <pcl/point_types.h>#include <iostream>#include <pcl/io/ply_io.h>#include <pcl/io/pcd_io.h>#include <pcl/features/normal_3d.h>#include <pcl/visualization/cl原创 2020-11-25 18:31:24 · 1481 阅读 · 1 评论 -
如何将点云asc文件转换为pcd文件
在进行3D模型特征分析的时候,下载了一些3D模型,但是因为文件格式而受到了很多限制。这里提供一种简单的利用python程序将asc文件批量转换为pcd文件。代码如下:import timefrom sys import argvdef convert(filename): print('the input file name is :',filename) print(...原创 2019-03-19 20:00:19 · 2609 阅读 · 0 评论 -
QT+PCL配置过程(详细)
一、随便扯扯的概述(当故事看。。。。纯属话多) 经过短暂的但又痛苦而煎熬的大三阶段,参加了大大小小各种比赛,拿了各种奖项和著作权,终于保研到本校,结果让人有开心又不甘,但是我一向都既来之则安之。研究生阶段的导师比较年轻,要求严格,已经让我从现在开始跟着他做项目了,但我对计算机图形学方向一无所知,看了好几周的论文只看了两篇,都还没完全看懂,然后开始让我实现代码,所以我就开始了为期三天...原创 2018-12-04 17:26:28 · 18846 阅读 · 11 评论 -
3D网格模型边界检测(附Python完整代码)
一、概述近期有需求要对三维网格模型的边界进行检测提取,虽然在meshlab中可以直接显示出三维网格模型的边界,但是经过我各种摸索最后发现好像没有方法能够将显示出的边界信息保存下来,没办法,只能自己手写一个检测方法了。而恰好三维网格模型的边界检测非常简单,只需要根据其拓扑结构,找到只属于一个面的边即为边界。虽然实现出来了,但是在效率上比较低,对点数较多的模型,需要耗费较多的时间,只用几次,我也懒得优化了。二、代码没什么好说的,思想很简单,就是找到只属于一个面的边,把这条边包含的点标记为边界点即可。fi原创 2020-10-13 17:33:52 · 5799 阅读 · 2 评论 -
PCL提取3D点云模型特征(1.0 点云曲率)
一、随便扯扯的概述 在进入到计算机图形学的研究中已经过去了好几个月了,自然免不了要跟PCL打交道。在学习PCL的过程中,越来越觉得PCL真的是个非常强大的工具,让人爱不释手,但同时也让人感到沮丧,因为你会发现,你有的想去实现的想法PCL里面都早就实现了,并且效果还非常好。这里就我在学习提取点云特征的过程中遇到的一个PCL里面的一个非常简单并且基本的特征提取方法(利用PCL中的曲率...原创 2019-04-18 15:55:59 · 9503 阅读 · 10 评论 -
PCL提取3D点云模型特征(2.0 PFH点特征直方图 )附完整代码
一、概述之前在做本科毕业设计的时候,就用到了 PFH(Point Feature Histogram)和 FPFH(Fast Point Feature Histogram),这两个方法都是Rusu这个大佬提出来的。最开始他提出了PFH作为一个signature来描述点云邻域内的属性,利用这种性质来对点运做registration。但是PFH存在过多的冗余计算,导致效率很低,在此基础上,他又提出了FPFH来提升计算效率。在刚开始接触到这两个特征描述子之前,对这两个方法一无所知,在网上也找了很多资料和帖子,原创 2020-07-21 17:55:24 · 4229 阅读 · 5 评论 -
PCL提取3D点云模型特征(3.0 FPFH快速点特征直方图)附完整代码
一、概述上一篇博客解释了PFH是什么以及如何利用PFH来提取点云的特征,那么讲了PFH(PCL提取3D点云模型特征(2.0 PFH点特征直方图 )附完整代码)之后肯定是要接着说FPFH的。本来想着把FPFH的内容和PFH放在一起的,但是感觉如果放在一起写再加上最后的代码(毕竟每篇博客能加代码的我都会把代码贴出来,毕竟talk is cheap, show me your code嘛),就感觉一篇博客的内容就太多了,不仅写起来累,看起来也累,所以就分开吧。与PFH方法类似,在目前所有网上看到的资料中,都没原创 2020-07-22 15:52:32 · 5496 阅读 · 25 评论 -
Loop 细分曲面(loop subdivision)详解,附Python完整代码
一、概述在做完了 catmull−clarksubdivisioncatmull-clark\quad subdivisioncatmull−clarksubdivision 之后,紧接着继续做 loopsubdivisionloop\quad subdivisionloopsubdivision,但是跟之前一样,网上的帖子都是直接给出了各个控制点新增或更新时,所有相关点的权重,并没有给出具体过程是怎么做的,而且在做 looplooploop细分 的时候并没有像之前一样有完整的“保真代码”(能够体现出具体原创 2020-06-01 16:53:52 · 11576 阅读 · 5 评论 -
Catmull 细分曲面 (Catmull-Clark subdivision) 详解 附Python 完整代码
一、概述高级计算机三维建模课程最后需要提交一个大作业,比较Catmull-Clark细分曲面与Loop细分曲面算法。先把Catmull-Clark细分曲面弄懂了,这里做个记录。昨天一直在网上找Catmull-Clark细分曲面相关的解释教程,但是并没有找到比较详细的计算过程说明,只有一些简单的示意图,并不能帮助我很好的理解,说实话,并没有看懂。知道后来,发现了Catmull–Clark subdivision surface这个网页,里面有各种语言版本的Catmull-Clark细分曲面的实现代码,其中P原创 2020-06-01 16:52:25 · 16515 阅读 · 13 评论 -
OpenGL基于草图建模绘制羊角
一、概述高级计算机三维建模第五次小实习,基于给定基础代码,完成完整的羊角绘制。基础代码运行结果如下:这个终于稍微需要添加的代码多了些。二、绘制思想根据已有控制点,对每一个控制点每个一定角度绘制一个点,这样一圈再利用GL_LINES就能绘制出一个圈,然而,有了每个圈上的点,只需要将相邻圈上下各区两个点就能绘制出一个面。这样每层如此,就能绘制出完整的羊角了。三、绘制过程根据基础代码,获...原创 2020-03-23 21:55:04 · 795 阅读 · 0 评论 -
OpenGL绘制三叉树(真树,非数据结构)
一、概述高级计算机三维建模第四次小实习,基于给定基础代码,理解分形思想,将二叉树改成三叉树。基础代码结果如下:二、绘制过程很简单,只要在分形绘制过程中多个叉就行,随便将画笔旋转个方向即可。截止到第六次实习,实习内容都很简单,因为都不需要完全理解每一步的思想和实现方法,只需要找到应该添加代码的地方,添加几行代码达到效果就行,哎。。。没办法,我也很想从头到尾完完全全搞懂每一步,可身不由己啊,下...原创 2020-03-23 21:27:26 · 5187 阅读 · 0 评论 -
OpenGL绘制高脚杯
一、概述高级计算机三维建模第三次小实习,基于给定的基础代码,将原来的线性插值改成三次样条插值绘制线条,再绘制出完整的高脚杯曲面。初始代码效果如下:二、绘制过程将线性插值改成三次样条插值,即:这样得到的结果是一个三次样条曲线:肉眼看着和线性插值没什么区别。再将这个三次样条曲线绕Y轴旋转一周,就可得到曲面(但不是真正意义上的曲面),只每次绘制完成后将画笔的位置绕Y轴旋转一定角度(本...原创 2020-03-23 21:12:52 · 1166 阅读 · 0 评论 -
opengl绘制齿轮
1. 概述高级计算机三维建模第二次小实习,利用opengl在提供的基础代码上绘制完整的齿轮。绘制思路如下图:2. 注意事项对p0,p7,p6,p3p_0,p_7,p_6,p_3p0,p7,p6,p3这四点所组成的平面采取了三角形绘制的方式,绘制顺序为p7→p0→p6→p3p_7\rightarrow p_0\rightarrow p_6\rightarrow p_3p7→p0...原创 2020-03-16 21:38:06 · 1552 阅读 · 3 评论 -
Opengl绘制网格模型
一、概述高级计算机三维建模的课后实习代码托管及重点部分备注。这是第一次实习,题目是读取.ply文件内容,并利用opengl绘制出网格。目前为止,老师布置的4次实习作业都比较简单,这里只是做简要记录,毕竟刚入门。二、基本思想如图,为stanford bunny的文件内容首先,需要读取文件中vertex和face的数量,初始化数组,依次将点的位置坐标,以及每个三角面片对应的点的索引读入。实际...原创 2020-03-11 19:41:51 · 6349 阅读 · 5 评论 -
图像边缘检测的Sobel和Laplace算子和图像最近邻插值和双线性插值算法的Python实现(附完整代码)
1.概述计算机视觉课程要求实现一下图像边缘检测算法,但并没有明确要求实现哪种具体的算法,在网上看了相关图像边缘检测算子,都有非常具体的介绍,也有实现代码或者Python集成库里的代码,有的算子比较简单,很容易理解,例如Sobel、Laplace等,Sobel还有一系列延伸的算子,很相似,这些都还是比较简单的,还有一些稍微复杂点的算子,例如Canny,具体关于这些算法原理的介绍推荐去看深入学习Op...原创 2019-12-18 11:58:17 · 1377 阅读 · 0 评论 -
点云文件法线信息读取与处理
一、概述在对点云数据进行处理的过程中,由于自身计算法线算法的不完善,所以需要借助于meshlab来对点云数据进行预处理。之前最先知道,可以直接利用pcl的相关方法直接读取点云文件中的点坐标信息,但是如何读取带法线信息的点云文件却还是不太了解。可是在网上也查找了一些博客,都没有发现有相关读取带有法线信息的点云文件的解决方案(可能这个问题太简单,大家觉得没有必要吧,但我还是在这里记录一下这个小tip...原创 2019-09-02 10:23:32 · 2577 阅读 · 6 评论 -
深度图转换成点云
一、概述最近由于课题需要数据源,但是没有直接获取的方法,所以只能在周老师http://www.qianyi.info/的网站上自己下载深度图转换成点云数据,大概花了三点的时间,终于弄得差不多了,这里做个记录。二、数据准备和环境配置1、数据下载在 http://redwood-data.org/indoor/dataset.html 上下载Clean Depth Sequence和Groun...原创 2019-08-22 12:47:58 · 15406 阅读 · 17 评论