tags: FLTK C++ Tips

写在前面

最近想捡起来之前曾经浅尝辄止的一个C++图形库FLTK, 一些简单的项目做起来还是很趁手的, 但是到了OpenGL这里就显得有点复杂了, 由于对cmake并不是很熟悉, 遇到奇奇怪怪的连接找不到的问题只能请教Stack Overflow以及官方文档1, 终于得到了解决^_^.

配置方法

一开始还天真的以为需要安装额外的glew, glfw等brew中的库, 后来发现系统中自带了OpenGL, 直接调用就行. 至于fltk,直接一行命令完事.

brew install fltk

目前最新版本为1.3.8.

下面是调用OpenGL的方法, 在cmakelists里面写入:

CMAKE_MINIMUM_REQUIRED(VERSION 3.1)PROJECT(test)FIND_PACKAGE(FLTK REQUIRED)
FIND_PACKAGE(OpenGL REQUIRED)include_directories("/opt/homebrew/include")
link_directories("/opt/homebrew/lib")link_libraries("fltk")
link_libraries("Xext")
link_libraries("X11")
link_libraries("m")# 添加可执行程序
ADD_EXECUTABLE(test src/main.cppsrc/MyWindow.cppsrc/MyWindow.h)TARGET_LINK_LIBRARIES(test ${FLTK_LIBRARIES})
TARGET_LINK_LIBRARIES(test ${OPENGL_LIBRARIES})

下面是测试程序,参考了cs447/547计算机图形学的课程代码2,源码文件结构如下:

├── CMakeLists.txt
└── src├── MyWindow.cpp├── MyWindow.h└── main.cpp

main.cpp:


#include <Fl/Fl.H>
#include "MyWindow.h"int main(int argc, char** args)
{MyWindow myWindow(400, 400, "CS447 Tutorial");myWindow.show();Fl::run();return 0;
}

MyWindow.h:

#ifndef MY_WINDOW_H
#define MY_WINDOW_H#include <Fl/Fl_Gl_Window.h>class MyWindow : public Fl_Gl_Window
{public:MyWindow(int width, int height, const char* title);virtual ~MyWindow();void InitializeGL();virtual void draw();void DrawCube();
};#endif

MyWindow.cpp:


#include <Fl/Gl.h>
#include <Fl/Glu.h> // 这里原文件采用的是`Gl/Glu.h`, 在MacOS中不能编译通过
#include "MyWindow.h"MyWindow::MyWindow(int width, int height, const char* title) : Fl_Gl_Window(width, height, title)
{mode(FL_RGB | FL_ALPHA | FL_DEPTH | FL_DOUBLE);
}MyWindow::~MyWindow()
{}void MyWindow::InitializeGL()
{glClearColor(.1f, .1f, .1f, 1);glEnable(GL_DEPTH_TEST);
}void MyWindow::draw()
{static bool firstTime = true;if (firstTime){InitializeGL();firstTime = false;}// ifglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);      // clear the color and depth buffer// view transformationsglMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1, 1, -1, 1, 1, 100);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0, 0, 3, 0, 0, 0, 0, 1, 0);// draw somethingDrawCube();
}void MyWindow::DrawCube()
{glBegin(GL_QUADS);// frontglColor3f(1, 0, 0);glVertex3f(-1, 1, 1);glVertex3f(-1, -1, 1);glVertex3f(1, -1, 1);glVertex3f(1, 1, 1);// backglColor3f(0, 1, 0);glVertex3f(-1, 1, -1);glVertex3f(1, 1, -1);glVertex3f(1, -1, -1);glVertex3f(-1, -1, -1);// topglColor3f(0, 0, 1);glVertex3f(-1, 1, -1);glVertex3f(-1, 1, 1);glVertex3f(1, 1, 1);glVertex3f(1, 1, -1);// bottomglColor3f(1, 1, 0);glVertex3f(-1, -1, -1);glVertex3f(1, -1, -1);glVertex3f(1, -1, 1);glVertex3f(-1, -1, 1);// leftglColor3f(0, 1, 1);glVertex3f(-1, 1, -1);glVertex3f(-1, -1, -1);glVertex3f(-1, -1, 1);glVertex3f(-1, 1, 1);// rightglColor3f(1, 0, 1);glVertex3f(1, 1, 1);glVertex3f(1, -1, 1);glVertex3f(1, -1, -1);glVertex3f(1, 1, -1);glEnd();
}

