OpenGL三视图

OpenGL/C++图形学:视口分割与三视图投影,4矩阵变换实战解析 本文深入解析OpenGL/C++图形学中的视口分割与三视图投影技术,通过四个关键矩阵变换的数学推导与代码实现,详细讲解投影变换在图形管线中的应用。内容涵盖正交投影、透视投影的矩阵构造,以及多视口渲染的优化策略,帮助开发者掌握高效的图形渲染技术。 阅读详情

先任意画出一个二维半图形, 然后在三个象限分别画出该图形的正视图、俯视图、侧视图,(提高:在第四象限画出这个二维半图形的轴测图。)

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<math.h>
#include<Windows.h>
#include <iostream>
#include <cmath>
#include<stdio.h> //X86
#include<GL/glut.h>
#define PI 3.1415926
void Init() {
		//glClearColor(0.3f, 0.3f, 0.3f, 0.0f);  //灰色
		glClearColor(1.0f, 0.97f, 0.86f, 0.0f);
	}
	void Reshape(int w, int h) {     /////////
		glViewport(0, 0, w, h);
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
	
		glOrtho(-w / 2, w / 2, -h / 2, h / 2, -800, 800);
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
	}
void XY() {
			glLineWidth(1);
			//glColor3f(0.0, 0.0, 0.0);//坐标轴
			glColor3f(0.0, .0, 0.0);
			glBegin(GL_LINES);
			glVertex2i(-800, 0);
			glVertex2i(800, 0);

			glVertex2i(0, -600);
			glVertex2i(0, 600);
			glEnd();
			glFlush();
}
void XYZ() {
	gluLookAt(1, 1, 1, 0, 0, 0, 0, 1, 0);
	glLineWidth(1);
	//glColor3f(0.0, 0.0, 0.0);//坐标轴
	glColor3f(1.0, 0.97, 0.86);
	glBegin(GL_LINES);
	glVertex3i(-1000, 0, 0);
	glVertex3i(1000, 0, 0);
	glVertex3i(0, -1000, 0);
	glVertex3i(0, 1000, 0);
	glVertex3i(0, 0, -1000);
	glVertex3i(0, 0, 1000);
	glEnd();
	glFlush();
}

	//int x[12] = { 0, 0, 2, 2, 4, 4, 4, 4, 2, 2, 0, 0 };
	//int y[12] = { 0,-1, 0,-1, 0,-1, 0,-1 ,0,-1, 0,-1 };
	//int z[16] = { 0, 0, 0, 0,  2, 2, 3, 3, 5, 5, 5, 5 };
	//int ID[51] =   { 0,1,2,3,4,5,0,6,7,8,9,10,11,6,0,6,1,7,2,8,3,9,4,10,5,11};
	//int flog[51] = { 0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1, 0, 1};

	int x[12] = { 0, 2, 4, 4, 2,  0, 0, 2, 4, 4, 2, 0 };
	int y[12] = { 0, 0, 0, 0, 0,  0,-1,-1,-1,-1,-1,-1 };
	int z[12] = { 0, 0, 2, 3, 5,  5, 0, 0, 2, 3, 5, 5 };
	int ID[26] = {0,1,2,3,4,5,0,6,7,8,9,10,11,6,0,6,1,7,2,8,3,9,4,10,5,11 };
	int flog[26]={0,1,1,1,1,1,1,0,1,1,1, 1,1, 1,0,1,0,1,0,1,0,1,0,1, 0, 1 };

	/*int x[10] = { 0, 100, 100, 40, 0, 0, 100, 100, 40, 0 };
	int y[10] = { 80, 80, 80, 80, 80, 0, 0,0, 0, 0 };
	int z[10] = { 0, 0, 40, 40, 60, 0, 0, 40, 40, 60 };
	int ID[22] = { 0, 1, 2, 3, 4, 0, 5, 6, 7, 8, 9, 5, 0, 5, 1, 6, 2, 7, 3, 8, 4, 9 };
	int flog[22] = {0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1};*/

	void Frontview(int tx, int ty) {
		int j, k;
		glBegin(GL_LINES);

		for (int i = 0; i < 51; i++) {
			j = ID[i];
			k = ID[i + 1];
			if (flog[i + 1] == 1) {
				glVertex3i(-x[j] * 50-tx, z[j] * 50+ty, 0);
				glVertex3i(-x[k] * 50-ty, z[k] * 50+ty, 0);
			}
		}
		glEnd();
		glFlush();

	}
	void Leftview(int tx, int ty) {
		int j, k;
		glBegin(GL_LINES);

		for (int i = 0; i < 51; i++) {
			j = ID[i];
			k = ID[i + 1];
			if (flog[i + 1] == 1) {
				glVertex3i(y[j] * 50 +tx, z[j] * 50 + ty, 0);
				glVertex3i(y[k] * 50+ ty, z[k] * 50 + ty, 0);
			}
		}
		glEnd();
		glFlush();

	}
	void Toptview(int tx, int ty) {
		int j, k;
		glBegin(GL_LINES);

		for (int i = 0; i < 51; i++) {
			j = ID[i];
			k = ID[i + 1];
			if (flog[i + 1] == 1) {
				glVertex3i(-x[j] * 50 - tx,- y[j] * 50 -ty, 0);
				glVertex3i(-x[k] * 50 - ty, -y[k] * 50 - ty, 0);
			}
		}

		glEnd();
		glFlush();
	}

	void allview(int tx, int ty) {
		int j, k;
		glColor3f(1.0, 0.0, 0.0);
		gluLookAt(1, 1, 1, 0, 0, 0, 0, 1, 0);
		glTranslatef(tx, ty, 0);
		glBegin(GL_LINES);
		for (int i = 0; i < 51; i++) {
			j = ID[i];
			k = ID[i + 1];
			if (flog[i + 1] == 1) {
				glVertex3i(x[j]*50, y[j]*50, z[j]*50);
				glVertex3i(x[k]*50, y[k]*50, z[k]*50);

			}
		}
		
		glEnd();
		glFlush();
	}
	void myDisplay() {
		glClear(GL_COLOR_BUFFER_BIT);
			glLoadIdentity();
			//int j, k;
			//glBegin(GL_LINES);
			//for (int i = 0; i < 51; i++) {
			//	j = ID[i];
			//	k = ID[i + 1];
			//	if (flog[i + 1] == 1) {
			//		/*glVertex3i(x[j], y[j], z[j]);
			//		glVertex3i(x[k], y[k], z[k]);*/
			//		glVertex3i(x[j]*50, y[j]*50, z[j]*50);
			//		glVertex3i(x[k]*50, y[k]*50, z[k]*50);

			//	}
			//}
			//glEnd();
			//glFlush();
			Sleep(100);
			allview(300, -100);
			glLoadIdentity();

			XY();
			glLineWidth(2);
			glColor3f(1.0, 0.0, 0.0);

			Frontview(100,100);
			Leftview(100, 100);
			Toptview(100, 100);
			

	}
	int main(int argc, char* argv[])
			{
				glutInit(&argc, argv);
				glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
				glutInitWindowPosition(100, 100);
				glutInitWindowSize(800, 800);
				glutCreateWindow("the forth plus menu");
		
				Init();
				glutReshapeFunc(Reshape);
				glutDisplayFunc(myDisplay);
				//glutMouseFunc(mouse_hit);
				glutMainLoop();
				return 0;
			}

