使用opengl 和 openmesh 读取obj文件,显示3d模型,并可以进行旋转、平移、缩放

Qt下学习OpenGL之OBJ模型 我这里的OBJ格式不是c++代码产生的中间文件,而是那个g什么wave公司的OBJ格式,格式很简单,作用就是拿来存储3D模型的一些基本信息。以前在VS2005下能很轻松读取,这次换QT了,幸好QT公司对客户很用心和负责,在其QtLab下发现了不错的类和代码。加以运用,成功导入OBJ~   切入正题。   首先这个类会需要引用该文件point3d.h,其内容如下:#ifndef POINT3 阅读详情

本博客是使用opengl 和 openmesh 读取obj文件,显示3d模型,并可以进行旋转、平移、缩放,并加入了环境光

 

一、操作

鼠标控制物体旋转移动,滚轮缩放,上下左右键可以控制模型的移动

F1,F2,F3,F4,F5,F6,F7,F8可以更换显示文件

Insert键 更换显示模式 (wire,flat,flatlines)

 

二、实验演示

按F1 读入 一个 cow的 obj文件

切换为只显示线的模式:

切换为可以显示面的模式:

可以实现旋转:

旋转之后:

可以实现缩放:

缩小:

可以实现平移:

按完相应键盘的按键之后,就会进行入读obj文件,使用命令行显示当前状态

三、具体代码如下:

#include <iostream>  
#include <OpenMesh/Core/IO/MeshIO.hh>  
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>  
#include<GL/glut.h>
#include <math.h>
#include <Windows.h>
#include <string>
using namespace std;
typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;

//鼠标交互有关的
int mousetate = 0; //鼠标当前的状态
GLfloat Oldx = 0.0; // 点击之前的位置
GLfloat Oldy = 0.0;
GLuint texture;
//与实现角度大小相关的参数,只需要两个就可以完成
float xRotate = 0.0f;   //旋转
float yRotate = 0.0f;
float ty = 0.0f;
float tx = 0.0f;
float scale = 0.004;

//文件读取有关的
MyMesh mesh;  //mesh把文件读取了,封装在mesh对象中
//"G:\\source\\OpenGL\\ObjLoader\\ObjLoader\\ObjLoader\\data\\dinosaur.obj";
const string file_1 = "G:\\source\\OpenGL\\ObjLoader\\ObjLoader\\ObjLoader\\data\\cow.obj";
const string file_2 = "G:\\source\\OpenGL\\ObjLoader\\ObjLoader\\ObjLoader\\data\\bunny.obj";
const string file_3 = "G:\\source\\OpenGL\\ObjLoader\\ObjLoader\\ObjLoader\\data\\dinosaur.obj";
const string file_4 = "G:\\source\\OpenGL\\ObjLoader\\ObjLoader\\ObjLoader\\data\\mba1.obj";
const string file_5 = "G:\\source\\OpenGL\\ObjLoader\\ObjLoader\\ObjLoader\\data\\monkey.obj";
const string file_6 = "G:\\source\\OpenGL\\ObjLoader\\ObjLoader\\ObjLoader\\data\\porsche.obj";
//const string file_7 = "G:\\source\\OpenGL\\ObjLoader\\ObjLoader\\ObjLoader\\data\\teddy.obj";
const string file_7 = "G:\\obj\\大黄蜂\\huangfeng.obj";
const string file_8 = "G:\\obj\\高达\\file.obj";
const string file_9 = "G:\\objdata\\face.sur";
int currentfile = 1;

GLuint showFaceList, showWireList;
int showstate = 1;
bool showFace = true;
bool showWire = false;
bool showFlatlines = false;



void setLightRes() {
	//GLfloat lightPosition[] = { 0.0f, 0.0f, 1.0f, 0.0f };
	GLfloat lightPosition[] = { 0.0f, 1.0f, 0.0f, 0.0f }; // 平行光源, GL_POSITION属性的最后一个参数为0


	glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
	glEnable(GL_LIGHTING); //启用光源
	glEnable(GL_LIGHT0);   //使用指定灯光
}
void SetupRC()
{
	glEnable(GL_DEPTH_TEST);
	glFrontFace(GL_CCW);
	glEnable(GL_CULL_FACE);
	// 启用光照计算
	glEnable(GL_LIGHTING);
	// 指定环境光强度(RGBA)
	GLfloat ambientLight[] = { 1.0f, 0.0f, 0.0f, 0.0f };
	// 设置光照模型,将ambientLight所指定的RGBA强度值应用到环境光
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
	// 启用颜色追踪
	glEnable(GL_COLOR_MATERIAL);
	// 设置多边形正面的环境光和散射光材料属性,追踪glColor
	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
	//glClearColor(0.0f, 0.0f, 0.5f, 1.0f);
}

