<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[McQueen_LT的博客]]></title><description><![CDATA[talk is cheap, show me your code!]]></description><link>https://blog.youkuaiyun.com/McQueen_LT</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; McQueen_LT]]></copyright><item><title><![CDATA[聊天室Python脚本——ChatGPT，好用]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/146047161</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/146047161</guid><author>McQueen_LT</author><pubDate>Wed, 05 Mar 2025 16:49:05 +0800</pubDate><description><![CDATA[不用安装第三方软件，简单方便，某些情况下很好用]]></description><category></category></item><item><title><![CDATA[A*寻路算法C++实现]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/145595727</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/145595727</guid><author>McQueen_LT</author><pubDate>Wed, 12 Feb 2025 16:45:24 +0800</pubDate><description><![CDATA[【代码】A*寻论算法C++实现。]]></description><category></category></item><item><title><![CDATA[3D点圆柱拟合]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/143592720</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/143592720</guid><author>McQueen_LT</author><pubDate>Thu, 07 Nov 2024 14:08:51 +0800</pubDate><description><![CDATA[【代码】3D点圆柱拟合。]]></description><category></category></item><item><title><![CDATA[多线程更新最大值]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/141070024</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/141070024</guid><author>McQueen_LT</author><pubDate>Fri, 09 Aug 2024 20:10:16 +0800</pubDate><description><![CDATA[有一张图像，很大，假设10000x10000，需要找其中的最大值和最小值，可以使用opencv的cv::minMaxLoc，但是对于这样的大图来说太慢了。可以多线程并行找。]]></description><category></category></item><item><title><![CDATA[圆拟合 --- 点到圆距离绝对值之和最小]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/135871874</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/135871874</guid><author>McQueen_LT</author><pubDate>Fri, 26 Jan 2024 17:51:54 +0800</pubDate><description><![CDATA[https://www.researchgate.net/publication/220146330_Robust_Fitting_of_Circle_Arcs 根据这篇文章介绍的算法进行了实现，经过验证结果与论文中结果一致。]]></description><category></category></item><item><title><![CDATA[CMake 编译并链接动态库]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/131327294</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/131327294</guid><author>McQueen_LT</author><pubDate>Wed, 21 Jun 2023 15:09:24 +0800</pubDate><description><![CDATA[需要把mmath子项目编译成动态链接库并被CMP.cpp调用注意：需要有否则编译出来没有 .lib 文件，因为没有函数被导出。]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---做一些好玩的东西03 动态绘制点云模型]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/120017129</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/120017129</guid><author>McQueen_LT</author><pubDate>Tue, 31 Aug 2021 14:46:53 +0800</pubDate><description><![CDATA[这次增加了一些键盘控制功能，通过 wasd 来控制 上下左右四个方向，通过x键来进行缩小，z键进行放大。大致思路就是通过注册一个键盘相应函数，来控制坐标和缩放因子，放大缩小只需要对坐标乘上缩放因子，上下左右平移只需要对坐标进行加减操作即可。然后通过uniform来将这些全局变量传入到顶点着色器中即可。
代码：
#include &lt;GL/glew.h&gt;
#include &lt;GLFW/glfw3.h&gt;
#include &lt;iostream&gt;
#include &lt;fstr]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---09 纹理（纹理单元可贴多个纹理）]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119648817</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119648817</guid><author>McQueen_LT</author><pubDate>Thu, 12 Aug 2021 17:18:57 +0800</pubDate><description><![CDATA[对之前画的矩形基础上贴上纹理。在片段着色器中，声明一个采样器，表示纹理位置，每个纹理位置叫做纹理单元，比如 0、1等，当只有一个纹理事时，纹理单元默认为0，当有一个以上的纹理时，则需要通过uniform从外部设置每个纹理单元的值。
需要注意的是，在一个以上的纹理绑定过程中，需要激活纹理单元的位置，然后进行绑定当前纹理。比如需要绑定第2个纹理时，需要先通过 glActiveTexture(GL_TEXTURE1)，来激活位置为 1 的纹理单元，然后再通过 glBindTexture()来绑定纹理对象。（第1个]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---做一些好玩的东西02 四个顶点同时闪烁的矩形]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119599863</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119599863</guid><author>McQueen_LT</author><pubDate>Wed, 11 Aug 2021 11:28:28 +0800</pubDate><description><![CDATA[之前做了两个同时闪烁的三角形，是通过两个vao对象分别绘制三角形达到闪烁的效果的。那么如果将顶点的颜色属性作为顶点着色器的输出并作为片段着色器的输入，那么就能够分别对每个顶点的颜色单独绘制了，这样就能够使得每个顶点的颜色都不一样。
那么如何使每个顶点闪烁起来呢？那么可以通过uniform来改变片段着色器中颜色变量中的某个值，比如只改变RGBA中的R值。
代码：
#include &lt;GL/glew.h&gt;
#include &lt;GLFW/glfw3.h&gt;
#include &lt;iost]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---08 顶点着色器与片段着色器间的通信]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119569929</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119569929</guid><author>McQueen_LT</author><pubDate>Tue, 10 Aug 2021 15:03:33 +0800</pubDate><description><![CDATA[一个顶点数据可能会包含多个属性，比如2维坐标和4维的颜色，那么一个顶点数据就有6个维度了。通过顶点着色器，将每个顶点的颜色传递到片段着色器中。
传递颜色时，现在顶点着色器中声明一个输出颜色变量，然后再在片段着色器中声明一个输入颜色变量，这两个颜色变量的类型要一致，变量名也要相同，这样着色器程序就能够默认将这两个变量认为是同一个变量，就可以进行不同着色器之间的通信了。
值得注意的是，在增加了顶点数组中的颜色属性的数据后，在后面创建vbo对象后复制顶点数据时，需要修改复制顶点数据的大小，同时在启用顶点属性指针时]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---做一些好玩的东西 01（绘制两个同时闪烁的三角形）]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119567466</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119567466</guid><author>McQueen_LT</author><pubDate>Tue, 10 Aug 2021 13:11:56 +0800</pubDate><description><![CDATA[在刚刚学习了现代OpenGL后，想做一些好玩的东西。这是第一个，想做两个三角形，然后这两个三角形的颜色会一直变化，就能达到闪烁的效果。

绘制两个不同颜色的三角形的话，首先应该将顶点的索引分成两个ibo对象，然后通过两个vao对象来进行绑定，而顶点数据vbo对象可以共用两个，只不过需要在两个vao对象上分别绑定一次；
不同颜色的三角形，则需要两个不同的片段着色器（疑问：能否只用同一个片段着色器达到两种不同的颜色？），然后分别在不同的FragmentShader中设置不同的颜色，然后在窗口循环中进行渲染时，分]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---07抽象化VertexBuffer和IndexBuffer]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119516474</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119516474</guid><author>McQueen_LT</author><pubDate>Sun, 08 Aug 2021 16:28:17 +0800</pubDate><description><![CDATA[这节课将原本在主函数中的对创建的VertexBuffer和IndexBuffer抽象成一个类，逐渐C++化。
值得注意的是，主函数中需要额外添加一对“{}”，来防止由GLCall()导致的死循环。
#include &lt;GL/glew.h&gt;
#include &lt;GLFW/glfw3.h&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---06 使用GLFW_OPENGL_CORE_PROFILE，绑定VertexArray]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119515149</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119515149</guid><author>McQueen_LT</author><pubDate>Sun, 08 Aug 2021 15:19:41 +0800</pubDate><description><![CDATA[在使用GLFW_OPENGL_COMPAT_PROFILE时，内部有一个默认的glBindVertexArray()过程，当在glfwWindowHinit()初始化时，使用了GLFW_OPENGL_CORE_PROFILE，则需要通过显示创建一个VertexArray（VAO），并将其绑定，绑定后，每当需要绘制这些vertices时，只需要绑定vao即可，不需要再绑定buffer和glEnableVetexAttribPointer()了，方便很多。
代码：
#include &lt;GL/glew.h&]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---05 使用uniform改变shader的颜色]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119513333</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119513333</guid><author>McQueen_LT</author><pubDate>Sun, 08 Aug 2021 12:57:43 +0800</pubDate><description><![CDATA[可以通过 glGetUniformLocation()获得指定着色器所在的location，然后使用glUniform4f() 为着色器中的颜色进行赋值或修改。
在while循环中利用glUnifor4f()修改颜色可实现动画。
#include &lt;GL/glew.h&gt;
#include &lt;GLFW/glfw3.h&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include ]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---04 OpenGL函数错误的处理]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119494662</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119494662</guid><author>McQueen_LT</author><pubDate>Sat, 07 Aug 2021 23:20:33 +0800</pubDate><description><![CDATA[在写opengl函数过程中，容易出现编译通过了，但是出来的窗口确实黑的，或者跟预期的不一样，那么就说明应该是某个函数出错了，其中默认类型转换就是最容易出现的错误，比如 GL_UNSIGNED_INT 被 错误的写成了 CL_INT，这样就会导致整个函数失效了。
可以通过宏定义来解决这个问题，就是通过定义一个宏函数，然后将每个gl函数都用这个宏函数调用，这样可以实现对每个函数进行检测是否出现了错误，并且在控制台打印出错的具体位置。另外，如果在调试模式下（F5），会直接在出错的地方break，能够直接定位到错误]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---03 绘制矩形（两个三角形）]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119493686</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119493686</guid><author>McQueen_LT</author><pubDate>Sat, 07 Aug 2021 22:06:12 +0800</pubDate><description><![CDATA[在 02 的基础上可以增添到6个顶点，来依次绘制6个顶点（2个三角形）可以得到一个四边形，但是其中有2个点是重复的，这样会浪费内存，所以可以通过创建一个 索引缓存（indices buffer）来存储position数组中需要绘制的点的索引顺序，然后将indices buffer与position一样绑定到GPU内存中。
代码
#include &lt;GL/glew.h&gt;
#include &lt;GLFW/glfw3.h&gt;
#include &lt;iostream&gt;
#include]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---02 着色器文件的处理（新建.shader文件）]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119491242</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119491242</guid><author>McQueen_LT</author><pubDate>Sat, 07 Aug 2021 19:12:03 +0800</pubDate><description><![CDATA[目录结构

代码
#include &lt;GL/glew.h&gt;
#include &lt;GLFW/glfw3.h&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;

struct ShaderProgramSource
{
	std::string VertexSource;
	std::string FragmentSouce;
};

s]]></description><category></category></item><item><title><![CDATA[Modern OpenGL---01 用顶点着色器和片段着色器绘制红色三角形]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119486740</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119486740</guid><author>McQueen_LT</author><pubDate>Sat, 07 Aug 2021 14:59:40 +0800</pubDate><description><![CDATA[代码：
#include &lt;GL/glew.h&gt;
#include &lt;GLFW/glfw3.h&gt;
#include &lt;iostream&gt;

static unsigned int CompiledShader(unsigned int type, const std::string &amp;source)
{
	unsigned int id = glCreateShader(type);								//创建一个着色器
	const char* src = sour]]></description><category></category></item><item><title><![CDATA[SLAM学习之路---深度图序列合成场景点云]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119144177</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119144177</guid><author>McQueen_LT</author><pubDate>Tue, 27 Jul 2021 16:57:27 +0800</pubDate><description><![CDATA[一、概述
上一篇博客绘制了相机的轨迹，那么有了相机轨迹之后能干什么呢？本篇博客将通过相机轨迹对点云进行拼接合成一个完整的室内场景。合成一个场景需要很多个点云，而这些点云则是通过深度相机扫描得到的一系列深度图序列转换得到的。
在 深度图转换成点云 这篇博客中，使用了 http://redwood-data.org/indoor/dataset.html 网站上的深度图转换成点云。下载了深度图序列文件和相机的轨迹文件，当时还不知道相机轨迹文件的作用是什么，看着网站上的介绍也是云里雾里的，后来过了很久才知道相机轨]]></description><category></category></item><item><title><![CDATA[SLAM学习之路---绘制相机轨迹]]></title><link>https://blog.youkuaiyun.com/McQueen_LT/article/details/119081569</link><guid>https://blog.youkuaiyun.com/McQueen_LT/article/details/119081569</guid><author>McQueen_LT</author><pubDate>Sun, 25 Jul 2021 14:43:35 +0800</pubDate><description><![CDATA[一、概述
相机轨迹指相机在运动过程中每一帧的相机位姿由第一帧的相机位姿通过刚体变换（旋转矩阵和平移向量组成一个4x4的变换矩阵）而得到的，而这一系列的变换矩阵则组成了该相机的运动轨迹。本篇文章通过学习《视觉SLAM十四讲》第二版第三讲来记录。
二、轨迹绘制思路


以第一帧对应的相机位姿为参考，可将第一帧位姿的原点设置为世界坐标系原点，第一帧的x轴为(1, 0, 0)，y轴为(0, 1, 0)，z轴为(0, 0, 1)。


从相机轨迹文件中得到每一帧的变换矩阵，从第二帧开始，每一帧的变换矩阵乘上第一帧的相]]></description><category></category></item></channel></rss>