VC++实现三维模型三视图生成:从正交投影原理到GDI实践 正交投影是计算机图形学中基础且关键的投影方式,它通过将三维空间沿坐标轴方向投影到二维平面,实现无透视变形的视图表达。其核心原理在于坐标变换与维度丢弃,通过模型视图矩阵与投影矩阵的运算,将三维顶点映射为二维坐标。这一技术在工程领域具有重要价值,是实现CAD软件、工业设计工具及工程制图功能的技术基石。在应用场景上,正交投影广泛用于生成机械制图的标准三视图(前视图、侧视图、顶视图),这是工程师进行设计沟通、尺寸标注与制造装配的依据。本文以VC++开发环境为例,结合Windows GDI图形接口,详细解析如何从数据 阅读详情

相关推荐

头歌实践教学平台:从三视图到视口变换的图形学实战

本文详细介绍了在头歌实践教学平台上实现从三视图到视口变换的图形学实战技巧。通过解析三视图的核心概念、投影矩阵的推导与实现,以及视口变换的关键技术,帮助开发者掌握图形学中的坐标变换与多视图展示。文章还提供了代码实现中的关键细节和可视化调试技巧,助力提升图形学项目的开发效率。

weixin_30846347的博客 278

Qt学习:使用OpenGL绘制3D图形

OpenGL是一个跨平台的、用来渲染3D图形的标准API,Qt对OpenGL提供了强大的支持。Qt4时代的QtOpenGL模块在Qt5中已经不再建议使用,OpenGL相关的类被移到了QtGUI模块。QtWidgets模块中的QOpenGLWidget类提供了一个可以渲染OpenGL图形的部件,通过该部件可以轻松地将OpenGL图形整合到Qt应用程序中。

XCJandLL的博客 5149

OpenGL实战:如何在三维图形中正确使用透视投影与平行投影(附完整代码示例)