//初始化顶点和面   
void initGL()
{
	//实用显示列表
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glClearDepth(2.0);
	glShadeModel(GL_SMOOTH);
	glEnable(GL_DEPTH_TEST); //用来开启深度缓冲区的功能,启动后OPengl就可以跟踪Z轴上的像素,那么它只有在前面没有东西的情况下才会绘制这个像素,在绘制3d时,最好启用,视觉效果会比较真实
	//glEnable(GL_TEXTURE_2D);
		// ------------------- Lighting  
	//glEnable(GL_LIGHTING); // 如果enbale那么就使用当前的光照参数去推导顶点的颜色
	//glEnable(GL_LIGHT0); //第一个光源,而GL_LIGHT1表示第二个光源
					 // ------------------- Display List  
	setLightRes();
	SetupRC();//设置环境光
	showFaceList = glGenLists(1);
	showWireList = glGenLists(1);
	int temp = mesh.n_edges();

	// 绘制 wire 
	glNewList(showWireList, GL_COMPILE);
	glDisable(GL_LIGHTING);
	glLineWidth(1.0f);
	glColor3f(0.5f, 0.5f, 0.5f);//灰色
	glBegin(GL_LINES);
	for (MyMesh::HalfedgeIter he_it = mesh.halfedges_begin(); he_it != mesh.halfedges_end(); ++he_it) {
		//链接这个有向边的起点和终点
		glVertex3fv(mesh.point(mesh.from_vertex_handle(*he_it)).data());
		glVertex3fv(mesh.point(mesh.to_vertex_handle(*he_it)).data());
	}
	glEnd();
	glEnable(GL_LIGHTING);
	glEndList();

	// 绘制flat
	glNewList(showFaceList, GL_COMPILE);
	for (MyMesh::FaceIter f_it = mesh.faces_begin(); f_it != mesh.faces_end(); ++f_it) {
		glBegin(GL_TRIANGLES);
		for (MyMesh::FaceVertexIter fv_it = mesh.fv_iter(*f_it); fv_it.is_valid(); ++fv_it) {
			glNormal3fv(mesh.normal(*fv_it).data());
			glVertex3fv(mesh.point(*fv_it).data());
		}
		glEnd();
	}
	glEndList();
}




