opengl实现bezier、b曲线和曲面,16个控制点的4*4bezier块;最后可以看到茶壶teapot的实现

2023-10-31

1、你的工程可能还不能跑起来,一般的错误按照网页修改就可以了

可是还是会有个bug  。Error6error C2039: 'exit' : is not a member of '`global namespace,

解决方法,a这是编译器的问题,有时候看人品,所以可以换一个低版本的编译器  b直接把sstdlib中的using ::exit;直接隐掉;

                c添加#include“windows.h”中,放在这个cpp的第一行,

接着调试过去之后,就可以按照bug提示添加.h和.cpp。

教你在vc中命令行调试;打开vc,project->propreties之后;


 

在command Arguments 输入命令行即可;

2,添加完之后,现在可以画线了实现paint函数;

画线的步骤,我是这样做的,在spline里实现画点,在curve中实现画直线,在对应的bspline或bezierspline中实现画曲线;这是一个继承关系,C++的多态性质,你知道的;当然你还可以直接在bspline或bezierspline中直接实现paint();这个过程你还要考虑在那保存点和点的数量最好在spline类里面实现;

画线还是比较简单的,就是实现一个paint函数,可能你已经做出来四个控制点的曲线,那么多个控制点的,也就简单了

3实现Bezier曲线和BSplines曲线之间的转换

 Q(t) = Gbezier  Bbezier   T = Gbspline  Bbspline   T

例如;bezier 转b

这主要根据同样的曲线,去求另外同样曲线的控制点,这就要矩阵的运算了(T可以约去了,你知道吧,不知道看看线代)

Gbezier  bezier控制点矩阵 ;

而 Bbezier 、 Bbspline  是已经知道的;

那么你就可以求Gbspline ( b控制点矩阵了吧)

这简单的矩阵运算你会的

求的了控制点,画线你会吧,1中做过了。至于>4个控制点的,自己弄去吧

3,为了添加删除点,接着实现moveControlPoint(...), addControlPoint(...) 和 deleteControlPoint(...)函数来完成曲线编辑器

这比较简单,不说了

4旋转曲面实现,这时你需要实现OutputTriangles(...),在哪里实现,在对应的曲线,这里你会使用到TriangleNet类

里面的参数什么意思呢?这个是个问题,我也纠结了,不过我纠结了,你就不用纠结了;呵呵

 _u_tess代表了旋转的次数( -revolution_tessellation) ; _v_tess,旋转面的分割的个数(-curve_tessellation <n>,这里-curve_tessellation <n>的值可以直接使用吗?当然是不可以的,你要思考,算了我告诉你吧;比如是bezier,7个点控制的,那样就可以画2条bezier曲线,如果-curve_tessellation <n>=4,那样 _v_tess= ((7/4)+1)*4;你懂了吧)

5实现4*4的Bezier块,这个有了第四步的经验你就很好做了,先给你个公式;

  

 

公式都给了,会求点了吧

P代表了控制点,有了这个公式u、v都是从0到1变化的,怎么变和-patch_tessellation <n>有关的,假如-patch_tessellation <n>=4,那就是bezier分为4段,就是要5个点,这样就会计算出25个点了。

这些工作都做完了,好了你就可以看到teapot了,这是mit,图形学作业8。

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

