gluLookAt

xiongyouyi 2009-03-26 05:11:39
gluLookAt为什么需要重新计算up,而且不用normalize?谢谢


void GLAPIENTRY
gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx,
GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy,
GLdouble upz)
{
float forward[3], side[3], up[3];
GLfloat m[4][4];

forward[0] = centerx - eyex;
forward[1] = centery - eyey;
forward[2] = centerz - eyez;

up[0] = upx;
up[1] = upy;
up[2] = upz;

normalize(forward);

/* Side = forward x up */
cross(forward, up, side);
normalize(side);

/* Recompute up as: up = side x forward */
cross(side, forward, up);

__gluMakeIdentityf(&m[0][0]);
m[0][0] = side[0];
m[1][0] = side[1];
m[2][0] = side[2];

m[0][1] = up[0];
m[1][1] = up[1];
m[2][1] = up[2];

m[0][2] = -forward[0];
m[1][2] = -forward[1];
m[2][2] = -forward[2];

glMultMatrixf(&m[0][0]);
glTranslated(-eyex, -eyey, -eyez);
}
...全文
401 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongyouyi 2009-03-26
  • 打赏
  • 举报
回复
数学,ogl,dx对矩阵给不同的规定,搞的我头晕。 
thanks a million
scandgy 2009-03-26
  • 打赏
  • 举报
回复
不是的
参考
m[0][0] = side[0];
m[1][0] = side[1];
m[2][0] = side[2];

m[0][1] = up[0];
m[1][1] = up[1];
m[2][1] = up[2];

m[0][2] = -forward[0];
m[1][2] = -forward[1];
m[2][2] = -forward[2];

x(m0,m1,m2)
y(m4,m5,m6)
z(m8,m9,m10)
xiongyouyi 2009-03-26
  • 打赏
  • 举报
回复
谢谢,刚好找到实时渲染上也是这么说的。
另外想确认一下坐标系分量的取法,
模型视图矩阵如下:
float m[16];
[m0 m4 m8 m12]
[m1 m5 m9 m13]
[m2 m6 m10 m14]
[m3 m7 m11 m15]

坐标系分量是按行取的吗?
x(m0, m4, m8)
y(m1, m5, m9)
z(m2, m6, m10)

dx也是按行取吗?
scandgy 2009-03-26
  • 打赏
  • 举报
回复
因为gluLookAt建立的眼坐标系是以视线方向作为眼坐标系的-Z方向
向上方向为y轴方向
up指定时不一定与视线方向垂直,因此需要修正到与Z轴垂直,即将up向量分解取其与视线方向相垂直的一部分,而不是直接指定为up

19,468

社区成员

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

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