最后运行, 可以得到下面的图形, 还是不错的.


  1. Article #834: Using CMake to build an FLTK application - Fast Light Toolkit (FLTK); ↩︎

  2. OpenGL in FLTK (pdx.edu); ↩︎

在FLTK中使用OpenGL的正确姿势(MacOS)相关推荐

  1. word流程图擦除_word画流程图 Word中绘制流程图的正确姿势,这招大多数人不知道...

    如何在Word中绘制流程图?相信这个问题,许多人都知道,大多数人也都会.不过,还是有大多数人使用的方法却不是正确的方法.所以,今天小编就来为大家讲一下如何正确的绘制流程图.用正确的方法绘制流程图,事半 ...

  2. 渗透测试中使用浏览器的正确姿势

    渗透的时候使用得最多的就是浏览器和burp了,灵活使用浏览器可以使渗透的效率大大提高,这次就分享下我平时用浏览器的一些技巧. 1. 浏览器的选择 首选chrome浏览器,火狐浏览器为辅. mac的话还 ...

  3. import引入json文件_关于TypeScript中import JSON的正确姿势详解

    前言 Typescript是微软内部出品的,用actionscript的语法在写js的一门新语言,最近 TypeScript 中毒,想想我一个弱类型出身的人,怎么就喜欢上了类型约束--当然这不是重点, ...

  4. Intellij IDEA中使用Protobuf的正确姿势

    一..proto文件语法高亮显示 需要安装Protobuf Support插件 依次点击Intellij中的"File"-->"Settings"--&g ...

  5. 这才是JAVA中打印日志的正确姿势

    作者:lrwin 原文链接:http://t.cn/E9BkD7a 使用slf4j 1. 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一 2. 实现方式统一使用: Logback框架 打 ...

  6. java logger使用_这才是JAVA中打印日志的正确姿势

    作者:lrwin 原文链接:http://t.cn/E9BkD7a 使用slf4j 1. 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一 2. 实现方式统一使用: Logback框架 打 ...

  7. 删除list集合中特定元素的正确姿势

    背景 如何删除一个集合对象中的特定元素?小问题,但并不简单. 常见异常: ConcurrentModificationException java.util.ConcurrentModificatio ...

  8. boot spring 怎么执行hql_spring-boot 中使用graphql的正确姿势

    在spring-boot中使用graphql 首先构建spring-boot项目,pom.xml文件中加入 com.graphql-java-kickstart graphql-java-tools ...

  9. 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势

    [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...

最新文章

  1. docker 连接容器
  2. 江翰网页防篡改系统解决方案--前言
  3. Mysql 中 delete 与 left join 的问题
  4. OpenGL基础2:OpenGL简介
  5. 自带CA ,sha256 哈希签名,2048 位加密 脚本,通用
  6. 模糊控制算法的C++实现
  7. 软件易用性文章分享第二篇-手机易用性: 一个经典的实验
  8. oracle写一个全量刷新,Oracle物化视图定时全量刷新导致归档日志骤增
  9. 可调直流稳压电源的工作原理以及常见问题
  10. 金融风控领域算法比赛经验分享——翼支付杯大数据建模大赛-季军方案
  11. PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization
  12. nginx+docker+gunicorn+flask部署到云服务器
  13. Python Flask基础教程(入门)
  14. nacos的配置管理
  15. ChatGPT入门案例|商务智能对话客服(三)
  16. python修饰符作用_python函数修饰符@的使用
  17. 离散数学复习:命题逻辑
  18. 读书笔记 - 《万历十五年》
  19. 在蜘蛛表格中实现微信消息通知是这样做到的
  20. 人脸伪造DFDC数据集下载 附网盘地址

热门文章

  1. 嵌入式开发<单片机软件升级>
  2. 同轴连接器有哪些种类?
  3. Android10报错:error: libxxx (native:vendor) should not link to libxxx (native:platform)(一百一十七)
  4. 知识图谱问答的实践技术分享的书面版本
  5. ListView控件的作用以及使用方法
  6. 否定无穷小微积分就是否定微积分本身 为什么?短视也!
  7. 对于UDS协议的传输控制协议ISO15765的学习记录
  8. 怎样备考计算机二级,如何备考计算机二级Ms office高级应用
  9. 前端vue导出Excel(多sheet)
  10. NSGA2 Matlab toolbox