opengl实现bezier、b曲线和曲面,16个控制点的4*4bezier块;最后可以看到茶壶teapot的实现 的相关文章

  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • OpenGL中背景对象绘制在前景对象前面?

    为了测试目的 我们假设我画了 2 个茶壶glutSolidTeapot 像这样 glColor3f 1 0f 0 0f 0 0f Red teapot glutWireTeapot 1 0f glColor3f 0 0f 1 0f 0 0f
  • GLSL聚光投影体积

    在我的开源项目中 我使用 Qt3D 设置了延迟渲染管道 到目前为止一切顺利 但现在我想通过添加聚光灯投影量来继续前进 例如场景中好像有烟雾 像这样 我正在使用的片段着色器位于问题的末尾 我读过 对于每个片段 我应该从光位置进行光线行进并找到
  • matplotlib:渲染到缓冲区/访问像素数据

    我想使用 matplotlib 生成的图作为 OpenGL 中的纹理 到目前为止 我遇到的 matplotlib 的 OpenGL 后端要么不成熟 要么已经停止使用 所以我想避免使用它们 我当前的方法是将图形保存到临时 png 文件中 并从
  • 从批处理文件中获取java版本

    如何获取java版本并希望从批处理文件中获取java版本中的 6 我尝试了下面的脚本 但没有成功 REM check java exists using JAVA HOME system variable if JAVA HOME ECHO
  • 如何在多采样纹理上渲染帧缓冲区对象?

    我目前有一个使用多个通道的渲染引擎 其中图像的各个部分在纹理上渲染 然后使用着色器进行组合 它有效 现在我想激活多重采样 我在这里读到 http www opengl org wiki Framebuffer Object Examples
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • gnuplot:第 1 行:无效命令

    stackoverflow 上可爱的人们大家好 我正在尝试使用 gnuplot 绘制数据 我首先阅读表格并提取我想要的数据 我将此数据写入 dat 文件 截至目前 我只是尝试通过命令行绘制它 但会添加必要的代码以在 python 脚本工作后
  • OpenSceneGraph 将相机设置在初始位置

    我是第一次使用 OpenSceneGraph 我有点迷失 因为文档确实不太清楚 所以 我有这段代码加载一个带有房子的 obj 文件 并且我在我想要的 人 所在的地方淹没了一个小盒子 所以现在 我不想把那个盒子放在那里 而是想把相机放在那里
  • Windows 上的 OpenGL SDK

    我正在尝试编写一个 OpenGL 应用程序 因此我安装了 Windows 7 SDK 然而 它似乎是OpenGL 1 1 define GL VERSION 1 1 1 如何找到我安装的 OpenGL 版本 dll 以及在哪里可以找到较新的
  • OpenGL纹理渲染与原始不匹配

    我正在尝试使用 OpenGL 渲染纹理 我用作测试的纹理是白色背景上的一堆黑色矩形 如下所示 然而 在渲染时 纹理似乎被复制并叠加在其自身之上多次 我使用以下方法设置场景 std string vertexSource ShaderLoad
  • 进行亚像素平移时,2D 纹理会扭曲

    我想知道一个理论推理为什么这是可能的 几何体的平移与纹理映射有何关系 我只能在进行子像素平移时注意到这种效果 如果通过整个像素平移 纹理看起来很好 我正在使用正交投影 GL CLAMP TO EDGE GL NEAREST 片段着色器是hi
  • 开启TK onRenderFrame和onUpdateFrame的区别?

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • 如何使用OpenGL数组纹理?

    我正在尝试在OpenGL中使用精灵表 通过数组纹理实现它这就是我加载纹理的方式 QImage image image load C QtProjects project images spritesheet png png const un
  • Android 对 Runtime.getRuntime().exec() 的权限

    我有一个应用程序在清单上具有以下权限 我的应用程序在 Android JB 4 1 2 上运行 UPDATE 我尝试在 JB 上运行该应用程序 但它不起作用 它适用于早期的 API 版本
  • GLSL memoryBarrierShared() 有用吗?

    我想知道 memoryBarrierShared 的用处 事实上 当我查找屏障功能的文档时 我读到 对于计算着色器中任何给定的静态屏障实例 单个工作组内的所有调用都必须进入该实例 然后才能允许任何调用继续超出该实例 这确保了在给定的屏障静态
  • OpenGL/GLSL - 纹理过滤的实现

    我想在 GLSL 着色器中自己实现纹理过滤 min 和 magfilter 因为我想使用 image load and store 而不是采样器 而且我想以特殊方式处理未定义的像素 并且我正在寻找一篇文章或者这样讨论过滤过程 我记得如何从我
  • 3D 图形批处理

    很多网站 文章都说 批量 批 批 有人可以解释一下着色器中的 批处理 代表什么吗 即 是否 改变纹理 更改任意着色器变量 意味着某些东西不能 批处理 最简单的总结方法就是尝试尽可能少地调用 API 来绘制您需要绘制的内容 使用顶点数组或 V
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