如何使用opengl函数在c中制作用于绘制3D点的3D窗口?

2024-03-07

我可以制作 2D 窗口并绘制点、线等。我想制作 3D 窗口,以便可以通过绘制 3D 点/线来绘制 3D 对象(例如 glVertex3d(x,y,z))(如 2D glVertex2d(x ,y))。

但我无法制作 3D 窗口。我只想制作一个 3D 窗口,为我提供绘制 3D 点的平台。

我的 2D 窗口示例代码 -

#include<GL/gl.h>
#include<GL/glut.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double x_0 = -100;
double y_0 = -25;

double x_1 = 100;
double y_1 = -25;

double x_2 = 100;
double y_2 = 25;

double x_3 = -100;
double y_3 = 25;

void
drawRectangle()
{
    /* Clear the screen */
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glFlush();

    glBegin(GL_LINES);

    glVertex2d(x_0, y_0);
    glVertex2d(x_1, y_1);

    glVertex2d(x_1, y_1);
    glVertex2d(x_2, y_2);

    glVertex2d(x_2, y_2);
    glVertex2d(x_3, y_3);

    glVertex2d(x_3, y_3);
    glVertex2d(x_0, y_0);

    glEnd();
    glFlush();
}

void
init(void)
{
    /*initialize the x-y co-ordinate*/
    glClearColor(0,0,0,0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-320, 319,-240, 239);
    glClear(GL_COLOR_BUFFER_BIT);

    glFlush();
}

int
main(int argc, char *argv[])
{
    double x_0, y_0, x_1, y_1;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(400, 400);

    glutCreateWindow("Rectangle in 2D");
    init();
    drawRectangle();
    glutMainLoop();
}

我也尝试跟随,但没有显示该行。

#include<GL/gl.h>
#include<GL/glut.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

void
init(void)
{
    /*initialize the x-y co-ordinate*/
    glClearColor(0,0,0,0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-320, 319, -240, 239, 100, -150);
    glClear(GL_COLOR_BUFFER_BIT);

    glFlush();
}

int
main(int argc, char *argv[])
{
    double x_0, y_0, x_1, y_1;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(400, 400);

    glutCreateWindow("Special key");
    init();

    glBegin(GL_LINES);
    glVertex3d(0,0,0);
    glVertex3d(0,0,100);
    glVertex3d(0,100,0);
    glVertex3d(0,100,0);
    glEnd();
    glFlush();

    glutMainLoop();
}

Edit
gluOrtho2D更新为glOrtho在上面的MWE中。


  • 您可以使用gluPerspective() (or glFrustum()) 建立透视投影矩阵
  • And gluLookAt()将“相机”移离原点,这样你就可以看到你画的东西
  • 以及一些基于计时器的动画,以便您可以看到实际的视角
  • 双缓冲是因为GLUT_SINGLE在现代复合窗口管理器上有时很奇怪

全部一起:

#include <GL/glut.h>

double rnd( double lo, double hi )
{
    return lo + ( hi - lo ) * ( rand() / static_cast<double>( RAND_MAX ) );
}

double angle = 0.0;
void timer( int value )
{
    angle += 1.0;
    glutTimerFunc( 16, timer, 0 );
    glutPostRedisplay();
}

void display()
{
    glClearColor( 0, 0, 0, 0 );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    gluPerspective( 60.0, w / h, 0.1, 1000.0 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    gluLookAt( 100, 100, 100, 0, 0, 0, 0, 0, 1 );

    glRotated( angle, 0, 0, 1 );

    srand( 0 );
    glBegin( GL_LINES );
    for( size_t i = 0; i < 100; i++ )
    {
        glColor3d( rnd( 0.0, 1.0 ), rnd( 0.0, 1.0 ), rnd( 0.0, 1.0 ) );
        glVertex3d( rnd( -50, 50 ), rnd( -50, 50 ), rnd( -50, 50 ) );
        glVertex3d( rnd( -50, 50 ), rnd( -50, 50 ), rnd( -50, 50 ) );
    }
    glEnd();

    glutSwapBuffers();
}

int main( int argc, char *argv[] )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "Special key" );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用opengl函数在c中制作用于绘制3D点的3D窗口? 的相关文章

  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构

