OpenGL消隐凸多面体

利用外法线法,绘制任意一个消隐凸多面体,要求:

(1)视点由用户输入;

(2)消隐部分用虚线绘制。

#include <iostream>
#include <cmath>
#include<windows.h>
#include<stdlib.h>
#include<gl/glut.h>
#include<stdio.h>
#include<math.h> //X86
#include<glaux.h>
using namespace std;
void Init()
{
	glClearColor(0.0f, 0.0f, 0.1f, 0);//清除颜色函数。会清除(即绘制)的背景色。
	//glCullFace(GL_BACK);//背面不可见
	//glEnable(GL_CULL_FACE);//裁剪
	//glEnable(GL_TEXTURE_2D);//开启纹理
}void Reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	//glMatrixMode设置接下来的矩阵操作为投影矩阵或模型视图矩阵
	//GL_PROJECTION参数用于设置接下来的操作为投影矩阵,GL_MODELVIEW参数则用于设置接下来的操作为模型视图矩阵。
	//投影矩阵定义了从视点到裁剪平面的映射,决定了哪些物体可以被渲染以及它们在窗口中的位置。
	//	模型视图矩阵则定义了物体在空间中的位置、旋转和缩放。
	glLoadIdentity();

	glOrtho(-w / 2, w / 2, -h / 2, h / 2, -300, 300);//设置一个二维的正交投影矩阵。void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
void XYZ() {
	//gluLookAt(1, 1, 1, 0,0,0, 0, 1, 0);
	glLineWidth(1);
	//glColor3f(0.0, 0.0, 0.0);//坐标轴
	glColor3f(0.1, 0.1, 0.1);
	glBegin(GL_LINES);
	glColor3f(1.0, 0.0, 0.0);
	glVertex3i(-1000, 0,0);
	glVertex3i(1000, 0,0);
	glColor3f(0.0, 1.0, 0.0);
	glVertex3i(0, -1000,0);
	glVertex3i(0, 1000,0);
	glColor3f(0.0, 0.0, 1.0);
	glVertex3i(0,0, -1000);
	glVertex3i(0,0, 1000);
	glEnd();
	glFlush();
}
void mydisplay() {
	int x[10] = { 50,50,25,0,0,50,50,25,0,0 };
	int y[10] = { 0,40,60,40,0,0,40,60,40,0 };
	int z[10] = { 140,140,140,140,140,0,0,0,0,0 };
	int f[7] = { 0,1,2,3,4,5,6 };
	int p[7] = { 6,5,6,5,5,5,5 };
	int fp[7][6] = { {0,1,2,3,4,0},{0,5,6,1,0},{5,9,8,7,6,5},{9,4,3,8,9},
		{1,6,7,2,1 },{3,2,7,8,3},{0,4,9,5,0}
	};
	int SN;
	int p1, p2, p3, u1, u2, u3, v1, v2, v3;

	glClear(GL_COLOR_BUFFER_BIT);
	glLoadIdentity();

	cout << "请输入视角:" << endl;
	int vi1, vi2, vi3;
	cin>> vi1 >> vi2 >> vi3;

	gluLookAt(vi1, vi2, vi3, 0, 0, 0, 0, 1, 0);
	XYZ();
	glLineWidth(3);
	glColor3f(1.0, 1.0, 1.0);
	for (int i = 0; i < 7; i++) {
		p1 = fp[i][0];
		p2 = fp[i][1];
		p3 = fp[i][2];
		u1 = x[p2] - x[p1];
		u2 = y[p2] - y[p1];
		u3 = z[p2] - z[p1];
		v1 = x[p3] - x[p2];
		v2 = y[p3] - y[p2];
		v3 = z[p3] - z[p2];
		SN = vi1*(u2 * v3 - u3 * v2) + vi2*(u3 * v1 - u1 * v3) + vi3*(u1 * v2 - u2 * v1);//能不能看见
		if (SN <= 0) f[i] = -1;
	}
	
	for (int i = 0; i < 7; i++){
		if (f[i] == -1) {
			if (f[i] == -1) {
				glLineStipple(2, 0xf0f0);
				glEnable(GL_LINE_STIPPLE);
				glBegin(GL_LINE_STRIP);
				for (int j = 0; j < p[i]; j++) {
					int k = fp[i][j];
					glVertex3i(x[k], y[k], z[k]);
				}
				Sleep(100);
				glEnd();
				glFlush();
				glDisable(GL_LINE_STIPPLE);
			}
			//continue;
		}//看不见的
		else {
			glBegin(GL_LINE_STRIP);
			for (int j = 0; j < p[i]; j++) {
				int k = fp[i][j];
				glVertex3i(x[k], y[k], z[k]);		
			}
			Sleep(100);
			glEnd();
			glFlush();
		}
		
	}

}
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");

	/*int menuld = glutCreateMenu(menu);
	glutAddMenuEntry("Hermiteth", 1);
	glutAddMenuEntry("Bezierth", 2);
	glutAddMenuEntry("Bspline", 3);
	glutAddMenuEntry("Bezierogee", 4);
	glutAddMenuEntry("improve", 5);
	glutAddMenuEntry("End", 6);
	glutAttachMenu(GLUT_RIGHT_BUTTON);*/

	Init();
	glutReshapeFunc(Reshape);
	glutDisplayFunc(mydisplay);
	glutMainLoop();
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值