【OpenGL】画立方体
编写一个程序,该程序运行时可以用鼠标的一个按键调整立方体的方向,用另一个按键平移立方体,用第三个按键缩放立方体。
这是题目,我的程序不一定完全按照这个来。初学OpenGL,对那一堆坐标系表示十分混乱,慢慢看吧,有点头绪了。
(一)
#include <gl/glut.h>
#include <math.h>
#define GL_PI 3.1415f GLfloat xRot = -35.0f;
GLfloat yRot = 15.0f;
GLfloat xMov = 0.0f;
GLfloat winW = 0.0f;
GLfloat winH = 0.0f;
GLfloat zoom = 1.0f; void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT); glPushMatrix();
glLoadIdentity();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f); // 底面
glBegin(GL_LINE_LOOP);
glVertex3f(0.0f+xMov, 0.0f, 0.0f);
glVertex3f(1.0f+xMov, 0.0f, 0.0f);
glVertex3f(1.0f+xMov, 0.0f, 1.0f);
glVertex3f(0.0f+xMov, 0.0f, 1.0f);
glEnd(); // 顶面
glBegin(GL_LINE_LOOP);
glVertex3f(0.0f+xMov, 1.0f, 1.0f);
glVertex3f(0.0f+xMov, 1.0f, 0.0f);
glVertex3f(1.0f+xMov, 1.0f, 0.0f);
glVertex3f(1.0f+xMov, 1.0f, 1.0f);
glEnd(); // 背面
glBegin(GL_LINE_LOOP);
glVertex3f(0.0f+xMov, 0.0f, 0.0f);
glVertex3f(1.0f+xMov, 0.0f, 0.0f);
glVertex3f(1.0f+xMov, 1.0f, 0.0f);
glVertex3f(0.0f+xMov, 1.0f, 0.0f);
glEnd(); // 前面
glBegin(GL_LINE_LOOP);
glVertex3f(1.0f+xMov, 0.0f, 1.0f);
glVertex3f(0.0f+xMov, 0.0f, 1.0f);
glVertex3f(0.0f+xMov, 1.0f, 1.0f);
glVertex3f(1.0f+xMov, 1.0f, 1.0f);
glEnd(); // 右面
glBegin(GL_LINE_LOOP);
glVertex3f(1.0f+xMov, 0.0f, 0.0f);
glVertex3f(1.0f+xMov, 0.0f, 1.0f);
glVertex3f(1.0f+xMov, 1.0f, 1.0f);
glVertex3f(1.0f+xMov, 1.0f, 0.0f);
glEnd(); // 左面
glBegin(GL_LINE_LOOP);
glVertex3f(0.0f+xMov, 0.0f, 0.0f);
glVertex3f(0.0f+xMov, 0.0f, 1.0f);
glVertex3f(0.0f+xMov, 1.0f, 1.0f);
glVertex3f(0.0f+xMov, 1.0f, 0.0f);
glEnd(); glPopMatrix();
glFlush();
}
void OnReshape(int w, int h)
{
GLfloat aspectRatio = (GLfloat)w/(GLfloat)h;
winW = w;
winH = h; glViewport(,,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
{
glOrtho(-3.0f*zoom, 3.0f*zoom, -3.0f*zoom/aspectRatio, 3.0f*zoom/aspectRatio, -10.0f*zoom, 10.0f*zoom);
}
else{
glOrtho(-3.0f*zoom*aspectRatio, 3.0f*zoom*aspectRatio, -3.0f*zoom, 3.0f*zoom, -10.0f*zoom, 10.0f*zoom);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void OnMouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
xRot += ;
yRot += ;
glutPostRedisplay();
}
else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
{
xMov -= 0.1;
glutPostRedisplay();
}
else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
{
zoom += 0.1;
OnReshape(winW,winH);
glutPostRedisplay();
}
}
void OnKeyUpDown(int key, int x, int y)
{
if (key == GLUT_KEY_UP){
zoom -= 0.1;
}
else if (key == GLUT_KEY_DOWN){
zoom += 0.1;
}
OnReshape(winW,winH);
glutPostRedisplay();
} void SetupRC()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
} void main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("Cube");
glutDisplayFunc(RenderScene);
glutReshapeFunc(OnReshape);
glutMouseFunc(OnMouse);
glutSpecialFunc(OnKeyUpDown); SetupRC(); glutMainLoop();
}
这个程序略长,显得有点笨。手工实现了平移和放大缩小的功能,值得记录一下。
(二)
#include <windows.h>
#include<gl/glut.h>
#include <math.h>
#include<stdio.h> GLfloat angle=0.0f;
GLfloat translate_x=0.0f;
GLfloat zoom=1.0f; void myDisplay()
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0f, 1.0f, 1.0f);
glPushMatrix();
{
glMatrixMode(GL_MODELVIEW); //切换到模型视图矩阵
glLoadIdentity();
glRotatef(angle,1.0f,0.0f,0.0f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
glTranslatef(translate_x,0.0f,0.0f);
glScalef (zoom, zoom, zoom);
glutWireCube(1.5); //画立方体
}
glPopMatrix();
glFlush();
} void reshape(int w,int h)
{
glViewport (, , (GLsizei) w, (GLsizei) h); //调整视口位置和大小
glMatrixMode (GL_PROJECTION);//切换到投影矩阵
glLoadIdentity();//加载单位阵至投影矩阵
if (w <= h){
glOrtho(-3.0f, 3.0f, -3.0f/(w/h), 3.0f/(w/h), -3.0f, 3.0f);
}
else{
glOrtho(-3.0f*w/h, 3.0f*w/h, -3.0f, 3.0f, -3.0f, 3.0f);
} glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
} void OnMouse(int button, int state, int x, int y)
{
//鼠标左键
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
angle += 10.0f;
glutPostRedisplay();
}
//鼠标右键
else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
{
translate_x+=0.1f;
glutPostRedisplay();
}
//鼠标滚轮
else if (state == GLUT_UP && button == GLUT_WHEEL_DOWN)
{
if(zoom>)
zoom-=0.1f;
glutPostRedisplay();
}
else if(state == GLUT_UP && button == GLUT_WHEEL_UP)
{
zoom+=0.1f;
glutPostRedisplay();
}
} int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(,);
glutInitWindowSize(,);
glutCreateWindow("cube"); glutDisplayFunc(myDisplay);
glutReshapeFunc(reshape);
glutMouseFunc( OnMouse );
glutMainLoop();
return ;
}
采用了OpenGL的一些库函数实现,投影还是采用平行投影,表示对透视投影函数gluPerspective以及视点变化函数gluLookAt不是很清楚。
(三)
#include <windows.h>
#include<gl/glut.h>
#include <math.h>
#include<stdio.h> GLfloat angle=0.0f;
GLfloat translate_x=0.0f;
GLfloat zoom=1.0f; void myDisplay()
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0f, 1.0f, 1.0f);
glPushMatrix(); glMatrixMode(GL_MODELVIEW); //切换到模型视图矩阵
glLoadIdentity();
gluLookAt (0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); //设置相机参数
glRotatef(angle, 0.0f, 1.0f, 0.0f);
glTranslatef(translate_x,0.0f,0.0f);
glScalef (zoom, zoom, zoom);
glutWireCube(0.5); //画立方体 glPopMatrix();
glFlush();
} void reshape(int w,int h)
{
glViewport (, , (GLsizei) w, (GLsizei) h); //调整视口位置和大小
glMatrixMode (GL_PROJECTION);//切换到投影矩阵
glLoadIdentity();//加载单位阵至投影矩阵
gluPerspective(,w/h,,);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
} void OnMouse(int button, int state, int x, int y)
{
//鼠标左键
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
angle += 10.0f;
glutPostRedisplay();
}
//鼠标右键
else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
{
//xMov -= 0.1;
translate_x+=0.1f;
glutPostRedisplay();
}
//鼠标滚轮
else if (state == GLUT_UP && button == GLUT_WHEEL_DOWN)
{
if(zoom>)
zoom-=0.1f;
glutPostRedisplay();
}
else if(state == GLUT_UP && button == GLUT_WHEEL_UP)
{
zoom+=0.1f;
glutPostRedisplay();
}
} int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(,);
glutInitWindowSize(,);
glutCreateWindow("cube"); glutDisplayFunc(myDisplay);
glutReshapeFunc(reshape);
glutMouseFunc( OnMouse );
glutMainLoop();
return ;
}
用的是透视投影。我的理解是gluPerspective()和gluLookAt()要配合使用,二者中的相机位置要一致。
【OpenGL】画立方体的更多相关文章
- OpenGL 画出雷达动态扫描效果(二) 非底图
OpenGL 画出雷达动态扫描效果(一)中给出了已一张图片作为底图的雷达扫面程序 如果有漂亮的雷达底图的话,效果应该非常不错的,另外也可以直接手绘雷达框架 效果如下 雷达主体代码 glLineWidt ...
- 46.Qt 使用OpenGL绘制立方体
main.cpp #include <QApplication> #include <iostream> #include "vowelcube.h" in ...
- opengl画不出直线 线段 坐标轴 却能画出其他图形的坑
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12054507.html 好多次都是画坐标轴的三条直线画不出来,虽然最后都解决了 但是还是耽误 ...
- opengl画圆
通过这个例子可以更加深刻的了解割圆术的原理,明白如何的化曲为直,且看代码: #include <windows.h> //#include <GLUT/glut.h> #inc ...
- 用OpenGL进行立方体表面纹理贴图
一.目的 掌握OpenGL中纹理对象的创建.绑定与使用方法. 二.简单介绍 1,连接静态库 #pragma comment(lib, "glut32.lib") #pragma c ...
- OpenGL 画出雷达动态扫描效果(一)
最终效果如下所示 Demo下载 http://files.cnblogs.com/xd-jinjian/Debug.zip 源代码下载 http://download.csdn.net/detail ...
- 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆
为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...
- 用OpenGL画线
. 两点之间的连线称之为线段,在屏幕上显示线段放在现在已经不是稀奇的事情,大多数高级图形API都可以轻松实现,我尝试用OpenGL画线,在这里记录一下收获. . OpenGL这个级别的图形API,通常 ...
- OpenGL 画高斯随机函数
高斯函数代码 const float CFFTOceanShader::_getGaussianRandomFloat() const { float u1 = rand() / (float)RAN ...
随机推荐
- 认识FiddlerScript
FiddlerScript 是Fiddler 的一项非常强大的功能,它允许你增强Fiddler UI,添加新的特性,修改请求与响应内容等等... 1.编写FiddlerScript FiddlerSc ...
- 几款国产开源的Windows界面库
上次介绍的几款图形界面库http://blog.okbase.net/vchelp/archive/23.html都是国外的开源项目,今天介绍的几款都是国人的开源项目,大部分是采用DirectUI设计 ...
- 李洪强iOS开发本人集成环信的经验总结_09_处理好友请求
李洪强iOS开发本人集成环信的经验总结_09_处理好友请求 实现这种效果: 01 - 遵守处理好友请求的代理协议 02 - 设置代理 03 - 实现代理方法 04 - 实现代理中用到的方法
- Apache Tomcat下载、安装、配置图文教程
本文已迁移到我的个人网站 http://www.wshunli.com 文章地址: http://www.wshunli.com/2016/03/19/Tomcat安装配置/ (整理截图.安装过程更加 ...
- memcache简易教程
1. memcache是什么 memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web应用以减轻数据库负担.它通过在内存中缓存数据和对象,来减少读取数据库的次数.从而提高动态.数据库驱 ...
- Java 关于中文乱码处理的经验总结【转载】
为什么说乱码是中国程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!如果中国的程序员不会遇到乱码,那么只有使用汉语编程.汉语编程是怎么回事我也 ...
- 第三部分 overlay 学习
前文仅了解了overlay HAL的架构,下面继续看看系统层是如何调用Overlay模块. 1.测试代码 frameworks/base/libs/surfaceflinger/tests/overl ...
- poj 3009 Curling 2.0( dfs )
题目:http://poj.org/problem?id=3009 参考博客:http://www.cnblogs.com/LK1994/ #include <iostream> #inc ...
- BZOJ2668: [cqoi2012]交换棋子
题解: 可以戳这里:http://www.cnblogs.com/zig-zag/archive/2013/04/21/3033485.html 其实自己yy一下就知道这样建图的正确性了. 感觉太神奇 ...
- 使用powerdesigner 画图的详细说明
一.概念数据模型概述 数据模型是现实世界中数据特征的抽象.数据模型应该满足三个方面的要求: 1)能够比较真实地模拟现实世界 2)容易为人所理解 3)便于计算机实现 概念数据模型也称信息模型,它以实体- ...