opengl的坐标指向问题,glmatrixmode(gl_modeview)对其有何影响?

woshiniaoshi 2009-02-01 07:20:46
画了一个三维坐标轴,带箭头,和一个正空间的立方体,我怎么觉得它好像z轴是指向屏幕里面的,源码如下:

//最初的疑惑即是来自于此程序,一个立方体x转-30,y转-30之后,有深度检测
//可以看到z是指向里面的


//#include <windows.h>
#include <gl/glut.h>

static float angle_x = 0, angle_y=-10,angle_z=0;

void zuobiao() //画出坐标线,正方向有箭头
{

glBegin(GL_LINES);
glColor3f(1.0,0.0,0.0);
glVertex3f(-0.25f,0.0f,0.0f); //x 红
glVertex3f(0.8f,0.0f,0.0f);

glColor3f(0.8f,0.5f,0.9f);
glVertex3f(0.0f,-0.25f,0.0f); //y
glVertex3f(0.0f,0.8f,0.0f);

glColor3f(1.0,1.0,1.0);
glVertex3f(0.0f,0.0f,-0.5f); //z 白
glVertex3f(0.0f,0.0f,0.8f);
glEnd();


glBegin(GL_TRIANGLES);

glVertex3f(-0.1,-0.1,0.8);//z
glVertex3f(0.1,0.1,0.8);
glVertex3f(0.0,0.0,1.0);

glColor3f(1.0,0.0,0.0);//x
glVertex3f(0.8,0.1,0.1);
glVertex3f(0.8,-0.1,-0.1);
glVertex3f(1.0,0.0,0.0);
glColor3f(0.8f,0.5f,0.9f);//y
glVertex3f(-0.1,0.8,0.1);
glVertex3f(0.1,0.8,-0.1);
glVertex3f(0.0,1.0,0.0);

glEnd();

}


void myplay() //6面都有的立方体
{


glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/* gluPerspective(60.0f,1,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-2);

*/

glRotatef(-30,0,1,0); // 面朝y的正方向,绕y轴逆时针旋转 -30
glRotatef(-30,1,0,0);//面朝x的正方向,绕x轴逆时针旋转 -30
zuobiao(); //自己定义的一个画出3根坐标线的函数,在正方向有箭头
glBegin(GL_POLYGON); //
glColor3f(1.0,0.0,0.0);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.5f,0.0f);
glVertex3f(0.5f,0.5f,0.0f);
glVertex3f(0.5f,0.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3f(1.0f,1.0,0.0);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.5f,0.0f);
glVertex3f(0.0f,0.5f,0.5f);
glVertex3f(0.0f,0.0f,0.5f);
glEnd();

glBegin(GL_POLYGON);
glColor3f(1.0,0.0,1.0);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,0.5f);
glColor3f(1.0,0.0,0.0);
glVertex3f(0.5f,0.0f,0.5f);
glColor3f(0.0,1.0,0.0);
glVertex3f(0.5f,0.0f,0.0f);
glEnd();

glBegin(GL_POLYGON);
glColor3f(0.0,1.0,0.0);
glVertex3f(0.0f,0.5f,0.0f);
glVertex3f(0.5f,0.5f,0.0f);
glVertex3f(0.5f,0.5f,0.5f);
glVertex3f(0.0f,0.5f,0.5f);
glEnd();

glBegin(GL_POLYGON);
glColor3f(0.0,1.0,1.0);
glVertex3f(0.5f,0.5f,0.0f);
glVertex3f(0.5f,0.5f,0.5f);
glVertex3f(0.5f,0.0f,0.5f);
glVertex3f(0.5f,0.0f,0.0f);
glEnd();

glBegin(GL_POLYGON);
glColor3f(0.4,1.0,0.6);
glVertex3f(0.5f,0.5f,0.5f);
glVertex3f(0.5f,0.0f,0.5f);
glVertex3f(0.0f,0.0f,0.5f);
glVertex3f(0.0f,0.5f,0.5f);
glEnd();

glFlush();
}

int main(int argc, char *argv[])

{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(300,200);
glutInitWindowSize(400,400);
glutCreateWindow("立方体");
glutDisplayFunc(&myplay);

glutMainLoop();
return 0;
}

如果加上myplay()中的注释掉的代码,就可以实现投影空间,也就是有近大远小的效果,可是这时候我发现旋转的角度又不对了,不再是绕轴逆时钟旋转了,难道此时旋转的是看物体的眼睛而不再是物体了?
望各位赐教,祝各位牛年大吉!
...全文
980 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
IONPhantom 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 woshiniaoshi 的回复:]
谢谢您,我似乎理解一点了,就是如果设置了glMatrixMode(GL_MODEVIEW)那接下来的操作就是对眼睛的操作了,可以这样理解吗
但是我还是不明白第一个问题,我的源码运行为什么可以看到z轴是指向里面的?
源码设置的是glMatrixMode(GL_PROJECTION); 旋转的角度方向也是对的
为什么z轴向里?

