panyifei1992 2017-06-07 01:05
浏览 951
已结题

Opengl Camera类 求详解,请3D数学方面的大神进来帮忙解答。

在博客上看到了一篇文章,讲Opengl Camera类的设计。
有好多内容没有看懂,求解释啊。
博客原文:
http://blog.csdn.net/hobbit1988/article/details/7956838#comments

其中以下内容都没有看懂背后的矩阵运算究竟是什么。求解答
void Camera::setModelViewMatrix()

{

float m[16];

Vector3 eVec(eye.x, eye.y,eye.z);

m[0]=u.x; m[4]=u.y; m[8]=u.z; m[12]=-eVec.dot(u);

m[1]=v.x; m[5]=v.y; m[9]=v.z; m[13]=-eVec.dot(v);

m[2]=n.x; m[6]=n.y; m[10]=n.z; m[14]=-eVec.dot(n);

m[3]=0; m[7]=0; m[11]=0; m[15]=1.0;

glMatrixMode(GL_MODELVIEW);

glLoadMatrixf(m); //用M矩阵替换原视点矩阵

}

/* 摄像机绕n、v、u轴旋转的计算函数*/

void Camera::roll(float angle)

{

float cs=cos(angle*3.14159265/180);

float sn=sin(angle*3.14159265/180);

Vector3 t(u);

Vector3 s(v);

u.set(cs*t.x-sn*s.x, cs*t.y-sn*s.y, cs*t.z-sn*s.z);

v.set(sn*t.x+cs*s.x, sn*t.y+cs*s.y, sn*t.z+cs*s.z);

setModelViewMatrix(); //每次计算完坐标轴变化后调用此函数更新视点矩阵

}

void Camera::yaw(float angle)

{

float cs=cos(angle*3.14159265/180);

float sn=sin(angle*3.14159265/180);

Vector3 t(n);

Vector3 s(u);

n.set(cs*t.x-sn*s.x, cs*t.y-sn*s.y, cs*t.z-sn*s.z);

u.set(sn*t.x+cs*s.x, sn*t.y+cs*s.y, sn*t.z+cs*s.z);

setModelViewMatrix();

}

void Camera::pitch(float angle)

{

float cs=cos(angle*3.14159265/180);

float sn=sin(angle*3.14159265/180);

Vector3 t(v);

Vector3 s(n);

v.set(cs*t.x-sn*s.x, cs*t.y-sn*s.y, cs*t.z-sn*s.z);

n.set(sn*t.x+cs*s.x, sn*t.y+cs*s.y, sn*t.z+cs*s.z);

setModelViewMatrix();

}

/* 摄像机绕三个轴平移的计算函数*/

void Camera::slide(float du, float dv, float dn)

{

eye.x+=du*u.x+dv*v.x+dn*n.x;

eye.y+=du*u.y+dv*v.y+dn*n.y;

eye.z+=du*u.z+dv*v.z+dn*n.z;

look.x+=du*u.x+dv*v.x+dn*n.x;

look.y+=du*u.y+dv*v.y+dn*n.y;

look.z+=du*u.z+dv*v.z+dn*n.z;

setModelViewMatrix();

}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥50 永磁型步进电机PID算法
    • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
    • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
    • ¥15 如何处理复杂数据表格的除法运算
    • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
    • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
    • ¥200 uniapp长期运行卡死问题解决
    • ¥15 latex怎么处理论文引理引用参考文献
    • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
    • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?