一只Leona 2016-06-19 23:05 采纳率: 0%
浏览 1241

有关于OpenGL三维变化的问题

用二维矩阵实现一些变换,下面代码有注释。。平移,错切,放大缩小是可以运行的。
但是,旋转就越旋越小,对称点完也没有反应。
请大神看一下哪里有错误..
#include
#include
#include

//旋转时用的sita
double sita1=3.14/3;
double sita2=-3.14/3;

//这个类定义了点
class Point2{
public:
GLfloat x,y,a;
};

//四个顶点赋初值
Point2 p[4]={{-0.5,0.5,1},{0.5,0.5,1},{0.5,-0.5,1},{-0.5,-0.5,1}};

//变换矩阵初值
GLfloat varyMatrix[3][3]={{1,0,0},{0,1,0},{0,0,1}};

//每进行一次变换,调用一次这个函数,矩阵相乘。
void VaryMatrix(){
for(int i=0;i<4;i++){
p[i].x=p[i].x*varyMatrix[0][0]+p[i].y*varyMatrix[1][0]+p[i].a*varyMatrix[2][0];
p[i].y=p[i].x*varyMatrix[0][1]+p[i].y*varyMatrix[1][1]+p[i].a*varyMatrix[2][1];
p[i].a=p[i].x*varyMatrix[0][2]+p[i].y*varyMatrix[1][2]+p[i].a*varyMatrix[2][2];
}

//恢复变换矩阵初始值
varyMatrix[0][0]=1;
varyMatrix[0][1]=0;
varyMatrix[0][2]=0;
varyMatrix[1][0]=0;
varyMatrix[1][1]=1;
varyMatrix[1][2]=0;
varyMatrix[2][0]=0;
varyMatrix[2][1]=0;
varyMatrix[2][2]=1;

}

//每进行一次变化后,调用这个函数,重新绘制图形
void reDraw(){
glClear(GL_COLOR_BUFFER_BIT);

//坐标轴
glBegin(GL_LINES);
glVertex2i(-1,0);
glVertex2i(1,0);
glVertex2i(0,-1);
glVertex2i(0,1);
glEnd();

//绘制矩形
glBegin(GL_LINE_LOOP);
glVertex2f(p[0].x,p[0].y);
glVertex2f(p[1].x,p[1].y);
glVertex2f(p[2].x,p[2].y);
glVertex2f(p[3].x,p[3].y);
glEnd();

glFlush();

}

//键盘响应函数
void keyFunc1(GLubyte key,GLint xMouse,GLint yMouse){
int i;
GLfloat t;

switch(key)
{
    //旋转
case'q':
    for(i=0;i<4;i++)
    {
        p[i].x=t;
        p[i].x=p[i].x*cos(sita1)-p[i].y*sin(sita1);
        p[i].y=t*sin(sita1)-p[i].y*cos(sita1);
    }
    glutPostRedisplay();
    break;
    //另一个方向旋转
case'w':
    varyMatrix[0][0]=cos(sita2);
    varyMatrix[0][1]=sin(sita2);
    varyMatrix[0][2]=1;
    varyMatrix[1][0]=-sin(sita2);
    varyMatrix[1][1]=cos(sita2);
    varyMatrix[1][2]=1;
    VaryMatrix();
    glutPostRedisplay();
    break;
    //X轴镜像
case'e':
    varyMatrix[1][1]=-1;
    VaryMatrix();
    glutPostRedisplay();
    break;
    //Y轴镜像
case'r':
    varyMatrix[0][0]=-1;
    VaryMatrix();
    glutPostRedisplay();
    break;
    //原点对称
case't':
    varyMatrix[0][0]=-1;
    varyMatrix[1][1]=-1;
    VaryMatrix();
    glutPostRedisplay();
    break;
    //错切X轴 可运行!!
case'a':
    varyMatrix[1][0]=-0.5;
    VaryMatrix();
    glutPostRedisplay();
    break;
    //错切Y轴 可运行!!
case's':
    varyMatrix[0][1]=-0.5;
    VaryMatrix();
    glutPostRedisplay();
    break;
    //错切原点 可运行!!!
case'd':
    varyMatrix[1][0]=-1;
    varyMatrix[0][1]=1;
    VaryMatrix();
    glutPostRedisplay();
    break;
    //放大 可运行!!!
case'z':
    varyMatrix[1][1]=varyMatrix[0][0]=1.2;
    VaryMatrix();
    glutPostRedisplay();
    break;
    //缩小 可运行!!!
case'x':
    varyMatrix[1][1]=varyMatrix[0][0]=0.83;
    VaryMatrix();
    glutPostRedisplay();
    break;
}

}

//上下左后键
void keyFunc2(GLint key,GLint xMouse,GLint yMouse){
switch(key){
case GLUT_KEY_UP:
varyMatrix[2][1]=0.2;
VaryMatrix();
glutPostRedisplay();
break;
case GLUT_KEY_DOWN:
varyMatrix[2][1]=-0.2;
VaryMatrix();
glutPostRedisplay();
break;
case GLUT_KEY_LEFT:
varyMatrix[2][0]=-0.2;
VaryMatrix();
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT:
varyMatrix[2][0]=0.2;
VaryMatrix();
glutPostRedisplay();
break;
}
}

int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50,100);
glutInitWindowSize(550, 550);
glutCreateWindow("键盘响应!qw(旋转)ert(对称)asd(错切)zx(放大缩小)上下左右键移动方向");
glClearColor(0.0,0.0,0.0,1);
glutKeyboardFunc(keyFunc1);
glutSpecialFunc(keyFunc2);
glutDisplayFunc(reDraw);
glutMainLoop();
return 0;
}


  • 写回答

1条回答 默认 最新

  • 一只Leona 2016-06-19 23:10
    关注

    我是用VC++6.0做的。。代码可以直接复制粘贴
    其中前三个include不知道为什么在这里显示不出来 分别是math.h stdlib.h GL/glut.h

    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题