本文深入解析OpenGL中透视投影与平行投影的核心原理与应用实践,提供完整的代码示例。通过对比两种投影方式的视觉特征和适用场景,帮助开发者在三维图形编程中正确选择和使用投影变换,优化视觉效果与性能。特别针对投影矩阵参数设置、常见问题及解决方案进行详细探讨,适用于游戏开发、CAD制图等多个领域。

weixin_28455801的博客 221

利用OpenGL的多视区分别在4个视区内显示空间四面体的透视投影图、主视图、俯视图、侧视图

1

derbi123123的博客 5372

三视图算法实现与应用:计算机图形学案例分析

三视图算法的基本目标是提供一种系统性方法,通过顶视图、前视图和侧视图来准确地表示三维物体的外形和结构。这种表示方式对于那些需要精确度和细节的工程任务来说,尤其重要。在计算机图形学中,三维模型的数据结构设计需要遵循一定的原则以满足效率和扩展性。通常情况下,设计原则包括:最小化存储需求:数据结构应优化存储空间,避免冗余。高效的数据访问:支持快速的元素访问和操作,如旋转、缩放等。良好的扩展性:应支持未来可能的模型扩展和修改。易于维护:结构应简洁明了,方便后续开发和维护。

weixin_31749299的博客 1174

VS2013 OpenGL 三视图界面

类似3D MAX那种三视图界面,用VS2013 OpenGL 实现

OPengl学习(五)——视图(2)

解释视图中常见概念以及一些函数的使用。

记录一些平时工作或者学习中的瞬间 682

实现三视图及透视图的小段代码

简单容易实现三视图的C代码 txt 在C下直接运行

《OpenGL编程指南第7版》3视图

一、概念 视图变换:设置相机位置和方向模型变换:设置模型位置和方向投影变换:透视投影和正投影。透视投影:近大远小;正投影:直接映射。视口变换:设置如何映射到窗口屏幕 二、内容 2.1 模型变换 glTranslate:平移glRotate:渲染glScale:缩放 2.2 视图变换: gluLookAt(观察点位置,瞄准参考点,朝上方向); 2

1942

基于OPENGL透视图显示三视图投影变换

利用OpenGL中的多视区,分别在四个视区内显示空间四面体的主视图、俯视图、侧视图、透视投影图。

在VC中实现OpenGL三维绘图_Vc_

OpenGL绘制三维图形的实例源代码,源代码比较复杂,它可以绘制3D立体效果图,长方体、正方体等,其功能类似一款简单的3D绘图工具

Opengl三视图的坐标变换

三视图的投影      三视图 变换规则   : ax,ay,bx,by,cx,by;分别为三视图变换的基准位置 正视图   x'=x+ax,y'=y+ay; z'=0; 侧视图   x'=z+bx,y'=y+by;z'=0; 俯视图   x'=x+cx,y'=-z+cy;z'=0; 变换矩阵为上面三行的公式拆回来。 /************************

u014717398的博客 5886

Opengl.rar_opengl画三视图_贝塞尔 圆弧

利用函数库画贝塞尔曲线, 手动函数画贝塞尔曲线 画三视图 画圆弧

实验十 三维图形投影变换实验

本实验使用OpenGL实现了三维图形的多视图投影显示。通过定义立方体顶点和面数据,编写绘制函数展示四种投影效果:正投影三视图(前视图、侧视图、顶视图)和两种轴测视图(正等轴测图和斜二测图)。实验采用视口分割技术,在不同区域分别显示各类投影结果,通过旋转变换矩阵实现各视图的效果。程序实现了交互功能(ESC键退出),并启用了深度测试保证图形正确绘制。实验验证了三视图和轴测视图的变换矩阵,直观展示了三维图形在不同投影方式下的呈现效果,为计算机图形学中的投影变换提供了实践参考。

2301_81869658的博客 696

matlab相机标定_实战 | 相机标定

点击“计算机视觉life”关注,置顶更快接收消息!本文阅读时间约5分钟什么是相机标定?我们为什么需要相机标定?相机标定就是确定相机内参和外参的过程,其结果精度会直接影响视觉系统后续工作的准确性。坐标系相机标定涉及到了四大坐标系,分别为:像素坐标系图像物理坐标系相机坐标系世界坐标系为了进行相机标定,必须已知世界坐标系中足够多的三维空间点坐标,找到这些空间点在图像中投影点的二维图像坐标,并建...

weixin_39747334的博客 763

用itext读取PDF文件提取对应得字符串

一.maven导入jar包 <!--pdf解析start--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</version...

zhanghua_chinese的博客 3696

头歌实践教学平台:投影变换v2.0

