游戏开发论坛

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

方向向量怎么变换?

[复制链接]

53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2008-10-12 23:53:00 | 显示全部楼层 |阅读模式
世界空间中的法线从世界空间变换到视空间是这样的:
NormalInView = NormalInWorld * (((viewMat)-1)T)    (即 viewMat矩阵求逆,之后再转置得到的矩阵)

我在看PICK的时候,看到书上把视空间中的视线方向变换到世界坐标系中去是这样的:
EeyDirInWorld = EyeDirInView * ((viewMat)-1)   (即viewMat的逆矩阵)

可参照法线的变换,我觉得应该是这样的:
EeyDirInWorld = EyeDirInView * ((((viewMat)-1)-1)T) (即viewMat矩阵先求逆,再求逆,然后再转置得到的矩阵,实际上就是viewMat矩阵的转置矩阵)
我觉得视线方向同法线一样,也是一个方向向量,应该与法线的变换有相同的规则,不知道我的理解对不对?

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2008-10-13 20:16:00 | 显示全部楼层

Re:方向向量怎么变换?

如果是view矩阵的话,直接取3x3的旋转部分做变换就可以了,求逆再转置是为了过滤掉平移量,并且防止旋转部分不是正交矩阵(即在xyz方向上的缩放量有差异),view矩阵的旋转部分是正交矩阵,所以这样做的必要性不大,当然用world的话就有必要了

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2008-10-13 20:25:00 | 显示全部楼层

Re:方向向量怎么变换?

世界空间中的法线从世界空间变换到视空间是这样的:
NormalInView = NormalInWorld * (((viewMat)-1)T)    (即 viewMat矩阵求逆,之后再转置得到的矩阵)
===================
应该直接用
NormalInView = NormalInWorld * viewMat
view矩阵本身是正交的,求逆再转置,等于转置两次,最后又还原了。


53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2008-10-14 09:24:00 | 显示全部楼层

To jk20012001,给你发短信了!

那为什么视线方向从视空间变到世界空间不需要像法线那样变换?而且我试过像法线那样变换是错的!

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2008-10-14 15:03:00 | 显示全部楼层

Re:方向向量怎么变换?

视线向量从试空间变换到世界空间,而法线是从世界空间变换到试空间,这两个当然不一样了,我前面说过了,法线从world到view的时候直接用view矩阵3x3变换即可,那么视线向量变换的时候是反的,就应该用view的逆矩阵了
其实刚开始我对求逆再转置也很迷糊,后来在一本opengl什么的书上看到一段推导才知这是一种通用措施,可以适用于非正交矩阵而不致错误,不过时间太久既不清楚了,呵呵

53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2008-10-14 18:25:00 | 显示全部楼层

To jk20012001

你说:“法线从world到view的时候直接用view矩阵3x3变换即可”,我觉得这样不行,直接用view矩阵3x3变换,过滤掉了平移,但是缩放矩阵没有过滤掉,对非正交矩阵还不是不适用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 03:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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