// 当窗体改变大小的时候,改变窗口大小时保持图形比例
void myReshape(GLint w, GLint h)
{
	glViewport(0, 0, static_cast<GLsizei>(w), static_cast<GLsizei>(h));
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (w > h)
		glOrtho(-static_cast<GLdouble>(w) / h, static_cast<GLdouble>(w) / h, -1.0, 1.0, -100.0, 100.0);
	else
		glOrtho(-1.0, 1.0, -static_cast<GLdouble>(h) / w, static_cast<GLdouble>(h) / w, -100.0, 100.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}


// 读取文件的函数
void readfile(string file) {
	// 请求顶点法线 vertex normals
	mesh.request_vertex_normals();
	//如果不存在顶点法线,则报错 
	if (!mesh.has_vertex_normals())
	{
		cout << "错误:标准定点属性 “法线”不存在" << endl;
		return;
	}
	// 如果有顶点发现则读取文件,读入到mesh对象中
	OpenMesh::IO::Options opt;
	if (!OpenMesh::IO::read_mesh(mesh, file, opt))
	{
		cout << "无法读取文件:" << file << endl;
		return;
	}
	else cout << "成功读取文件:" << file << endl;
	cout << endl; // 为了ui显示好看一些
				  //如果不存在顶点法线,则计算出
	if (!opt.check(OpenMesh::IO::Options::VertexNormal))
	{
		// 通过面法线计算顶点法线
		mesh.request_face_normals();
		// mesh计算出顶点法线
		mesh.update_normals();
		// 释放面法线
		mesh.release_face_normals();
	}
}

//  键盘交互 1. 切换文件 2.切换显示
void mySpecial(int key, int x, int y) {
	switch (key) {
	case GLUT_KEY_F1:
		cout << "读取文件:" << file_1 << " 中......" << endl;
		readfile(file_1);
		scale = 0.004;
		currentfile = 1;
		initGL();
		break;
	case GLUT_KEY_F2:
		cout << "读取文件:" << file_2 << " 中......" << endl;
		readfile(file_2);
		scale = 0.003;
		currentfile = 2;
		initGL();
		break;
	case GLUT_KEY_F3:
		cout << "读取文件:" << file_3 << " 中......" << endl;
		readfile(file_3);
		scale = 0.02;
		currentfile = 3;
		initGL();
		break;
	case GLUT_KEY_F4:
		cout << "读取文件:" << file_4 << " 中......" << endl;
		readfile(file_4);
		scale = 0.005;
		currentfile = 3;
		initGL();
		break;
	case GLUT_KEY_F5:
		cout << "读取文件:" << file_5 << " 中......" << endl;
		readfile(file_5);
		scale = 0.5;
		currentfile = 5;
		initGL();
		break;
	case GLUT_KEY_F6:
		cout << "读取文件:" << file_6 << " 中......" << endl;
		readfile(file_6);
		scale = 0.02;
		currentfile = 3;
		initGL();
		break;
	case GLUT_KEY_F7:
		cout << "读取文件:" << file_7 << " 中......" << endl;
		readfile(file_7);
		scale = 0.04;
		currentfile = 3;
		initGL();
		break;
	case GLUT_KEY_F8:
		cout << "读取文件:" << file_8 << " 中......" << endl;
		readfile(file_8);
		scale = 0.04;
		currentfile = 3;
		initGL();
		break;
	case GLUT_KEY_F9:
		cout << "读取文件:" << file_9 << " 中......" << endl;
		readfile(file_9);
		scale = 0.04;
		currentfile = 3;
		initGL();
		break;
	case GLUT_KEY_INSERT:
		if (showFace == true) {
			showFace = false;
			showWire = true;
			
			cout << "切换显示模式为:WireFrame" << endl;
		}
		else if (showWire == true)
		{
			showWire = false;
			showFlatlines = true;
			cout << "切换显示模式为:Flatlines" << endl;
		}
		else if (showFlatlines == true) {
			showFlatlines = false;
			showFace = true;
			//DisplaySphere(0.5, "G:\\source\\OpenGL\\Cow\\checkerboard3.bmp");
			cout << "切换显示模式为:Flat" << endl;
		}
		break;
	case GLUT_KEY_LEFT:
		tx -= 0.01;
		break;
	case GLUT_KEY_RIGHT:
		tx += 0.01;
		break;
	case GLUT_KEY_UP:
		ty += 0.01;
		break;
	case GLUT_KEY_DOWN:
		ty -= 0.01;
		break;
	default:
		break;
	}
	glutPostRedisplay();
}

// 鼠标交互
void myMouse(int button, int state, int x, int y)
{
	if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
		mousetate = 1;
		Oldx = x;
		Oldy = y;
	}
	if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
		mousetate = 0;
	//滚轮事件
	if (state == GLUT_UP && button == GLUT_WHEEL_UP) {
		//cout << "hello" << endl; 
		//滑轮向上滑,则scale减小
		if (currentfile == 1)
			scale += 0.0005;
		if (currentfile == 2)
			scale += 0.001;
		if (currentfile == 5) {
			scale += 0.1;
		}
		else
			scale += 0.001;
	}
	if (state == GLUT_UP && button == GLUT_WHEEL_DOWN) {
		//cout << "good" << endl;
		//滑轮向下滑,则scale增加
		if (currentfile == 1)
			scale -= 0.0005;
		if (currentfile == 2)
			scale -= 0.001;
		if (currentfile == 5) {
			scale -= 0.1;
		}
		else
			scale -= 0.001;
	}
	glutPostRedisplay();
}

// 鼠标运动时
void onMouseMove(int x, int y) {
	if (mousetate) {
		//x对应y是因为对应的是法向量
		yRotate += x - Oldx;
		glutPostRedisplay();//标记当前窗口需要重新绘制
		Oldx = x;
		xRotate += y - Oldy;
		glutPostRedisplay();
		Oldy = y;
	}
}

