OpenGL中线框图的消隐

本文介绍了一种使用OpenGL实现隐藏线消除的技术,通过深度缓存和多通道绘制来实现场景中复杂对象的高效渲染。具体步骤包括禁用颜色缓存、启用深度测试、设置多边形填充模式和偏移参数、绘制对象并启用颜色缓存,最后以线形式绘制对象中的线段。

隐藏线消除
使用深度缓存的2通道绘制的OpenGL实现:
1. 禁写颜色缓存
    glColorMask(0, 0, 0, 0);
2. 启用深度测试
    glEnable(GL_DEPTH_TEST);
    glDepthFunc (GL_LESS);
3. 以多边形填充模式绘制对象,要使用多边形偏移(Pass1)
    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
    glPolygonOffset(1.1f, 4.0f);
    glEnable (GL_POLYGON_OFFSET_FILL);  //启用多边形偏移
    drawScene ();
    glDisable (GL_POLYGON_OFFSET_FILL);
4. 启用颜色缓存
    glColorMask(1, 1, 1, 1);
5. 采用两种线绘制方式之一绘制对象中包含的线段(Pass2).

具体实现代码

int DrawGLScene(GLvoid)        // 从这里开始进行所有的绘制
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
    glLoadIdentity();     // 重置模型观察矩阵
    glTranslatef(0.0f,0.0f,-5.0f);      // 移入屏幕 5 个单位
    static float xrot=0.0f,yrot=0.0f,zrot=0.0f;
    glRotatef(xrot,1.0f,0.0f,0.0f);      // 绕X轴旋转
    glRotatef(yrot,0.0f,1.0f,0.0f);      // 绕Y轴旋转
    glRotatef(zrot,0.0f,0.0f,1.0f);      // 绕Z轴旋转
   
    glDisable(GL_TEXTURE_2D);
   
    glColorMask(0,0,0,0);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glPolygonOffset(1.1f, 4.0f);
    glEnable (GL_POLYGON_OFFSET_FILL);  //启用多边形偏移
    //auxSolidSphere(1.0);
    auxSolidTeapot(1.0);
    glDisable (GL_POLYGON_OFFSET_FILL);
    glColorMask(1, 1, 1, 1);
    glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
    //auxSolidSphere(1.0);
    auxSolidTeapot(1.0);
   
    xrot+=1.3f;        // X 轴旋转
    yrot+=1.2f;        // Y 轴旋转
    zrot+=1.4f;        // Z 轴旋转
    return TRUE;       //  一切 OK
}


效果图:

#include <GL/glut.h>

int gwin = 0;
static float xrot = 0.0f, yrot = 0.0f, zrot = 0.0f;

void render()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
	glLoadIdentity();							// 重置模型观察矩阵

	glTranslatef(0.0f, 0.0f, -6.0f);			// 移入屏幕 5 个单位
	glRotatef(xrot, 1.0f, 0.0f, 0.0f);			// 绕X轴旋转
	glRotatef(yrot, 0.0f, 1.0f, 0.0f);			// 绕Y轴旋转
	glRotatef(zrot, 0.0f, 0.0f, 1.0f);			// 绕Z轴旋转

	glDisable(GL_TEXTURE_2D);

	glColorMask(0, 0, 0, 0);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glPolygonOffset(1.1f, 4.0f);
	glEnable (GL_POLYGON_OFFSET_FILL);  //启用多边形偏移
	glutSolidTeapot(1.0f);

	glDisable (GL_POLYGON_OFFSET_FILL);
	glColorMask(1, 1, 1, 1);
	glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
	glutSolidTeapot(1.0f);

	xrot += 1.3f;        // X 轴旋转
	yrot += 1.2f;        // Y 轴旋转
	zrot += 1.4f;        // Z 轴旋转

	glutSwapBuffers();
	glutPostRedisplay();
}
void resize(int w, int h)
{
	glViewport(0, 0, w, h);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.f, (GLfloat)w / h, 0.1f, 100.f);

	glMatrixMode(GL_MODELVIEW);
}
void init()
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glClearDepth(1.0f);
	glDepthFunc(GL_LESS);
	glEnable(GL_DEPTH_TEST);
	glShadeModel(GL_SMOOTH);
}
int main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
	glutInitWindowSize(640, 480);
	gwin = glutCreateWindow("glPolygonOffset");

	init();

	glutReshapeFunc(resize);
	glutDisplayFunc(render);
// 	glutIdleFunc(render);
	glutMainLoop();

	return 0;
}

http://blog.csdn.net/y___y/article/details/1568341

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值