我想把我的图贴出来但是不知道怎么贴,能麻烦您把我的源码运行一下,指点一下吗
[/Quote]
GL_MODEVIEW和GL_PROJECTION其实都是在设置摄像机的属性,之所以设置它俩能"改变"物体的位置和朝向是因为你要使用摄像机来观察物体,对于物体来说改变View和Proj Matrix对逻辑意义上的物体并没有关系.

Z轴朝向也是同一个问题,只要你的三个轴的朝向分别是 X(1,0,0) Y(0,1,0) Z(0,0,1) 那么Z轴的方向就已经固定了,它本质的朝向不会因为改变了,但是它看起来会发生改变是也是因为摄像机的问题,摄像机的位置改变了造成观察的时候物体(坐标轴也是物体)改变了
wxfasdic_12 2009-04-15
  • 打赏
  • 举报
回复
你好,我想问一下,怎么让坐标系不动,而绘制的物体转动呢?
zzz822163 2009-02-04
  • 打赏
  • 举报
回复
眼睛默认是朝向Z轴负方向的,你需要用gluLookAt()来设置一下眼睛
zzz822163 2009-02-02
  • 打赏
  • 举报
回复
glMatrixMode():指定哪一个矩阵是当前矩阵

C语言描述

void glMatrixMode(GLenum mode)

参数

mode指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值:GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE.

说明

glMatrixMode设置当前矩阵模式:

GL_MODEVIEW,对模型视景矩阵堆栈应用随后的矩阵操作。

GL_PROJECTION,对投影矩阵应用随后的矩阵操作。

GLTEXTURE,对纹理矩阵堆栈应用随后的矩阵操作。
=============================
其实GL_MODEVIEW和GL_PROJECTION只是相对的概念,移动物体和移动眼睛都可以达到相同的目的,

woshiniaoshi 2009-02-02
  • 打赏
  • 举报
回复
谢谢您,我似乎理解一点了,就是如果设置了glMatrixMode(GL_MODEVIEW)那接下来的操作就是对眼睛的操作了,可以这样理解吗
但是我还是不明白第一个问题,我的源码运行为什么可以看到z轴是指向里面的?
源码设置的是glMatrixMode(GL_PROJECTION); 旋转的角度方向也是对的
为什么z轴向里?

我想把我的图贴出来但是不知道怎么贴,能麻烦您把我的源码运行一下,指点一下吗
woshiniaoshi 2009-02-02
  • 打赏
  • 举报
回复
[img=C:\Documents and Settings\Administrator\桌面\立方体.bmp]C:\Documents and Settings\Administrator\桌面\立方体.bmp[/img]
woshiniaoshi 2009-02-02
  • 打赏
  • 举报
回复
C:\Documents and Settings\Administrator\桌面\立方体.bmp


源码链接: https://pan.quark.cn/s/a4b39357ea24 ### Ubuntu 用户磁盘空间分配与 Linux 硬盘分区方案深入剖析 #### 标题与描述中的核心知识要点说明 本文件将系统性地阐释在 Ubuntu 操作系统中如何为用户科学地分配磁盘空间,并深入分析适用于 Linux 的硬盘分区策略。文件不仅会介绍基础的目录结构及其功能,还会提供具体的分区指导以及在实际操作过程中需要留意的事项。 #### 目录结构及其功能说明 - **/bin**:系统常用基础命令的存储位置。 - **/boot**:包含启动时所需文件,例如内核镜像和初始化脚本等。 - **/dev**:存放设备文件。 - **/etc**:存储系统配置信息。 - **/home**:用户个人目录,每个用户拥有独立的子目录。 - **/lib**:存放运行二进制文件所需的共享库。 - **/mnt**:用于临时挂载其他文件系统的目录,可用于挂载软盘或 CD-ROM 设备。 - **/proc**:虚拟文件系统目录,存储当前运行内核的相关信息。 - **/root**:超级用户(root)的主目录。 - **/sbin**:系统管理程序的存放位置。 - **/tmp**:临时文件存储的目录。 - **/usr**:存放只读数据,包括应用程序的可执行文件和文档等。 - **/var**:存储可变数据文件,例如日志文件和邮件队列等。 - **/X11R6**:X Window 系统的安装路径。 #### 硬盘分区策略分析 文件中强调,在 Linux 环境下进行硬盘分区时需要综合考量多个因素,以确保系统的稳定运行和性能表现。以下是一些关键的分区建议: 1. **/boot ...

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