游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3331|回复: 5

关于D3DXMatrixLookAtLH函数

[复制链接]

22

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2008-11-22 20:14:00 | 显示全部楼层 |阅读模式
如题,我在MSDN中找到
//第1
zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

//第2
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

我不是很明白第2步的意思,有哪位能解释一下吗?

1

主题

177

帖子

198

积分

注册会员

Rank: 2

积分
198
QQ
发表于 2008-11-23 00:33:00 | 显示全部楼层

Re:关于D3DXMatrixLookAtLH函数

视图矩阵是照相机的世界变换的逆变换。(R*T)的逆矩阵。即T逆*R逆。
给定照相机的位置eye,向量Up和At向量,得出世界变换中的方位变换矩阵R:
xaxis.x    xaxis.y    xaxis.z      0
yaxis.x    yaxis.y    yaxis.z      0
zaxis.x    zaxis.y     zaxis.z     0
0              0            0           1

根据eye,得出世界变换中的平移变换矩阵T
1        0          0        0
0        1          0        0
0        0          1        0
x         y          z         1

T逆为
1        0          0        0
0        1          0        0
0        0          1        0
-x       -y         -z         1

R逆为:
xaxis.x           yaxis.x           zaxis.x          0
xaxis.y           yaxis.y           zaxis.y          0
xaxis.z           yaxis.z           zaxis.z          0
    0                   0                   0              1

T逆*R逆则为:
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

eye坐标为(x,y,z),则(-x)*xaxis.x+(-y)*xaxis.y+(-z)* xaxis.z = -dot(xaxis, eye)。
-dot(yaxis, eye), -dot(zaxis, eye)也是相同的。

22

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
 楼主| 发表于 2008-11-23 11:37:00 | 显示全部楼层

Re:关于D3DXMatrixLookAtLH函数

也就是说最后得出来的结果是相机的 旋转+平移 变换矩阵,对不对?
你所说的我已经明白,我举个例子,先不要讨论平移矩阵,就讨论旋转矩阵,即下面的矩阵
xaxis.x           yaxis.x           zaxis.x          0
xaxis.y           yaxis.y           zaxis.y          0
xaxis.z           yaxis.z           zaxis.z          0
    0                   0                   0              1
以上面的矩阵作为条件,3D空间中有一点p(x, y, z)要把p点变换成相机坐标p'(x', y', z'),则做如下操作
p点的矩阵为P[x, y, z, 1]
则p' = P*M;//M为上面的矩阵
     =[x, y, z, 1]*[...]
     =[x*xaxis.x + y*xaxis.y + z*xaxis.z, x*yaxis.x + y*yaxis.y + z*yaxis.z, x*zaxis.x + y*zaxis.y + z*zaxis.z, 1]
     令向量u = (xaxis.x, xaxis.y, xaxis.z) //相机的Z向量
     令向量V = (yaxis.x, yaxis.y, yaxis.z) //相机的上向量
     令向量n = (zaxis.x, zaxis.y, zaxis.z) //相机的右向量
由此可得
    p' = [dot(p,u), dot(p, v), dot(p,n)]

这些我都明白,但是我不明白,下面这个矩阵的由来
xaxis.x           yaxis.x           zaxis.x          0
xaxis.y           yaxis.y           zaxis.y          0
xaxis.z           yaxis.z           zaxis.z          0
       0                 0                 0          1
换句话说,我不知道如何不用矩阵去实现这样的相机?

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-11-23 14:10:00 | 显示全部楼层

Re:关于D3DXMatrixLookAtLH函数

__forceinline Float4x4 FromParent(const Float3 &pos,const Float3 &look,const Float3 &up)
{
Float3 Zaxis = look / Norm(look);
Float3 Xaxis = Cross(up,Zaxis);
Xaxis /= Norm(Xaxis);
Float3 Yaxis = Cross(Zaxis,Xaxis);

Float4x4 ret =
{
Xaxis.x, Xaxis.y, Xaxis.z, -Dot(pos,Xaxis),
Yaxis.x, Yaxis.y, Yaxis.z, -Dot(pos,Yaxis),
Zaxis.x, Zaxis.y, Zaxis.z, -Dot(pos,Zaxis),
0, 0, 0, 1,
};
return ret;
}

__forceinline Float4x4 Look(const Float3 &eye,const Float3 &look,const Float3 &up)
{
return FromParent(eye,look,up);
}

__forceinline Float4x4 LookAt(const Float3 &eye,const Float3 &look_at,const Float3 &up)
{
return Look(eye, look_at - eye, up);
}

http://bbs.gameres.com/showthread.asp?threadid=112769

5

主题

972

帖子

975

积分

高级会员

Rank: 4

积分
975
发表于 2008-11-24 23:46:00 | 显示全部楼层

Re:关于D3DXMatrixLookAtLH函数

看看解析几何 仿射变换 你还必须先了解 基 的概念

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2008-11-25 09:24:00 | 显示全部楼层

Re:关于D3DXMatrixLookAtLH函数

矩阵实现有什么不好吗?你不用矩阵还不一样得执行一样多的运算,从效率上来看没发现有什么优势

试下一个点移动到3D空间另外一个地方,用普通数学计算和矩阵做叉乘计算相比较
就会发现做一样的事了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 20:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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