void myDisplay()
{
	//要清除之前的深度缓存
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	//与显示相关的函数
	glRotatef(xRotate, 1.0f, 0.0f, 0.0f); // 让物体旋转的函数 第一个参数是角度大小,后面的参数是旋转的法向量
	glRotatef(yRotate, 0.0f, 1.0f, 0.0f);
	//glTranslatef(0.0f, 0.0f, ty);
	glTranslatef(tx,ty, 0);
	glScalef(scale, scale, scale); // 缩放

								   //每次display都要使用glcalllist回调函数显示想显示的顶点列表
	if (showFace)
		glCallList(showFaceList);
	if (showFlatlines) {
		glCallList(showFaceList);
		glCallList(showWireList);
	}
	if (showWire)
		glCallList(showWireList);

	glutSwapBuffers(); //这是Opengl中用于实现双缓存技术的一个重要函数
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); // GLUT_Double 表示使用双缓存而非单缓存
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(800, 500);
	glutCreateWindow("Mesh Viewer");
	//一开始默认读取文件1
	//readfile(file_1);
	//initGL();
	glutMouseFunc(myMouse);
	glutMotionFunc(onMouseMove); // 鼠标移动的时候的函数
	glutSpecialFunc(&mySpecial);
	glutReshapeFunc(&myReshape);
	glutDisplayFunc(&myDisplay);

	glutMainLoop();
	return 0;
}

obj文件,可以在此链接下,进行下载 :

https://download.youkuaiyun.com/download/ding_programmer/11229750

 

三维牙齿模型自动化预处理系统:Qt/C++实现网格修复与优化 三维网格处理是计算机图形学和医疗影像分析中的基础技术,其核心在于对由顶点、边和面片构成的几何模型进行高效操作。其原理涉及数据结构组织、几何算法设计以及GPU渲染管线,旨在解决原始扫描数据常见的噪声、孔洞及非流形结构等问题。该技术的价值在于将繁琐的手动模型修复自动化,显著提升在3D打印、有限元分析等场景下的数据准备效率。本文聚焦于三维牙齿扫描模型这一具体应用,深入剖析了基于Qt和C++的桌面工具开发全流程,涵盖了从STL/OBJ文件解析、拉普拉斯平滑去噪、孔洞修复到自动化流程引擎构建等关键技术细节,为相关领域 阅读详情

相关推荐

基于Qt框架实现的OBJ格式3D模型预览

基于Qt框架实现的OBJ格式3D模型预览。基于Qt框架实现的OBJ格式3D模型预览。

Qt3D 加载obj不显示的问题

Qt3D 加载obj不显示的问题

浅暖的博客 2277

QT(5.9.6)+OpenGL加载显示obj模型

该工程采用Qt3D模块加载obj模型文件,最终将模型显示在窗口中。 环境:qt:5.9.6 系统:win10 64Bit obj文件:自带一份

Qt 6.2.0 通过opengl加载OBJ格式文件显示3D图,可同时加载多个文件显示

效果预览 工程结构 放置一个openglWidget然后提升为自己写的类: copenglwidget.cpp #include "openglwidget.h" OpenglWidget::OpenglWidget(QWidget *parent) : QOpenGLWidget(parent) { connect(& timer,SIGNAL(timeout()),this,SLOT(slotTimeout())); //timer.start(30); } void

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 2762

"winform+opengl+freeglut"实现导入两关节机械臂的obj模型,并进行旋转、平移等操作

开发环境:vs2019 开发工具:C++、OpenGL 工具库:freeglut 窗口:winform 主要实现:将OpenGL绘图窗口嵌入Winform窗口,在OpenGL窗口中导入事先准备好的obj模型,并通过winform窗口上的控件对导入的两关节机械臂进行简单操作并输出结果。

opengl实现导入正方体obj文件+旋转+平移+贴图

opengl实现导入正方体obj文件+旋转+平移+贴图 图形学作业C++

OpenGl读取导入3D模型并且添加鼠标移动旋转显示

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11543828.html 最近实习要用到opengl库就是跟opencv 有点像的那个,然后下了一个3D模型的读取显示来研究 现在分享给大家吧 注释基本我都打好了,所以也懒得再写很多解析了,自己看注释吧! 参考博客是这篇:https://blog.csd...

weixin_30261095的博客 701

OBJ模型的加载绘制放大缩小移动

OBJ模型的加载绘制放大缩小移动

opengl | openmesh 读取显示3d模型文件

转自:http://blog.youkuaiyun.com/qq_28057541/article/details/51362945 操作 鼠标控制物体旋转移动,滚轮缩放 F1,F2,F3 可以更换显示文件 (file1:cow.obj file2:cactus.ply file3 : Armadillo.off) F4 更换显示模式 (wire,flat,flatline

hjwang1的专栏 2787

