利用openGL纯手工打造一个金字塔

环境:linux(ubuntu16.4)、gcc

第一步:先出一个三角形线框

  效果:

  

  实现代码:

    Makefile

BDIR = -L/usr/X11R6/lib
CC = gcc
CFLAGS = $(COMPILERFLAGS)
LIBRARIES = -lX11 -lXi  -lglut -lGL -lGLU -lm

pyramid : pyramid.o
    $(CC) $(CFLAGS) -o [email protected] $(LIBDIR) $? $(LIBRARIES)

clean:
    rm -f *.o

  pyramid.c

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glext.h>
#include <sys/time.h>
#include <math.h>
#define GL_PI 3.1415f

void RenderScene(void){
    //用线框绘制
    glPolygonMode(GL_FRONT,GL_LINE);
    //用当前颜色清除屏幕(也就是SetupRC中的 glClearColor 指定的颜色)
    glClear(GL_COLOR_BUFFER_BIT);

    //此三角形位于x、y轴的平面上
    glBegin(GL_TRIANGLES);
        glVertex3f(50.0f,0.0f,0.0f);//右顶点
        glVertex3f(0.0f,50.0f,0.0f);//上顶点
        glVertex3f(-50.0f,0.0f,0.0f);//左顶点
    glEnd();

    glutSwapBuffers();
}

void SetupRC()
    {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f );

    // 设置绘制颜色为绿色
    glColor3f(0.0f, 1.0f, 0.0f);
    }
void ChangeSize(int w, int h)
    {
    GLfloat nRange = 100.0f;

    // 防止清零
    if(h == 0)
        h = 1;

    // 设置视口大小为当前窗口
    glViewport(0, 0, w, h);

    //重置操作矩阵栈
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // 这是透视投影裁截体 (left, right, bottom, top, near, far)
    if (w <= h)
        glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
    else
        glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

    //重置模型视图矩阵
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }

int main(int argc, char* argv[])
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutCreateWindow("Pyramid Example");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);

    SetupRC();
    glutMainLoop();

    return 0;
    }

第二步:实现旋转

  效果(当按上下左右箭头时实现旋转):

  

  实现代码:

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glext.h>

#include <sys/time.h>

#include <math.h>

#define GL_PI 3.1415f

static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;

void RenderScene(void){
    //用线框绘制
    glPolygonMode(GL_FRONT,GL_LINE);
    glPolygonMode(GL_BACK,GL_LINE);

    //用当前颜色清除屏幕(也就是SetupRC中的 glClearColor 指定的颜色)
    glClear(GL_COLOR_BUFFER_BIT);

    //保存当前操作矩阵
    glPushMatrix();

    //绕x轴旋转
    glRotatef(xRot, 1.0f, 0.0f, 0.0f);
    //绕y轴旋转
    glRotatef(yRot, 0.0f, 1.0f, 0.0f);

    //此三角形位于x、y轴的平面上
    glBegin(GL_TRIANGLES);
        glVertex3f(50.0f,0.0f,0.0f);//右顶点
        glVertex3f(0.0f,50.0f,0.0f);//上顶点
        glVertex3f(-50.0f,0.0f,0.0f);//左顶点
    glEnd();
    //恢复当前操作矩阵
    glPopMatrix();

    glutSwapBuffers();
}

void SetupRC()
    {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f );

    // 设置绘制颜色为绿色
    glColor3f(0.0f, 1.0f, 0.0f);
    }
void ChangeSize(int w, int h)
    {
    GLfloat nRange = 100.0f;

    // 防止清零
    if(h == 0)
        h = 1;

    // 设置视口大小为当前窗口
    glViewport(0, 0, w, h);

    //重置操作矩阵栈
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // 这是透视投影裁截体 (left, right, bottom, top, near, far)
    if (w <= h)
        glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
    else
        glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

    //重置模型视图矩阵
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
//控制键
void ControlKeys(int key, int x, int y)
    {
    if(key == GLUT_KEY_UP)
        xRot-= 5.0f;

    if(key == GLUT_KEY_DOWN)
        xRot += 5.0f;

    if(key == GLUT_KEY_LEFT)
        yRot -= 5.0f;

    if(key == GLUT_KEY_RIGHT)
        yRot += 5.0f;

    if(key > 356.0f)
        xRot = 0.0f;

    if(key < -1.0f)
        xRot = 355.0f;

    if(key > 356.0f)
        yRot = 0.0f;

    if(key < -1.0f)
        yRot = 355.0f;

    // Refresh the Window
    glutPostRedisplay();
    }

int main(int argc, char* argv[])
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutCreateWindow("Pyramid Example");
    glutReshapeFunc(ChangeSize);
    glutSpecialFunc(ControlKeys);
    glutDisplayFunc(RenderScene);

    SetupRC();
    glutMainLoop();

    return 0;
    }

原文地址:https://www.cnblogs.com/airduce/p/9900285.html

时间: 2024-08-29 08:18:21

