前言
之前寫過一篇unity 的貼花編輯,當時是學習unity外掛程式的**。最近因為工作需要,做了乙個可以編輯紋理區域性貼花的功能實現。
大致上是根據以前的思想。但是自己用opengl 實現一遍,還是切身體會到不少深入的東西。
回顧之前的貼花編輯器的思想,在unity 中用gameobject 作為 decal。 然後通過對影響到的mesh做切割,獲取頂點,再重新計算mesh資訊(uv, tangent,normal).最後把這個mesh給 decal object。 因為不同的object 可以有不同的material,進而可以對decal 的material 重新賦予紋理。即是最後的貼花效果。
這裡,重點說下其中的幾個移植過程中,不能呼叫unity api,而需自己寫的一些部分功能。
1. 計算切線空間
要想模擬表面的凹凸,通過光照的明暗來表現凹凸感更好。然而在tbn空間,法線都是垂直向上的。要進行光照計算。需要把法線從tbn座標轉化到世界座標系。所以需要切線空間的計算。計算方法根據紋理座標和位置座標的關係,可以得出。這裡計算得到的切線空間是基於單個三角形的,而在3d管線中,處理的是基於頂點。對於任一頂點,我們使用其所在的三角形所對應的切線空間向量的平均值,作為該頂點的切線空間。
verctor3d mesh:: generatetangent(const vector3d &a, const vector3d &b, const vector3d &c,
const vector2d &ta, const vector2d &tb, cosnt vector2d &tc)
2. 點在平面的判斷 以及 在平面上取點,如果三角形有點在立方體之外因為是根據立方體來裁mesh,那麼在如果三角形有部分點在立方體內部,有部分在立方體外部。則我們需要把外部的點去掉,改為在立方體平面上取點來代替。
點再平面的判斷,可以計算點在平面的距離(利用平面點和法線)。根據距離為(>0,=0,<0)確定點和平面的位置關係。
根據兩個點(面兩側的點)到面的距離作為因子,取兩點之間在直線方向上的點
plane:: linecast(vexctor3d &a, vector3d &b)
3. 包圍盒的檢測碰撞檢測在面和軸的方向的投影上是否有重疊,如果有,則是包圍盒有碰撞
bool obb:: intersects(const obb& box) const
}return -1;
}
附貼圖功能展示: 最右邊是帶alpha 通道的貼圖
如下圖所示是隨立方體移動,紋理的移動
Qt版文字編輯器注意細節
在其中加入 include標頭檔案包含,再在主函式中加入下面一行 qtextcodec setcodecfortr qtextcodec codecforlocale 這樣在程式中使用中文,便能在執行時顯示出來了。voidmainwindow on action quit triggered on ...
vim編輯器 編輯器之神
h 向左移動 j 向下移動 k 向上移動 l 向右移動 w 移動到下乙個單詞的首部 e 移動到下乙個單詞的尾部 b 移動到上乙個單詞的首部 移動到行首 移動到行尾 g 跳轉到文件的末尾 gg 跳轉到文件的開始複製操作 複製n行 nyy 2yy 移動游標到要寫入的位置,再按p 刪除操作 刪除多行 nd...
編輯器之神 vim編輯器
vi編輯器是所有unix及linux系統下標準的編輯器,類似於windows系統下的notepad 記事本 編輯器,由於在unix及linux系統的任何版本,vi編輯器是完全相同的,因此可以在其他任何介紹vi的地方都能進一步了解它,vi也是linux中最基本的文字編輯器,學會它後,我們將在linux...