随机推荐

  • 如何保护 phpMyAdmin

    我注意到我的网站有一些奇怪的请求试图找到 phpmyadmin 例如 phpmyadmin pma etc 现在我已经通过 apt 在 Ubuntu 上安装了 PMA 并且想通过不同于 phpmyadmin 的网址访问它 我可以做什么来改变
  • Jenkins 中的条件构建后步骤(理想情况下没有插件)

    如果我理解正确的话 我可以使用这个插件来设置构建步骤的条件 https wiki jenkins ci org display JENKINS Conditional BuildStep Plugin https wiki jenkins
  • 如何计算到达某一天的剩余时间(天、小时、分钟、秒)?

    我在用Moment js https momentjs com docs displaying fromnow 检索下周五 moment day 5 format 成功运行并打印2020 06 26T13 19 01 04 00到控制台 现
  • 用于从另一个测试结果生成 JUnit 报告的 Python 脚本

    我有一个验收测试用例 结果是纯文本 我想使用Jenkins来显示结果 JUnit格式适合我 所以我想检查是否有现有的Python代码来生成JUnit格式的XML 这样我就可以轻松地添加我的解析代码 相关问题 https stackoverf
  • SQL - 查找 ADAM GRANT 出演的所有电影的电影标题和语言名称

    我在用 SQL 来思考这样的问题时遇到了很多麻烦 我不知道应该如何构建我的查询 我应该加入吗film on film actor然后加入actor 或者我应该反过来做 我所能做的就是获取一个连接的查询actor and film actor
  • 页面未正确重定向 - HTTPS HTACCESS 重写错误

    我有以下 htaccess 重写规则 规则 1 导致无限循环错误 我正在尝试将所有请求重定向到 HTTPS 但它不起作用 由于规则 1 规则 2 也被阻止 当我评论规则1时一切都很好 如果我更改顺序也会发生此无限循环错误 请帮助我如何解决这
  • GDI+ / C#:如何将图像另存为 EMF?

    如果您使用 Image Save 方法将图像保存到 EMF WMF 则会出现异常 http msdn microsoft com en us library ktx83wah aspx http msdn microsoft com en
  • 如何将 valgrind 与 Python C++ 扩展一起使用?

    我在 C 类上实现了 Python 扩展 我没有用于运行 valgrind 的 C 目标 我想使用 valgrind 进行内存检查 我可以将 valgrind 与 Python 一起使用吗 是的 您可以使用valgrind使用Python
  • viewDidUnload 中有效的内容应该移至 didReceiveMemoryWarning 吗?

    在新的 iOS 6 中 viewDidUnload已弃用 我们已被指示使用didReceiveMemoryWarning相反 管理 UIViewController 实例和子类中的对象 将 nils 分配给内部的 UIView 类型是否同样
  • Angular AOT 组件中的相对路径

    我在这里问是因为我在网上找不到完整的文档 这个例子here https angular io docs ts latest cookbook aot compiler html太简单了 我有一个包含多个组件和一些模块的应用程序 用ngc编译
  • 在 IIS 5.1 (Windows XP) 上部署 ASP.NET MVC

    好吧 部署 ASP NET MVC 似乎很痛苦 我想在 Windows XP IIS 5 1 上部署 ASP NET MVC 应用程序 但似乎找不到如何执行此操作 当我在网络浏览器地址栏中输入应用程序名称时 我收到一条 网站不可用 消息 有
  • ES6数组初始化

    ES6 非常新 在 ES5 中我可能会做这样的事情 function newArray var data for var i 0 i lt 5 i data i test data i return data x newArray 在 ES
  • Tensorflow 中的反向传播(随时间)代码

    在哪里可以找到 Tensorflow python API 中的反向传播 通过时间 代码 或者使用其他算法 例如 当我创建 LSTM 网络时 TensorFlow 中的所有反向传播都是通过自动区分网络前向传递中的操作 并添加显式操作来计算网
  • 在 Android 版 PhoneGap 上捕获返回按键

    我正在使用 PhoneGap 进行 Android 应用程序开发 但我一直在捕获设备上的后退键按下 我尝试了其他线程和官方维基页面中的所有内容 但似乎都不起作用 我可以使用 keyEvent menuTrigger 和 keyEvent s
  • 如何以编程方式读取 PDF 书签

    我正在使用 PDF 转换器来访问 PDF 中的图形数据 一切工作正常 除了我没有得到书签列表 是否有可以读取 PDF 书签的命令行应用程序或 C 组件 我找到了 iText 和 SharpPDF 库 目前正在浏览它们 你曾经做过这样的事吗
  • 是否可以使用 stdout 作为 fluidd 源来捕获特定日志以写入elasticsearch?

    我对 fluidd 和 elasticsearch 都是菜鸟 我想知道 fluidd 是否可以从 stdout 捕获特定日志 在本例中为我们的应用程序生成的自定义审核日志 使用 stdout 作为源 并将它们写入到elasticsearch
  • 合并两个具有相同键的字典

    我有以下 2 本字典想要合并 我想合并相同的键 并且我想保留两个字典的值 我用了dict1 update dict2 但这替换了第二个到第一个字典中的值 u dict1 160 u na u na 162 u test u qq u wds
  • Kitkat (API 19) 中使用 setGroup() 的堆栈通知不起作用

    我有一个问题找不到答案 我已经尝试过 AndroidDeveloper 教程 我已经在 stackoverflow 和 google 上进行了搜索 但要么我的搜索技能太棒了 要么没有答案 我认为可以回答我的问题 当有多条消息时 我想将所有新
  • 当计时器触发作业时,如何在 Jenkins 中获取 BUILD_USER?

    我想在工作后电子邮件中向触发 Jenkins 工作的用户显示 这可以通过使用插件来实现构建用户变量插件和环境变量BUILD USER 但是当调度程序触发作业时 该变量不会被初始化 我们怎样才能做到这一点 我知道我们有一个名为 EnvInje
  • 如何使用opengl函数在c中制作用于绘制3D点的3D窗口?

    我可以制作 2D 窗口并绘制点 线等 我想制作 3D 窗口 以便可以通过绘制 3D 点 线来绘制 3D 对象 例如 glVertex3d x y z 如 2D glVertex2d x y 但我无法制作 3D 窗口 我只想制作一个 3D 窗