利用openGL纯手工打造一个金字塔的相关文章

一年纯手工打造的Java老A上册开始预售了

Java老A这本书写了很久,昨天终于开始在china-pub上开始预售了,其它网站可能会慢一点,不过既然叫预售,就肯定还没到货. 有兴趣的人可以去看看哈(后续其它网站地址也会在这里公开): http://search.china-pub.com/s/?key1=java%cc%d8%d6%d6%b1%f8&type=&pz=1 关于本书内容,请参考:http://blog.csdn.net/xieyuooo/article/details/38373409 里面有本书的所有目录信息,封面等

手写MyBatis,纯手工打造开源框架(第四篇:决胜千里)- 第272篇

说明 MyBatis版本:3.5.1 相关历史文章(阅读本文之前,您可能需要先看下之前的系列) Spring Boot MyBatis最全教程:你值得拥有MyBatis能脱离Spring吗一图纵览MyBatis的工作原理从源码看MyBatis,竟如此简单MyBatis的Mapper是什么`垃圾` 手写MyBatis,纯手工打造开源框架(第一篇:风云再起) 手写MyBatis,纯手工打造开源框架(第二篇:君临天下) 手写MyBatis,纯手工打造开源框架(第三篇:运筹帷幄) 前言        运

IOS学习之道:使用UIButton纯手工打造的黑白快小游戏.

由于代码量比较多,有兴趣的同学可以去我的资源页进行下载. http://download.csdn.net/detail/tx874828503/8637445 使用UIButton纯手工打造的黑白快小游戏.请勿商业使用,转载请注明出处,谢谢

纯手工打造简单分布式爬虫(Python)

前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. 本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试.这次打造的分布式爬虫采用比较简单的主从模式,完全手工打造,不使用成熟框架,基本上涵盖了前六章的主要知识点,其中涉及分布式的知识点是分布式进程和进程间通信的内容,算是对Python爬虫基础篇的总结. 现在

网友纯手工打造摇摆LED时钟 ,牛!

手工打造摇摆LED时钟 ,牛! 摇摆LED 时钟,感觉非常新颖独特,正在玩单片机的我,激起了自己也想DIY 一个的冲动.不就是一个流水灯吗?有什么难的?! 于是,一个单片机项目就这样开始了.然而动手以后才知道问题并非想象那样简单,因没有任何现成的资料,机械的.电子的和编程的问题一大堆,一个一个需要自己来解决.经历二十多天的苦战和无数次的修改与调试,作品终于完成,基本达到预先要求.    现将制作资料整理出来,与广大DIY 爱好者分享. 一. 整体方案    本制作是根据视觉暂留原理, 让一排8

纯手工打造linux路由器

对由器比较了解的朋友都知道,很多专业级的路由器,也就是用linux系统来做的,那既然如此,如何使用linux主机打造一个路由器了.其实也不难,但我们得首先搞楚路由器的工作原理,说白了路由器也就是两个不同的网络之间转发数据之用的.如果没有路由器,只能在各自的网络内互相通信,跨网络就访问不了了.因为它们之间是相互隔离的,必须要有一个桥梁才能让它们之间正常来往.今天就给大家分享如何使用两台linux主机来打造一台路由器. 一.环境需求 1.两台双网卡主机 2.操作系统:安装Centos7.2 二.路由

纯手工打造(不使用IDE)java web 项目

必备环境 1.编译器:jdk 2.web服务器:tomcat 3.文本编辑器:sublime,编写java文件和jsp文件,没有的话用记事本也行. 一.建立工程目录结构,如下图 在操作系统下完成即可,如在D盘根目录下建立如上结构 二.在“src/com/zyz”目录建立model类文件 Dog.java package com.zyz; public class Dog { private String name; public String getName(){ return this.nam

【实战】利用联合查询--手工SQL注入拿下网站

看到很多脚本小子,工具党用啊D,明小子,穿山甲对网站扫来扫去,拿个后台什么的,其实基础是最重要的,今天我来说一下纯手工注入一个站点. 目标网址:http://www.******.com/about.asp?id=1 1.首先确认这里是否存在整型注入,很简单,url后加' and 1=1 and 1=2,不细说.同时我们还判断出这是Access的数据库. 2.利用order by判断表项有几个: http://www.******.com/about.asp?id=1 order by 4(这里

七夕节送礼不用愁,妹妹爱物多多,不妨进来看看,纯手工作品,价格优惠 ^^*

首语谐音手语,手的语言,即用最真心.纯手工打造的妹妹爱物—— ------------------------------------------------------ 每到各种节日,加班到吐血的IT男们,总是没什么时间准备礼物给女朋友,偶尔想起又不知道送什么的好,女朋友虽然心里不说,多少有些难过.现在推荐老婆的羊毛毡手工店,每一件都是亲手制作,特别是可以个性定制,女朋友收到一定很喜欢.我就是这么哄老婆的,嘿嘿 ^^* -------------------------------------