Qt OpenGL - 网格式的直角坐标系

Qt OpenGL - 网格式的直角坐标系

  • 引言
  • 一、绘制3D网格
    • 1.1 绘制平行于y轴的线段
    • 1.2 绘制平行于三个轴的线段
    • 1.3 绘制不同的3D网格
  • 二、网格式的直角坐标系
  • 三、参考链接

引言

在这里插入图片描述
在OpenGL进行3D可视化,只绘制三条坐标轴略显单薄,而绘制网格形式的坐标系则能更清晰的展示所画图形位置,如上图所示。

OpenGL可视化须知1:https://blog.csdn.net/sinat_36772813/article/details/129338953 OpenGL中的坐标系
OpenGL三维坐标系例子-只有三个轴2:https://blog.csdn.net/qq_37996632/article/details/103178120 OpenGL画坐标系2
OpenGL三维坐标系例子-网格形式3:https://blog.csdn.net/qq_40004575/article/details/109547793 Qt+OpenGL绘制三维坐标系(动态曲线显示)

一、绘制3D网格

paintGL()函数:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存glLoadIdentity();//旋转显示窗口glTranslatef(0, 0, -30);//glRotatef(45, 0, 1, 0);//画3D网格std::vector<float> p1 = {-4.0f, -4.0f, -4.0f}, p2 = {4.0f, 4.0f, 4.0f};GL3DGrid(p1, p2, 3);

1.1 绘制平行于y轴的线段

在这里插入图片描述

  • 先绘制平行于y轴的线段,效果如上图,算法核心思想:
    给定两个3D坐标,要通过其绘制平行于y轴的若干线段,保证每个线段首尾点的x和z坐标是一致的,首尾点的y坐标即两个3D坐标的y坐标。