安装openmesh与OpenGL,并说明两个库的学习方法

当涉及到三维图形编程和计算机图形学开发时,安装OpenMesh与OpenGL是至关重要的一步。下面我们将详细介绍安装过程以及学习这两个库的方法,以便让您能够轻松地进入这个令人兴奋的领域。 安装OpenMesh OpenMesh是一个强大的开源三维网格处理库,提供了广泛的功能用于处理和操作三维模型。你可以通过以下方法来安装OpenMesh: 包管理器:对于大多数Linux发行版,你可以使用包管理器轻松安装OpenMesh。例如,在Ubuntu上,你可以运行以下命令: bash Copy code sudo apt-get install libopenmesh-dev 源代码安装:如果你需要最新版本或者特定配置,你可以从OpenMesh的官方GitHub仓库获取源代码,然后按照提供的文档进行编译和安装。 Windows:在Windows上,你可以使用CMake来构建OpenMesh的解决方案文件,然后在Visual Studio中打开并进行构建。 安装OpenGL OpenGL是一个跨平台的图形库,用于实时渲染2D和3D图形。

SAP FB03凭证修改实战:巧用BAPI FI_DOCUMENT_CHANGE更新抬头与行项目

本文详细介绍了SAP FB03凭证修改的实战技巧,重点解析了BAPI FI_DOCUMENT_CHANGE的使用方法。通过该接口,用户可以在不冲销原凭证的情况下直接更新抬头文本(BKTXT)和行项目文本(SGTXT),确保凭证编号连续且符合审计要求。文章包含核心机制解析、完整实现步骤、错误处理方案以及高级应用场景,帮助开发者高效完成SAP财务凭证修改。

weixin_29251567的博客 425

objdata.zip资源文件介绍:78种小型3D模型文件,适用于OpenGL和OpenMesh读取实验

objdata.zip资源文件介绍:78种小型3D模型文件,适用于OpenGL和OpenMesh读取实验 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代3D图形开发中,拥有易于操作且格式通用的模型文件至关重要。objdata.zip正是这样一个开源资源库,为开发者和学习者提供了78种特别小的obj文件。obj文件作为标准的3D模型格式,以其广泛的应用和良好的兼容...

gitblog_06737的博客 302

LangChain4j + Milvus 从0-1实现会话管理与RAG检索的AIChat超详细教程

本教程将介绍如何使用LangChain4j和Milvus向量数据库构建一个具备流式输出、会话管理、会话隔离和基于文档RAG检索能力的AI机器人。我们将使用阿里百炼模型作为LLM后端,并通过Docker部署Milvus向量数据库。创建Assistant接口,定义聊天服务:LangChain4j 中文文档 | LangChain4j 中文文档wiringMode :这个属性一般两种,一种是自动装配,我们这里选择手动配置。

2301_80014343的博客 1435

实现3D物体导入与绘制_2021秋季《计算机图形学》_基于《计算机图形学(第四版)》D.H.&M.P.B.&W.R.C.

一、实验目的 利用openMesh导入应用软件制作的3D模型,有一定的交互功能。 使用键盘实现切换图片 使用键盘实现平移 使用键盘实现旋转 WireFrame/Flatlines/Flat模式切换 二、实验环境 Visual Studio 2019 Windows 10 三、算法分析与设计 设置全局变量 // 旋转角度 float xRotate = 0.0f; float yRotate = 0.0f; // 位置坐标 float ty = 0.0f; float tx = 0.0f;

rd142857的博客 817

使用ExcelJS向XLSX单元格居中插入图片

本文记录了使用ExcelJS库向XLSX单元格里居中写入图片的方法。本文内容包括:xlsx 文件格式;xlsx 图片定位的长度单位;使用nativeColOff和nativeRowOff进行定位,不要使用官网给的定位方式;添加图片到数据表的总体流程和样例代码;注意事项等。

weixin_43678000的博客 3456

基于PWM的汽车仪表步进电机微步驱动优化实践

本文深入探讨了基于PWM的微步驱动技术,用于优化汽车仪表步进电机的运行性能。通过将传统的分步驱动升级为PWM微步细分驱动,利用正弦/余弦查表法合成旋转磁场,有效消除了指针抖动与噪声,实现了指针的平滑、精准运动。文章以STM32和VID2905电机为例,提供了详细的硬件连接、代码实现及高级优化技巧,为提升汽车仪表体验提供了实用方案。

weixin_29169505的博客 512

从零开始openGL——三、模型加载及鼠标交互实现

