Panneiria

Forum Replies Created

Viewing 6 posts - 1 through 6 (of 6 total)
  • Author
    Posts
  • in reply to: 关于作业3 displacement mapping等的问题 #6858 Score: 0
    Panneiria
    Participant
    2 pts

    可能有点晚了,但是你可以看看我在这个帖子里的解释http://games-cn.org/forums/topic/zuoye3-bump-mappingzhongtbndet-gongshizenmetuidaode/,希望能帮到你哈

    in reply to: 作业3 bump mapping中TBN的t 公式怎么推导的 #6857 Score: 0
    Panneiria
    Participant
    2 pts

    我刚才突然开窍了哈哈,你试一下让inv_trans = view * model,效果是一样的。原理简单说的话,是我们在变换模型的缩放、位置和旋转的时候,只有旋转会真的影响到法线,因为法线是方向向量,w是0。
    解释清楚一点,就是我们想要view space里模型的法线在世界坐标中表示的方向。那模型经历了一系列的缩放、平移和旋转,而其中只有旋转会影响法线。当我们用view * model去乘法线的时候,法线就经历了与模型一样的旋转(缩放其实也会生效,但是反正要归一化所以无所谓),而平移是无效的。于是我们就有了法线在世界坐标中表示的方向。
    那原代码中的inv_trans其实我觉得有点怪怪的,虽然效果一样。如果我们不考虑平移,(view * model).inverse()这个矩阵会对法线进行与模型相反的缩放效果和相反的旋转效果,而inv_trans会对法线进行与模型相反的缩放效果(缩放效果在对角线上所以转置不影响)和与模型相同的旋转效果(旋转矩阵的逆与转置相同),那么我们也就得到了和对法线施加view * model这个矩阵一样的有效效果。

    in reply to: 作业3 bump mapping中TBN的t 公式怎么推导的 #6854 Score: 2
    Panneiria
    Participant
    2 pts

    这里说是计算切线,其实更准确一点是在找一条切线然后跟n和它俩的叉乘构成一个Orthonormal basis。
    其实n定义了一个三维空间中的平面P,而P上的任意一条向量都与模型上的与法线n相对应的这一点相切。
    代码里这个t,我感觉其实是找了一个挺巧妙的向量。
    你可以这么想,n是由它在x-z平面上的投影和它的y-component构成的。你把这个投影旋转到与y轴重合,n的y-component就到了一个平行于x-z平面的平面上,那么它的x,z坐标,就是t的x,z坐标。然后很显然,t的y坐标就是n在x-z平面上的投影的模长。
    不过,代码框架里的这段应该是有点问题的,n跟t并不垂直。解出来的t的x,z坐标应该是-x*y/sqrt(x*x+z*z),-z*y/sqrt(x*x+z*z)。或者x,z是对的,那y就要变成负的。总之是有点问题。
    然后代码里选定了n为z轴,t为x轴,b为y轴(轴的选定满足了右手坐标系三轴的叉乘法则),所以才能看到TBN = [t b n]这段代码。这个TBN矩阵是用来把下面计算出来的perturbed normal从本地坐标系转化到世界坐标系的。

    然后我也有个问题想请教一下,rasterizer的代码里这段:
    Eigen::Matrix4f inv_trans = (view * model).inverse().transpose();
    应该是用来把模型的法线从模型空间转化到世界空间的,但是难道不是只要inverse就够了吗,为什么还要transpose一下?

    This post has received 2 votes up.
    in reply to: 作业2关于z坐标插值的疑问 #6844 Score: 0
    Panneiria
    Participant
    2 pts

    我明白我迷在哪儿了,多谢大佬指点

    in reply to: 作业2关于z坐标插值的疑问 #6840 Score: 0
    Panneiria
    Participant
    2 pts

    还有最关键的,我们要在zbuffer里储存的是哪个状态下(哪个变换后)的z值?

    in reply to: 作业2关于z坐标插值的疑问 #6839 Score: 0
    Panneiria
    Participant
    2 pts

    我又结合作业3的代码琢磨了一下(好像2里面有点小问题,w是不对的),传入rasterize_triangle这个方法的三角形中代表顶点的向量的x,y是viewspace中的坐标(像素),z是原本已经转化成canonical cube中的坐标又乘上了f1再加上f2,也就是变回了我们刚把frustum挤扁但还没有变到canonical cube时候的z坐标,w是已经完成了model和view变换时候,也就是view space中的z坐标。那z其实已经是实际的坐标了(而不是在齐次坐标中受到其次坐标系数影响的值),为什么还要除以w?而且如果要插值计算点在view space中的z坐标,难道不应该是alpha*w1+beta*w2+gamma*w3吗?为什么代码里用的是除法?能麻烦大佬再讲解一下吗,或者有在哪里看到解释发下链接也好。

Viewing 6 posts - 1 through 6 (of 6 total)