游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5168|回复: 7

向量与矩阵相乘的问题,求证一下

[复制链接]

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
发表于 2008-7-26 12:01:00 | 显示全部楼层 |阅读模式
这个是我的理解:
我们通常用API计算matClip = matWorld * matView * matProj
DX用的是行向量,所以API算出来matClip应该是这样的形式(??)
Ux Vx Wx
Uy Vy Wy
Uz Vz Wz(每列表示一个坐标轴)
所以我们在做变换的时候是mul(vec, matClip).

而当我们自己算一个变换矩阵(例如一个变换到正切空间的矩阵)的时候一般是
Tx Ty Tz
Bx By Bz
Nx Ny Nz(每行表示一个坐标轴)
所以这种情况下进行变换是mul(matTangent, vec)
-----------------------------------------------------------------------------
然后问题在下面,在计算灯光的漫反射的时候有Diffuse = max( N . L, 0);
假如灯光是移动的,移动的矩阵matR用上面说的第二种形式保存有vecL' = matR * vecL,
我的目的是固定灯光,用法向量的移动来代替。
vecN . (matR * vecL) = (vecN * matR(T)) . vecL
不过实际验算了一下这个推导是错误的……正确的应该是matR(T) * vecN . vecL……
大家帮忙矫正一下啊…… [em6]

PS.上面的向量N.L左乘是行向量,右剩是列向量……表达麻烦没写出来……

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-7-26 12:34:00 | 显示全部楼层

Re: 向量与矩阵相乘的问题,求证一下

反了,行矩阵的轴向量是横的,列矩阵的轴向量才是列方向。

变换到切空间和向量乘矩阵的顺序没关系,向量乘矩阵的顺序只取决于是“行矩阵、行向量”还是“列矩阵、列向量”。
但在计算bump的shader里切矩阵的轴是纵向的,这是因为它其实是用切矩阵的逆矩阵(因为要变换到世界空间计算光照),但在DX里仍然都是行矩阵,所以总是向量*矩阵。

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
 楼主| 发表于 2008-7-26 19:44:00 | 显示全部楼层

Re:向量与矩阵相乘的问题,求证一下

说起来
        Ux Uy Uz
[x y z][Vx Vy Vz] = xUx+yVx+zWx, .... = xU + yV + zW……我世界矩阵那里的理解是错了……
        Wx Wy Wz

至于bump里似乎是
Tx Ty Tz              //mul(Tangent, matWorld)
Bx By Bz              //cross0,2行
Nx Ny Nz              //mul(Normal, matWorld)
这种形式的吧,然后计算光照的时候是mul(matTangent, vecLight)我倒是不理解,
算出tangent空间矩阵的目的就是为了吧灯光转换到tangent空间再与纹理上保存的法向量(也是在tangent空间)做点积吧?这样应该是mul(vecLight, matTangent),怎么会是mul(matTangent, vecLight)呢??
还有mul(matTangent, vecLight)是在这个函数里面把matTangent和vecLight自动做了转置的吗??

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-7-26 20:50:00 | 显示全部楼层

Re:向量与矩阵相乘的问题,求证一下

把bump纹理的上的法向量变换到世界空间是mul(n, TangentMatrix),把light变换到切空间是mul(light, invert(TangentMatrix)),这里invert(TangentMatrix)对纯旋转矩阵等价于transpose(TangentMatrix),也就等价于mul(TangentMatrix, light)

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
 楼主| 发表于 2008-7-26 22:15:00 | 显示全部楼层

Re:向量与矩阵相乘的问题,求证一下

我知道哪里搞错了……那个matTangent是TangentToWorld的吧??
我看的资料上是写WorldToTangent……结果搞到头都晕
用WorldToTangent这个名字应该是针对mul(matTangent, vecLight)的吧………… -__-|||

谢谢qrli~~~

0

主题

37

帖子

41

积分

注册会员

Rank: 2

积分
41
发表于 2008-7-28 19:53:00 | 显示全部楼层

Re:向量与矩阵相乘的问题,求证一下

学习一下^_^

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
 楼主| 发表于 2008-7-29 10:21:00 | 显示全部楼层

Re:向量与矩阵相乘的问题,求证一下

这两天又想了一下,似乎还是开始的想法正确点,就是DX里面算出来的是每列表示一个基
Ux Vx Wx
Uy Vy Wy
Uz Vz Wz
证据就是DX文档里面的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
这里很明显是按照列来保存的。
假如向量V(x,y,z,1) * matView,那结果是
x * xaxis.x + y * y * xaxis.y + z * xaxis.z + (-dot(xaxis, eye))  (后面几行省去)
这样的几何意义就很明显是把V向量投影到X基然后再平移-dot(xaxis, eye)个单位,

如果按照行保存的话就是:x * xaxis.x + y * y * yaxis.x + z * zaxis.x + (-dot(xaxis, eye)),这样的话就没有几何意义了。
如果保存为行的话只要右乘就可以了,结果跟第一种情况是一样的。

PS.希望大家再确认一下……基本概念搞错后果很严重=_=

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-7-29 12:11:00 | 显示全部楼层

Re:向量与矩阵相乘的问题,求证一下

都说过了,行矩阵是行基。LookAt矩阵是视矩阵,是相机世界变换的逆矩阵,按逆和转置的等价所以看起来像列基。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 20:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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