前言搜小说 https://shupu.org/ 在上篇文章中,介绍了基本图形的绘制。这篇博客中将介绍模型的加载、绘制以及鼠标交互的实现。 模型加载 模型存储 要实现模型的读取、绘制,我们首先需要知道模型是如何存储在文件中的。 通常模型是由网格组成的,且一般为三角网格。原因为: 其它多边形网格可以容易地剖分为三角形 三点共面:保证平面性 可以容易地定义内外方向,进行插值等操作 可采用...

爱无止 1040

【Hadoop】开发插件安装

前言 Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。 Eclipse的插件机制是轻型软件组件化架构。在客户机平台上,Eclipse使用插件来提供所有的附加功能,例如支持Java...

weixin_44039347的博客 3208

c++ 3D笔记整理

C++ 3D笔记

Judah_t的博客 1117

机器学习项目实战案例数据集

本专栏整理了《机器学习项目实战案例》,内包含了各种不同的机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 3636

符合DO-178C和DO-331的机载软件研制体系

DO-178C的核心要求软件开发生命周期:DO-178C定义了软件开发的生命周期过程,包括需求获取、设计、实现、验证和确认等。它为机载软件开发提供了一套系统化的指导,确保在开发过程中考虑安全性和可靠性。安全等级(DAL):根据系统的重要性,DO-178C将软件划分为不同的开发保障等级(DAL A到E),DAL A的要求最为严格,适用于关键安全功能,而DAL E的要求较低,适用于非关键功能。DO-178C在非基于模型软件开发中的应用。

qq_41854911的博客 980

opengl读取OBJ模型文件

原文地址:  http://blog.sina.com.cn/s/blog_6db61ebf01017325.html 要顺利读取obj模型文件,先要了解obj文件的格式。OBJ文件格式是非常简单的,它以纯文本的形式存储了模型的顶点、法线和纹理坐标和材质使用信息。 OBJ文件的每行的格式如下:前缀 参数1 参数2 参数3 ... 其中,前缀标识了

yz960611的博客 1万+

材料带隙预测(图神经网络)(⭐⭐)—— 用晶体图网络预测钙钛矿材料的能带隙,加速光伏材料筛选。技术栈:CGCNN、MEGNet、Materials Project数据集

钙钛矿太阳能电池以其高效率、低成本的优势迅速崛起,但传统“试错法”材料筛选效率极低,严重制约了光伏技术的迭代速度。近年来,基于图神经网络的材料带隙预测方法,特别是晶体图神经网络(CGCNN)和材料图网络(MEGNet),为这一问题提供了革命性的解决方案。本文系统梳理了材料带隙预测从传统计算到深度学习的演进历程,深入剖析了CGCNN与MEGNet的架构设计、数学原理及创新机制,详细阐述了Materials Project数据集的构建、特征工程与处理策略。

2201_76125393的博客 47

OpenGL模型控制(旋转、平移)

首先做一个鼠标双击事件,表示平移模型对象,当然,我们需要遍历当前哪个模型对象被选中,才能进行该对象的平移操作。然后再绘制的时候, 使用model.translate(modelInfo.worldPos)即可。开启平移后,重写鼠标移动事件,将物体的需要移动到的像素坐标转化为世界坐标。首先判断当前的模型是否被选中。重写鼠标左键单击事件。重写鼠标移动事件,改变其欧拉角。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2712

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

解决在OpenGL中导入.obj模型所遇一些问题的方法

解决在OpenGL中导入.obj模型纹理与模型不在同一路径下的方法相对路径格式“/”与“\”相对路径起始导入模型的限制 最近在学习LearnOpenGL CN,学到了模型加载那一章,遇到了一些错误,找到了一些解决办法,记录下来。 相对路径格式 “/”与“\” 在代码 Model ourModel(FileSystem::getPath("resources/objects/nanosuit/nan...

surpass2019的博客 5974

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Qt OpenGL加载OBJ模型

在加载OBJ模型文件之前首先要对OBJ文件的内容有所了解,在3d模型网站https://free3d.com/3d-models/3d-printable-obj 随便找了一个模型 它的OBJ文件内容为: # File exported by ZBrush version 4.4 # www.zbrush.com #Vertex Count 20545 #UV Vertex Count ...

qq_38105943的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Latex
下一篇: 使用C++和C语言输入输出16进制数、8进制数
木禾DING
博客等级 码龄8年 191粉丝 121原创
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值