看openGl写代码(11) 第一个 三维物体

1.在 写这段 程序 的 一开始 ,图形 没有 出来,因为 在 reShape函数 没写 投影矩阵的 函数;

2.还有 这段程序 我跟踪了 一下,首先  执行 reShape ,然后 才是 disPlay 函数,挺奇怪的。

等待 以后自己解答!如果 有好心的 博友 解答就是 极好的了。

学习了 新的 几个 OPENGL 函数。但是 对于 为什么 图形 会这样, 不明白!!!

void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

该函数定义一个视图矩阵,并与当前矩阵相乘。

第一组eyex, eyey,eyez 相机在世界坐标的位置

第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置

第三组upx,upy,upz 相机向上的方向在世界坐标中的方向

你把相机想象成为你自己的脑袋:

第一组数据就是脑袋的位置

第二组数据就是眼睛看的物体的位置

第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)

void gluPerspective(

GLdouble fovy, //角度

GLdouble aspect,//视景体的宽高比

GLdouble zNear,//沿z轴方向的两裁面之间的距离的近处

GLdouble zFar //沿z轴方向的两裁面之间的距离的远处

)

glFrustum : 设置透视矩阵,并与当前矩阵相乘;

left,right指明相对于垂直平面的左右坐标位置

bottom,top指明相对于水平剪切面的下上位置

nearVal,farVal指明相对于深度剪切面的远近的距离,两个必须为正数

// cube.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <gl/glut.h>

void init(){
	glClearColor(0,0,0,0);
	//glEnable(GL_DEPTH_TEST);
}

void display(){
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1,1,1);
	glLoadIdentity();
	gluLookAt(0.0,0.0,10,  0.0,0.0,0.0,  0.0,-1.0,0.0);
	//glTranslatef(0,0,-5);
	//glScalef(1,2,1);
	glutWireCube(4.0);
	//glutSwapBuffers();
	glFlush();
}

void reShape(int width,int height){
	glViewport(0,0,width,height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-1,1,-1, 1,1.5,20);
	//gluPerspective(50,1,10,20);
	glMatrixMode(GL_MODELVIEW);
}

int _tmain(int argc, _TCHAR* argv[])
{
	glutInit(&argc,(char**)argv);
	glutInitDisplayMode(GLUT_SINGLE);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(100,100);
	glutCreateWindow("我的第一个三维物体!");
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reShape);
	glutMainLoop();
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 17:36:12

看openGl写代码(11) 第一个 三维物体的相关文章

看opengl写代码(3) 实现矩阵的旋转

参考   opengl编程指南   P17    直接上代码: <span style="font-size:18px;">// doubleBuffer.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <gl/glut.h> static GLint spin = 0; void init(){ glClearColor(0.0,0.0,0.0,0.0); glShadeModel(

看opengl 写代码(4) 画一个圆

opengl 编程指南 P30 下面代码 是 用 直线 连起来 画一个圆. // circle.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <gl/glut.h> #include <cmath> #define LENGTH 100 #define PI 3.1415926 void init(){ glClearColor(0,0,0,0); } void display(){ glColor3f

看opengl写代码(10) 使用属性数组

众所周知,OPENGL 是一个状态机,有很多 各种 各样的 状态.我们 可以 使用 属性数组 来 保存 / 恢复 一组 状态.总共 有 20组 服务器属性组  和 2组 客户端属性组. 关于 这些属性组 里 有哪些 属性. 这个网站 详细 说明了: http://www.cnblogs.com/oiramario/archive/2010/04/13/1711114.html glPushAttrib(mask) :参数 mask  代表着 某种属性组: 函数 将 属性组 的 当前 属性 入栈.

看 opengl 写代码(1) 搭建开发环境(vs2012 + glut)

博主 无私奉献:(vs2012 + glut) 开发 环境 配置 序:看到本文章,祝贺你,你至少省掉了 1 个小时 苦苦寻找 搭建 方法的时间. 下面搭建方法为本博主 亲测.有事 可以 留言 或者 私密我. 1.从我的网盘里 下载 glut http://pan.baidu.com/s/1dDGYnp3 2.下载完 以后 ,会 有 5个 文件 和 一个 说明 txt 具体 操作 如下: 32位Windows环境下安装GLUT的步骤 1.将glut.h复制到C:\Program Files (x8

看opengl写代码(7) 使用混合数组(glInterLeavedArrays)

glInterLeavedArrays 函数  有 三个 参数 : mode ,stride,pointer. mode :指示 开启 哪些 顶点数组,以及 顶点数组 使用的 数据类型.其余的 顶点数组 关闭.总共有14组.具体 可以 参加 <OPENGL 编程指南>2.6.6混合数组 小节. stride: 指示了 顶点 数据 之间的 间隔.一般 为0 pointer: 指针,指向 顶点数组 数据. 使用 glInterLeavedArrays  会 提高 应用程序的性能.并且 数据 的准确

看opengl写代码(6)glArrayElement,,glDrawElements和glDrawArrays

glArrayElement,,glDrawElements和glDrawArrays: 这三个 都是 使用 顶点 数组 绘制的 OpenGl函数. glArrayElement 每次 只能 使用 一组 顶点数据,并且 必须 在 GLbegin 和 glend 之间 绘制. glDrawElements 每次 可以 绘制 多组 顶点数据,顺序 可以 任意 存放,无  glBegin 和 glend 的限制. glDrawArrays 每次 可以绘制 多组顶点数据,必须 从 起点 到 终点 按顺序

看数据结构写代码(32) 赫夫曼树编码以及译码

杂谈:最近有点慵懒,不好不好.好几天都没写代码,原本准备上星期完结 树 这一章节的.现在 又耽误了.哎.要抓紧时间啊. 下面直接上代码: 可以到我的网盘下载源代码,或者 直接拷贝下面的源代码 运行 网盘地址:点击打开链接 // HuffmanTree.cpp : 定义控制台应用程序的入口点. //哈弗曼编码,译码 #include "stdafx.h" #include <stdlib.h> #include <cstring> enum E_State { E

看数据结构写代码(4)单链表

单链表比较简单,中间倒也没出什么大问题,只是 在写 插入 和 删除的 算法的 时候 ,时间复杂度 是正常 算法的2倍.后来 改正了. 下面奉上代码.如有 bug,欢迎指出. // SingleList.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <cstdlib> enum E_State { E_State_Error = 0, E_State_OK = 1, }; typedef int ElementTyp

看数据结构写代码(50)伙伴系统

伙伴系统 是一种 只 可以 分配 2的 幂次方 个 空间的 ,回收 内存 时 只 合并 "伙伴空间" 的一种 动态内存管理方式. 例如 一个 空间 大小 为 64 的 内存,伙伴 系统 为 这 64 的内存  建立 一组 双向循环 链表,分别 管理着  2的 0 次方,2的1 次方幂,2的 2 次方幂...2的6次方幂的 可用空间. 即使 我们 只想分配 一个 大小 为3的 空间,系统 却 只能 返回 一个 内存 大小 为 4(2的2次方)的 一个空间. 系统 在 初始化的 时候 ,并