游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2288|回复: 6

关于照相机变换的问题,敬请赐教。

[复制链接]

22

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
发表于 2008-4-14 11:16:00 | 显示全部楼层 |阅读模式
在DX助文件中,有一段关于D3DXMatrixLookAtLH的说明,其中说到:

D3DXMatrixLookAtLH返回值,是用下面的公式计算出来的:
zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)
   
xaxis.x           yaxis.x           zaxis.x          0
xaxis.y           yaxis.y           zaxis.y          0
xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l


问题:
1、看不明白这些公式具体含意。
2、在游戏中,是不是利用这些公式对游戏中的物体、照相机进行view变换,是怎么变换的?能不能给在下点拨一下。
3、查《3D游戏编程大师技巧》296面的相机坐标章节得知: view变换是将照相机平移到世界坐标的原点,再用此平移矩阵的逆将相关的物体平移,使得照相机与相关物体的相对位置保持不变。然后再将照相机的朝向与世界坐标的Z轴重合,最后再次使用乘逆阵的方法保持照相机与相关物体相对关系的不变。不明白这些与上面的公式有什么关系。

盯了这个问题有好几天了,拜请各位赐教。

22

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
 楼主| 发表于 2008-4-15 14:11:00 | 显示全部楼层

Re:关于照相机变换的问题,敬请赐教。

Up

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-4-15 15:29:00 | 显示全部楼层

Re:关于照相机变换的问题,敬请赐教。

貌似我发过这种帖子的,还有详细的图,我给你找找

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-4-15 15:51:00 | 显示全部楼层

Re:关于照相机变换的问题,敬请赐教。

http://bbs.gameres.com/showthread.asp?threadid=74429
请注意look和lookat的区别!

---------------------------------------------
此外,并不是说这个变换“只能用于view变换”。
实际上数学是不会管你什么摄像机不摄像机的。
---------------------------------------------

这个变换的意义在于:

把父母空间的坐标,变成本地空间的坐标。
反过来需要计算逆矩阵。


这个变换的矩阵如何计算?

如果给定了本地空间的坐标轴,在父母空间中的数值,
就可以按照上面的方式来计算出这个变换


我们把world空间,变换到摄影机(view)空间,可以看作:
world空间是view空间的父母空间,
摄影机自己的坐标轴的数值,是在world空间定义的!
也就是说,摄影机的坐标轴,是在他的父母空间中定义的,
所以,可以按照上面的方式,计算出view变换矩阵。

反过来,从摄影机空间变换到世界空间,使用其逆矩阵即可。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-4-15 15:53:00 | 显示全部楼层

Re:关于照相机变换的问题,敬请赐教。

关于Look和LookAt的区别,见下面的代码。

void Mat44LookLH(MAT44 *mat,const VEC3 *eye,const VEC3 *look,const VEC3 *up)
{
        VEC3 zaxis,xaxis,yaxis;
        zaxis=*look; // LH !!
        Vec3Normalize(&zaxis,&zaxis);
        Vec3CrossVec3(&xaxis,up,&zaxis);
        Vec3Normalize(&xaxis,&xaxis);
        Vec3CrossVec3(&yaxis,&zaxis,&xaxis);

        mat->_11=xaxis.x; mat->_12=yaxis.x; mat->_13=zaxis.x; mat->_14=0;
        mat->_21=xaxis.y; mat->_22=yaxis.y; mat->_23=zaxis.y; mat->_24=0;
        mat->_31=xaxis.z; mat->_32=yaxis.z; mat->_33=zaxis.z; mat->_34=0;  
        mat->_41=-Vec3DotVec3(eye,&xaxis); mat->_42=-Vec3DotVec3(eye,&yaxis); mat->_43=-Vec3DotVec3(eye,&zaxis); mat->_44=1;  
}

void Mat44LookAtLH(MAT44 *mat,const VEC3 *eye,const VEC3 *at,const VEC3 *up)
{
        VEC3 zaxis,xaxis,yaxis;
        Vec3MinusVec3(&zaxis,at,eye); // LH !!
        Vec3Normalize(&zaxis,&zaxis);
        Vec3CrossVec3(&xaxis,up,&zaxis);
        Vec3Normalize(&xaxis,&xaxis);
        Vec3CrossVec3(&yaxis,&zaxis,&xaxis);

        mat->_11=xaxis.x; mat->_12=yaxis.x; mat->_13=zaxis.x; mat->_14=0;
        mat->_21=xaxis.y; mat->_22=yaxis.y; mat->_23=zaxis.y; mat->_24=0;
        mat->_31=xaxis.z; mat->_32=yaxis.z; mat->_33=zaxis.z; mat->_34=0;  
        mat->_41=-Vec3DotVec3(eye,&xaxis); mat->_42=-Vec3DotVec3(eye,&yaxis); mat->_43=-Vec3DotVec3(eye,&zaxis); mat->_44=1;  
}

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-4-15 15:55:00 | 显示全部楼层

Re:关于照相机变换的问题,敬请赐教。

因为这种公式,不局限于摄像机这么狭窄,所以,我将原来的CCamera类修改为CPosCtrl(位置控制类)

void CPosCtrl::CreateMatToParent(MAT44* mat,const VEC3* pos,const VEC3* right,const VEC3* up,const VEC3* look)
{
        MAT44 *tmp=new MAT44;
        CreateMatFromParent(tmp,pos,right,up,look);
        Mat44Inverse(mat,tmp);
        SafeDel(tmp);
}

void CPosCtrl::CreateMatFromParent(MAT44* mat,const VEC3* pos,const VEC3* right,const VEC3* up,const VEC3* look)
{
        mat->_11=right->x; mat->_12=up->x; mat->_13=look->x; mat->_14=0;
        mat->_21=right->y; mat->_22=up->y; mat->_23=look->y; mat->_24=0;
        mat->_31=right->z; mat->_32=up->z; mat->_33=look->z; mat->_34=0;
        mat->_41=-Vec3DotVec3(pos,right); mat->_42=-Vec3DotVec3(pos,up); mat->_43=-Vec3DotVec3(pos,look); mat->_44=1;
}

const MAT44 &CPosCtrl::GetMat44ToParent()const
{
        if(m_bToParentCalculated==False)
        {
                CreateMatToParent(const_cast<MAT44 *>(&m_tmpToParent),&m_Pos,&m_Right,&m_Up,&m_Look);
                const_cast<CPosCtrl *>(this)->m_bToParentCalculated=True;
        }
        return m_tmpToParent;
}
///////////////////////////////////////////////////////////
const MAT44 &CPosCtrl::GetMat44FromParent()const
{
        if(m_bToParentCalculated==False)
        {
                CreateMatFromParent(const_cast<MAT44 *>(&m_tmpFromParent),&m_Pos,&m_Right,&m_Up,&m_Look);
                const_cast<CPosCtrl *>(this)->m_bFromParentCalculated=True;
        }
        return m_tmpFromParent;
}

22

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
 楼主| 发表于 2008-4-30 17:47:00 | 显示全部楼层

Re:关于照相机变换的问题,敬请赐教。

这个问题基本搞明白了,多谢instemast
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 16:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表