-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Page151 7.2.3(9)v.tangent.w #32
Comments
其实在定义切线空间的时候,Z轴方向即切线方向是有无数条的,建模软件在计算切线的时候会选择和UV展开方向相同的那个方向作为切线方向,这样的选择导致如果直接用法线插乘切线的方向也一定会和UV相关,但这可能不是模型的法线方向(可能是反的),因此w会再存储一个信息。 |
@candycat1992 |
我不明白你的意思,在我看来乘以w决定了副切线到底取哪个方向,这里说的方向性不是说左手性右手性,而是说方向,有什么不对么? |
@candycat1992 |
是不是有些在概念上太钻牛角尖了?叉乘的结果会得到一个方向,然后w分量又进一步决定了最终的正确方向,没有人说仅仅知道w就可以知道正确方向呀~因为我对建模软件不够了解,因此我没法跟你解释清楚它们到底是怎么生成的。如果你这么想了解可以去建模软件自己生成一个法线贴图试一下呗。你的第5点我没看出来和我的观点有任何冲突的地方啊,本来就都是已知的,建模软件对法线纹理的生成是一个encode的过程,而我们在shader里做的是一个decode的工程,这样说你是不是会明白一些 |
@candycat1992 |
没关系~说不定下一次钻牛角尖就能发现新的东西呀 感谢对书的支持 :) |
這個問題我之前剛好有測試過 可以把下面這個script放到顯示你模型的GameObject上。
再把下面這個script放到路徑Assets/Editor/的資料夾下。
(一個三角形有3個頂點ABC,它們的uv分別是abc,頂點順序是A->B->C) 以下解釋原因: //////////////////////////分隔線 再來看看當模型從3dsmax被放入unity會怎麼被處理: 在3dsmax是z軸向上,假設在3dsmax裡建了1個模型,這個模型是一隻打開的右手掌,而且中指的方向指向世界的z軸,那這個手掌在3dsmax裡看起來就是立起來的(手心指向負y軸)。 「如果把3dsmax建的右手掌,沒作任何處理」就放進unity render,畫出來會是什麼? 應該會發現1個「左」手掌平放在世界上,而且手背是向上的(在unity裡Y軸向上) 所以Unity「可以」對資料作下面這樣的處理 (2)然後他對物件transform的x軸旋轉了-90度 至於tangent,在Unity裡可以選擇[import]或是[cauculate tangent space]。 不管選了那一個,因為有發生(1)這個轉換,所以normal和tangent在進入Unity後也被改變了。 //////////////////////////分隔線 順道在maya測試了一下發現maya是右手座標,但在maya裡向上是Y軸。 //////////////////////////分隔線 「abc的uv順序是順時針」是指: //////////////////////////分隔線 3dsmax如何判定tangent.w是正還是負: //////////////////////////分隔線 如何計算tanget: |
又發現一種情況 google發現了這個 看起來如果有模型是有smooth的,會這樣: (normal是建模軟體那傳過來的,建模軟體裡應該也是作平均) 但是為什麼可以直接對tanget和binormal作平均呢? 當沒有smooth: 可是當smooth時: |
再可視化一次頂點的tangent,看看三角形內插時T、N、BN會怎麼變化 |
當沒有smooth時,4個頂點上的normal變化,可以想像成1張名片 |
在原文中写到:“因为和切线与法线方向都垂直的方向有两个”
但是实际上,两向量叉乘只会得到一个向量,因为计算时只会使用两个法则之一,所以得到的结果应该是确定的。
那为何还需要w来确定方向呢?
这个w又是从何而来呢?
The text was updated successfully, but these errors were encountered: