glMultMatrix 在 glBegin() 内部不起作用

2023-11-29

我正在创建一个程序,允许我在 3 个空间中绘制点,使用 Catmull-Rom 样条线连接它们,然后在样条线周围绘制一个圆柱体。我在用GL_TRIANGLES_STRIP以短间隔连接围绕样条线绘制的点的圆圈,希望将它们全部连接在一起形成围绕样条线的圆柱体。

我已经成功地在这些间隔处绘制了完整的点圆,使用GL_POINTS,并将它们正确定向到 Frenet 框架的线。不幸的是,要使用GL_TRIANGLE_STRIP,我相信我需要在一组两个圆点之间一次绘制一个点。

我遇到的问题是glMultMatrix在里面时似乎不起作用glBegin。下面的代码将绘制一个由点组成的圆,但在原点处,并且glMultMatrix,我用它来平移和定位点的圆,在内部时似乎不适用glbegin。有针对这个的解决方法吗?

  //The matrixes that are applied to the circle of points
  GLfloat M1[16]={
    N1.x(),N1.y(),N1.z(),0,
    B1.x(),B1.y(),B1.z(),0,
    T1.x(),T1.y(),T1.z(),0,
    fromPoint->x,fromPoint->y,fromPoint->z,1
  };

  GLfloat M2[16]={
    N2.x(),N2.y(),N2.z(),0,
    B2.x(),B2.y(),B2.z(),0,
    T2.x(),T2.y(),T2.z(),0,
    toPoint->x,toPoint->y,toPoint->z,1
  };

  glBegin(GL_TRIANGLE_STRIP);
  GLfloat x, y;
  GLfloat radius = 0.4f;
  GLint pointCount = 180;
  for (GLfloat theta = 0; theta < 2*M_PI; theta += (2*M_PI)/pointCount) {
    x = radius * cos(theta);
    y = radius * sin(theta);

    // Now push a matrix, multiply it, draw a point and pop the matrix
    glPushMatrix();
    glMultMatrixf(& M1[0]);
    // Draw the point here
    glVertex3f(x, y, 0);
    glPopMatrix();

    // Do the same again for the second section
    glPushMatrix();
    glMultMatrixf(& M2[0]);
    glVertex3f(x, y, 0);
    glPopMatrix();
  }
  glEnd();

我遇到的问题是 glMultMatrix 在 glBegin 内部时似乎不起作用

不足为奇:

在 glBegin 和 glEnd 之间只能使用 GL 命令的子集。 命令是 顶点顶点, 颜色, glSecondaryColor, 全局索引, gl正常, glFogCoord, glTexCoord, glMultiTexCoord, glVertexAttrib, glEvalCoord, glEvalPoint, glArrayElement, gl材质,和 glEdgeFlag。 还, 可以接受使用 glCallList 或 glCallLists 执行 显示仅包含上述命令的列表。如果在 glBegin 和 glEnd 之间执行任何其他 GL 命令, 错误标志被设置并且命令被忽略。

glMultMatrix() before glBegin():

//The matrixes that are applied to the circle of points
GLfloat M1[16]=
{
    N1.x(),N1.y(),N1.z(),0,
    B1.x(),B1.y(),B1.z(),0,
    T1.x(),T1.y(),T1.z(),0,
    fromPoint->x,fromPoint->y,fromPoint->z,1
};

GLfloat M2[16]=
{
    N2.x(),N2.y(),N2.z(),0,
    B2.x(),B2.y(),B2.z(),0,
    T2.x(),T2.y(),T2.z(),0,
    toPoint->x,toPoint->y,toPoint->z,1
};

GLfloat x, y;
GLfloat radius = 0.4f;
GLint pointCount = 180;
for (GLfloat theta = 0; theta < 2*M_PI; theta += (2*M_PI)/pointCount) 
{
    x = radius * cos(theta);
    y = radius * sin(theta);

    // Now push a matrix, multiply it, draw a point and pop the matrix
    glPushMatrix();
    glMultMatrixf(& M1[0]);
    // Draw the point here
    glBegin(GL_POINTS);
    glVertex3f(x, y, 0);
    glEnd();
    glPopMatrix();

    // Do the same again for the second section
    glPushMatrix();
    glMultMatrixf(& M2[0]);
    glBegin(GL_POINTS);
    glVertex3f(x, y, 0);
    glEnd();
    glPopMatrix();
}

或者在客户端应用变换并交给 OpenGL 一大块顶点来一次性渲染。

EDIT:或者将这些矩阵乘法完全拉到循环之外:

GLfloat x, y;
GLfloat radius = 0.4f;
GLint pointCount = 180;

glPushMatrix();
glMultMatrixf(& M1[0]);
glBegin(GL_POINTS);
for (GLfloat theta = 0; theta < 2*M_PI; theta += (2*M_PI)/pointCount) 
{
    x = radius * cos(theta);
    y = radius * sin(theta);

    // Draw the point here
    glVertex3f(x, y, 0);
}
glEnd();
glPopMatrix();

glPushMatrix();
glMultMatrixf(& M2[0]);
glBegin(GL_POINTS);
for (GLfloat theta = 0; theta < 2*M_PI; theta += (2*M_PI)/pointCount) 
{
    x = radius * cos(theta);
    y = radius * sin(theta);

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

glMultMatrix 在 glBegin() 内部不起作用 的相关文章

随机推荐

  • Py2exe ImportError:没有名为 shell 的模块

    我的代码是 from win32com shell import shellcon from win32com shell shell import ShellExecuteEx 它在 IDLE 中工作正常 但在我生成 exe 后出现错误
  • pip 配置了需要 TLS/SSL 的位置,但是 Python 中的 ssl 模块不可用

    我正在使用Python 3 6 当我尝试使用安装 模块 时pip3 我面临这个问题 pip is configured with locations that require TLS SSL however the ssl module i
  • 如何制作动画信使

    我想创建一个信使组件 当调用该函数时 它将创建一条消息 并且在按下或通过计时器时 首先使其透明 gt 之后 平滑地降低包装器的高度 gt 并且过渡结束后 删除对象 我怎样才能做到这一点 我的代码无法正常工作
  • Rest WebService 错误处理

    我使用 RestWebservice 进行一些基本操作 例如创建 搜索 请求 xml 看起来像这样
  • 矩阵中的最小成本路径

    问题 给定一个充满非负数的 m x n 网格 找到一条从左上角到右下角的路径 该路径最小化沿其路径的所有数字的总和 注意 在任何时间点您只能向下或向右移动 我知道这是一个常见问题 大多数人都知道这个问题及其动态规划 我在这里尝试递归代码 但
  • CSS 在移动浏览器中不起作用

    http mpkosis28 com 28cup 从笔记本电脑或台式机上查看时 该网站看起来很完美 但是当我尝试通过手机访问它时 它无法识别网站中的 css 文件 只加载 html 部分 阅读其他类似的问题 但他们似乎没有和我遇到同样的问题
  • Java String 上哈希码溢出的后果

    我最近在这里阅读了一些有关 Java String 类的哈希码的信息 但我一直无法找到此信息 当字符串的长度高于 32 时会发生什么 我知道会发生溢出 但作为哈希键 会发生什么 例如 我需要对长度在 20 到 120 个字符之间的字符串进行
  • .htaccess 中的 CodeIgniter 查询字符串重写

    当我第一次启动我的网站时 URL 采用以下格式 project php projectID 1 pageID 2 几年前 我修改了 htaccess 以重写它们以使用段 如下所示 project 1 2 我更新了所有内部链接以使用分段格式
  • 删除 Vuetify 中默认的 v-input-file 图标

    v file input是 Vuetify v2 中出现的新组件
  • 以编程方式切换键盘配置文件

    有什么方法可以让我们以编程方式切换已安装的键盘 无需手动进入设置部分 我的要求是向用户展示手机上安装的所有键盘 并获得一个选择器对话框以切换到想要的键盘 基本上我们想减少把他转移到设置页面的步骤 这段代码将满足您的要求 InputMetho
  • 为什么 Heroku 的 heroku-18 堆栈仅与 Puma 版本 3.7.x 兼容?

    通过反复试验 我确定从 Heroku 升级heroku 16堆叠到heroku 18stack 需要我在 Rails 应用程序中更新 Puma 下面是为 puma gem 构建本机扩展的失败 您能解释一下为什么 v3 7 之前的 puma
  • 将 tar/gzip 添加到 Windows 命令行

    正如标题所说 有人知道将 tar gzip 添加到 Windows 命令行的方法吗 我已经安装了 Cygwin 但不知道是否必须在 PATH 环境变量中添加一些内容才能将 tar 作为 cmd 选项 我用来解决这个问题的方法是安装 Cygw
  • 绘制矩形并填充外部边界

    我正在绘制一个矩形 并在矩形外部填充 我尝试了其中一些 但无法得到我所期望的完美的 这正是我所期望的 我试过 Point pTopLeft new Point Point pBotRight new Point pTopLeft x 100
  • PHP 标头重定向到具有时间间隔的多个 URL

    我可以使用 header 重定向到多个具有时间间隔的 URL 吗 假设我有 url1 和 url2 现在 我想要的是标头首先重定向到 url1 然后说 5 秒后 它会将我重定向到 url2 我有办法做到这一点吗 我尝试了下面的简单代码 但这
  • CarrierWave 和正确的文件扩展名取决于其内容

    如何使 CarrierWave 根据文件名添加正确的扩展名 其内容 例如 如果我上传文件 logo PNG文件 不带扩展名 CarrierWave 应将其保存为 logo png 文件 img gif 扩展名不正确的JPG文件 应分别保存为
  • 将向量插入矩阵的特定列

    如何将向量 b 插入到矩阵的 col 列中 我在 Fortran 中找不到插入或附加函数的任何语法 到目前为止 我所做的只是重新分配列中的值 但我只想插入向量 real M n n integer n col real b n M n co
  • Objective-C 2.0 和快速枚举抛出异常

    我有一个类似于以下内容的代码块 for NSDictionary tmp in aCollection if bar valueForKey id isEqualToString tmp valueForKey id break else
  • Mobile Jquery - 翻转效果

    请找到下面的网址 http jquerymobile com demos 1 1 0 docs pages page transitions html 如何在页面加载或 document onReady 上使用这些效果 在标准页面上从 jQ
  • 并发 HttpWebRequest 的限制

    NET 一次允许的并发 HttpWebRequest 数量是否有限制 我不确定overall限制 但是单个主机名的并发连接数肯定是有限制的 它可以配置在
  • glMultMatrix 在 glBegin() 内部不起作用

    我正在创建一个程序 允许我在 3 个空间中绘制点 使用 Catmull Rom 样条线连接它们 然后在样条线周围绘制一个圆柱体 我在用GL TRIANGLES STRIP以短间隔连接围绕样条线绘制的点的圆圈 希望将它们全部连接在一起形成围绕