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()中的注释掉的代码,就可以实现投影空间,也就是有近大远小的效果,可是这时候我发现旋转的角度又不对了,不再是绕轴逆时钟旋转了,难道此时旋转的是看物体的眼睛而不再是物体了?
望各位赐教,祝各位牛年大吉!
...全文
982 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


内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。

19,464

社区成员

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

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