void QtDraw3DCtrl::GL3DGrid(std::vector<float> p1, std::vector<float> p2, int num)
{if(p1.size() !=3 || p2.size() !=3){return; // 稳健}num = num -1;const float _xLen = (p2[0] - p1[0]) / num;const float _yLen = (p2[1] - p1[1]) / num;const float _zLen = (p2[2] - p1[2]) / num;// 绘制参数glLineWidth(0.1f);glBegin(GL_LINES);glEnable(GL_LINE_SMOOTH);// 绘制平行于某轴的线段 比如y轴 y坐标固定从p1到p2  x,z坐标变换(无脑遍历即可)for (int xi = 0; xi <= num; xi++) {float x = _xLen * xi + p1[0];for (int zi = 0; zi <= num; zi++) {float z = _zLen * zi + p1[2];glVertex3f(x, p1[1], z);glVertex3f(x, p2[1], z);}}glEnd();
}

1.2 绘制平行于三个轴的线段

在这里插入图片描述

  • 绘制平行于三个轴的线段,如上图所示。增加绘制平行于x轴和z轴的线段,代码与绘制平行于y轴的线段类似,只是改几个参数。
void QopenGLDemo::GL3DGrid(std::vector<float> p1, std::vector<float> p2, int num)
{if(p1.size() !=3 || p2.size() !=3){return; // 稳健}num = num -1;const float _xLen = (p2[0] - p1[0]) / num;const float _yLen = (p2[1] - p1[1]) / num;const float _zLen = (p2[2] - p1[2]) / num;// 绘制参数glLineWidth(0.1f);glBegin(GL_LINES);glEnable(GL_LINE_SMOOTH);// 绘制平行y轴的线段 y坐标固定从p1到p2  x,z坐标变换(无脑遍历即可)for (int xi = 0; xi <= num; xi++) {float x = _xLen * xi + p1[0];for (int zi = 0; zi <= num; zi++) {float z = _zLen * zi + p1[2];glVertex3f(x, p1[1], z);glVertex3f(x, p2[1], z);}}// 绘制平行x轴的线段 x坐标固定从p1到p2  y,z坐标变换(无脑遍历即可)for (int yi = 0; yi <= num; yi++) {float y = _yLen * yi + p1[1];for (int zi = 0; zi <= num; zi++) {float z = _zLen * zi + p1[2];glVertex3f(p1[0], y, z);glVertex3f(p2[1], y, z);}}// 绘制平行z轴的线段 z坐标固定从p1到p2  x,y坐标变换(无脑遍历即可)for (int xi = 0; xi <= num; xi++) {float x = _xLen * xi + p1[0];for (int yi = 0; yi <= num; yi++) {float y = _yLen * yi + p1[1];glVertex3f(x, y, p1[2]);glVertex3f(x, y, p2[2]);}}// 结束绘制glEnd();
}

1.3 绘制不同的3D网格

在这里插入图片描述 在这里插入图片描述在这里插入图片描述

  • 修改GL3DGrid(p1, p2, 3)最后一个参数为4,6,10;

二、网格式的直角坐标系

在这里插入图片描述

  • 由以上代码已可绘制3D网格,但如果在其中绘制目标模型会被遮挡。故,可绘制3个2D网格方便显示,效果如上图所示。(写到这,发现一个bug,之前代码在绘制平行x轴的线段的时候,p2[1]应改为p2[0]) 核心源码如下所示:
void QopenGLDemo::paintGL(){// 初始化glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存glLoadIdentity();//旋转显示窗口glTranslatef(0, 0, -30);//glRotatef(45, 0, 1, 0);//画3D直角坐标系std::vector<float> x1 = {-4.0f, -4.0f, -4.0f}, x2 = {-4.0f, 4.0f, 4.0f};GL3DGrid(x1, x2, 10);std::vector<float> y1 = {-4.0f, -4.0f, -4.0f}, y2 = {4.0f, -4.0f, 4.0f};GL3DGrid(y1, y2, 10);std::vector<float> z1 = {-4.0f, -4.0f, -4.0f}, z2 = {4.0f, 4.0f, -4.0f};GL3DGrid(z1, z2, 10);
}void QopenGLDemo::GL3DGrid(std::vector<float> p1, std::vector<float> p2, int num)
{if(p1.size() !=3 || p2.size() !=3){return; // 稳健}num = num -1;const float _xLen = (p2[0] - p1[0]) / num;const float _yLen = (p2[1] - p1[1]) / num;const float _zLen = (p2[2] - p1[2]) / num;// 绘制参数glLineWidth(0.1f);glBegin(GL_LINES);glEnable(GL_LINE_SMOOTH);// 绘制平行y轴的线段 y坐标固定从p1到p2  x,z坐标变换(无脑遍历即可)for (int xi = 0; xi <= num; xi++) {float x = _xLen * xi + p1[0];for (int zi = 0; zi <= num; zi++) {float z = _zLen * zi + p1[2];glVertex3f(x, p1[1], z);glVertex3f(x, p2[1], z);}}// 绘制平行x轴的线段 x坐标固定从p1到p2  y,z坐标变换(无脑遍历即可)for (int yi = 0; yi <= num; yi++) {float y = _yLen * yi + p1[1];for (int zi = 0; zi <= num; zi++) {float z = _zLen * zi + p1[2];glVertex3f(p1[0], y, z);glVertex3f(p2[0], y, z);}}// 绘制平行z轴的线段 z坐标固定从p1到p2  x,y坐标变换(无脑遍历即可)for (int xi = 0; xi <= num; xi++) {float x = _xLen * xi + p1[0];for (int yi = 0; yi <= num; yi++) {float y = _yLen * yi + p1[1];glVertex3f(x, y, p1[2]);glVertex3f(x, y, p2[2]);}}// 结束绘制glEnd();
}

三、参考链接


  1. https://blog.csdn.net/sinat_36772813/article/details/129338953 OpenGL中的坐标系 ↩︎

  2. https://blog.csdn.net/qq_37996632/article/details/103178120 OpenGL画坐标系2 ↩︎

  3. https://blog.csdn.net/qq_40004575/article/details/109547793 Qt+OpenGL绘制三维坐标系(动态曲线显示) ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leedcode刷题笔记day1

题目大意&#xff1a; 暴力解法 两个for循环&#xff08;也是我一看到题目想到的方法&#xff09; 枚举在数组中所有的不同的两个下标的组合逐个检查它们所对应的数的和是否等于 target 复杂度分析 时间复杂度:O(n2)&#xff0c;这里 n 为数组的长度 空间复杂度:O(1)&#x…

canvas绘制不同样式的五角星(图文示例)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

Windows无法格式化U盘怎么办?

U盘通常用于保存数据。有时&#xff0c;您可能需要格式化以擦除硬盘或修复错误等。通常&#xff0c;格式化过程可以通过Windows文件资源管理器、磁盘管理或Diskpart命令顺利进行&#xff0c;但有时会遇到Windows无法格式化U盘的情况。那么&#xff0c;Windows无法格式化U盘怎么…

如何无需重复输入FTP信息来安装WordPress主题和插件

WordPress作为一个广受欢迎的内容管理系统&#xff0c;提供了丰富的主题和插件来扩展网站的功能和外观。然而&#xff0c;许多用户在安装这些主题和插件时&#xff0c;经常遇到需要重复输入FTP信息的麻烦。幸运的是&#xff0c;有几种方法可以解决这个问题&#xff0c;让安装过…

uni-app的数据缓存

数据缓存uni.setStorage 将数据存储在本地缓存中指定的 key 中&#xff0c;会覆盖掉原来该 key 对应的内容&#xff0c;这是一个异步接口。 参数名类型必填说明keyString是本地缓存中的指定的 keydataAny是需要存储的内容&#xff0c;只支持原生类型、及能够通过 JSON.string…

程序员第一次接私活需要注意什么?

终于有一篇只说大白话的程序员接私活指南文章了&#xff01;程序员接私活&#xff0c;首先要关注合法和合理性 先来说合法性&#xff0c;这是程序员接私活的基本原则。不合规的产品不要做&#xff0c;不合法的需求不要做&#xff0c;原以为自己在赚钱&#xff0c;结果搞了半天啥…

1.2 虚拟环境

1.2 虚拟环境 创建好应用目录之后&#xff0c;接下来该安装Flask了。安装Flask最便捷的方法是使用虚拟环境。 虚拟环境是Python解释器的一个私有副本&#xff0c;在这个环境中你可以安装私有包&#xff0c;而且不会影响系统中安装的全局Python解释器。 虚拟环境非常有用&…

pygame 用 load_xbm() 更改鼠标外形

pygame.cursors.load_xbm()方法传入两个参数&#xff1a;分别传入同一个xbm文件即可 步骤&#xff1a; 1.选择一个png文件&#xff0c;改变图片的大小&#xff0c;推荐24x24&#xff0c;32x32&#xff0c;40x40的鼠标外形&#xff08;8的倍数&#xff09; 2.转化为xbm文件格…

Docker registry镜像仓库,私有仓库及harbor管理详解

目录 registry镜像仓库概述 Docker 镜像仓库&#xff08;Docker Registry&#xff09;&#xff1a; registry 容器&#xff1a; 私有仓库概述 搭建本地私有仓库示例 Harbor概述 harbor架构 详解构成 Harbor由容器构成 Harbor部署示例 环境准备 部署Docker-Compose服…

【知识---TensorRT 中createInferRuntime 函数和 gLogger 变量用法】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言createInferRuntime 函数&#xff1a;gLogger 变量&#xff1a;总结 前言 IRuntime* runtime createInferRuntime(gLogger) 如何学习理解上面这一行代码呢&am…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (4) | 神经网络与反向传播

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

1月18日代码随想录二叉树搜索、验证二叉搜索树

700.二叉搜索树中的搜索 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3], val …

Dotnet Cli 创建解决方案sln 以及添加项目到解决方案

创建解决方案 dotnet new sln -n name添加项目到解决方案 dotnet sln add xxx.csproj解决方案中的项目列表 dotnet sln list https://www.cnblogs.com/microestc/articles/13796631.html

医院网络安全建设:三网整体设计和云数据中心架构设计

医院网络安全问题涉及到医院日常管理多个方面&#xff0c;一旦医院信息管理系统在正常运行过程中受到外部恶意攻击&#xff0c;或者出现意外中断等情况&#xff0c;都会造成海量医疗数据信息的丢失。由于医院信息管理系统中存储了大量患者个人信息和治疗方案信息等&#xff0c;…

Django的数据库操作中的F对象是什么东西?

在Django中&#xff0c;F对象是一个用于表示数据库字段的值的特殊对象。 它允许你在数据库层面进行原子操作&#xff0c;而不需要先将数据从数据库中检索到Python层再进行操作。 F对象的使用通常涉及到数据库更新&#xff0c;特别是在处理并发操作时。 以下是F对象的主要特性和…

[面试题~]Golang

3. 数组和切片 3.1 数组和切片的区别 Go语言中数组是固定长度的&#xff0c;不能动态扩容&#xff0c;在编译期就会确定大小。 切片是一种数据结构&#xff0c;包含一个底层数组的指针&#xff0c;当前切片个数 len 以及切片的最大容量 cap&#xff0c; 描述的是一块数组。 …

FineBI实战项目一(25):实战项目一总结

实在项目使用mysql做数仓库的ODS层&#xff0c;这仅仅是带领大家入门&#xff0c;用mysql做数仓存在很多问题。以实战项目一为例&#xff1a; 1 存在的问题 目前调度用的kettle&#xff0c;数据分析&#xff0c;计算都是落表到mysqlmysql表数量庞大&#xff0c;乱&#xff0c…

css基本写法--详解大全

目录 1.行内样式 2.内嵌样式 3.外链样式 4.import 5.注意 加载顺序 1.行内样式 我们要某个 HTML 标签中去书写样式&#xff0c;它需要使用 style 属性来指定。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&g…

【ArcGIS微课1000例】0088:计算城市建筑物朝向(矩形角度)

文章目录 一、实验描述二、实验数据三、角度计算1. 添加字段2. 计算角度四、方向计算一、实验描述 矩形要素具有长轴和短轴,其长轴方向也称为矩形面的主角度,可用于确定面要素的走向趋势。根据该方向参数,可以对具有矩形特征的地理对象进行方向分析,且适用于很多应用场景,…

什么是NodeJS

1、前言 接触 node.js 有好几年了&#xff0c;也开发了好几个项目了&#xff1b;但每次提起 node.js&#xff0c;始终不敢说自己入门了&#xff0c;归其原因&#xff0c;大概就是如下所示 为了进一步加强理解&#xff0c;系统的梳理相关知识以作备忘&#xff0c;本节将从以下…