(2) 代码自动将模型投影到二维平面,经过模型变换,生成一个长宽高不等的立方体,并将显示窗口一分为四,分为四个视口,每个视口大小均为原窗口大小的一半。然后沿Y轴顺时针旋转90度,最后进行视口变换ViewPort1,绘制一个绿色矩形;(5) 在第三视口ViewPort2中,首先将立方体沿Y轴向XOZ平面投影。(6) 在第四视口ViewPort3中,首先将立方体沿Y轴顺时针旋转45度,然后进行投影变换,投影变换参数eye和center已给出。最后进行视口变换ViewPort3,绘制一个黄色立方体。

菜鸟的博客~ 1254

【photoshop CEP插件】 OCR文字识别

一个photoshop CEP插件OCR文字识别 APP_ID = 17594920 API_KEY = puMFv72xqCYV2jdcSlXgtFvm SECRET_KEY = v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m /*********************************************/ 百度OCR 密钥由Greless@qq.com 提供, 用户可自行前往https://ai.baidu.com/docs#/Auth/top 申请。 通用文字识别..

Greless的后花园 6487

成都理工大学计算机图形学考试题,成都理工大学计算机图形学2016年期末考试试题.doc...

..1.名词解释:计算机图形学研究怎样利用计算机来显示、生成和处理图形的原理、方法和技术的一门学科存储分辨率指帧缓冲存储区的大小,一般用缓冲区的字节数表示显示分辨率计算机显示控制器能够提供的不同显示模式下的分辨率,在实际应用中简称显示模式像素:构成屏幕(图像)的最小元素反走样产生原因,数学意义上的图形是由无线多个连续的、面积为零的点构成;但在光栅显示器上,用有限多个离散的,具有一定面积的象素来近似...

weixin_35044595的博客 362

保姆级教程:在华为云Ubuntu服务器上快速搭建RAGflow开发环境(避坑指南)

本文提供了一份在华为云Ubuntu服务器上快速搭建RAGflow开发环境的保姆级教程。针对网络拉取镜像等常见问题,详细介绍了从服务器选型、系统优化、Docker配置到RAGflow部署与验证的全流程,并给出生产环境调优建议,帮助开发者高效避坑,快速构建企业级应用环境。

weixin_29250403的博客 84

LIS3DHTR三轴加速度计Arduino驱动与嵌入式集成指南

加速度计是嵌入式系统中实现运动感知、姿态解算和振动分析的核心传感器。其工作原理基于MEMS微机械结构在惯性力作用下的电容变化,经片内ADC转换为数字信号;I²C接口因其硬件资源占用少、布线简洁,成为低功耗物联网节点的主流通信方式。技术价值体现在高分辨率(12位)、多量程(±2g~±16g)与低功耗(待机电流仅2µA)的平衡,支撑电池供电设备长期运行。典型应用场景包括可穿戴设备的姿态识别、工业预测性维护中的振动监测,以及智能硬件的敲击/跌落检测。本文围绕LIS3DHTR芯片及其Grove模块,详解Arduin

weixin_42584758的博客 594

计算机图形学

openGL的简单应用。 1.opengl的菜单功能(实现直线、折线和矩形的橡皮筋绘制技术) 1 #include"gl/glut.h" 2 static GLsizei iMode=1; 3 int ipointnum=0;//点的数目 4 int x1=0,x2=0,y1=0,y2=0;//点的坐标 5 int winWidth=400,winHeigh...

weixin_30618985的博客 145

MATLAB 与 STK 互联的两种连接方式详解

批量仿真推荐使用方法一;交互分析推荐使用方法二。可以根据具体任务灵活切换,也可以同时使用两种方式,提升建模与仿真的效率。

weixin_52370774的博客 1566

计算机图形学 java_计算机图形学

1 #include "stdafx.h"2 #include"stdio.h"3 #include"vector"4 #include"iostream"5 #include6 using namespacestd;7 const int maxnum = 200;8 vectorface[10];9 int winwidth = 1000, winheight = 600;10 int poi...

weixin_42522275的博客 411

【华为OD机试真题】18、喊7的次数重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。   编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当将要喊出来的数字是7的倍数或者数字本身含有7的话,不能把这个数字直接喊出来,而是要喊”过”。   假定玩这个游戏的N个人都没有失误地在正确的时机喊了”过”,当喊到数字K时,可以统计每个人喊”过”的次数。   现给定一个长度为N的数组,存储了打乱顺序的每个人喊”过”的次数,请把它还原成正确的顺序,即数组的第i个元素存储编号i的人喊

KJ.JK 4167

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

视觉人机器视觉的博客 1741
上一篇: opengl 字符编码
下一篇: OpenGL曲线绘制
fqq3
博客等级 码龄4年 114粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值