圖像扭曲算法 |
|
axsoft
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
圖像扭曲算法 劉小軍 wrap效果源碼 (142K) 資料來源:http://www.cpp3d.com/articles/show.asp?aid=12 圖像扭曲是平面圖形變化的一種,它可用于許多場合,如在以前介紹的火焰特效中加入扭曲效果,會使火焰更逼真(當然代碼要有更高的的效率才行),如果在字幕當中加入扭曲效果,會給人一種怪異的感覺。 圖象扭曲的算法並不複雜,但要解釋清楚卻不是一件容易的事,為了說明問題只好借用圖片了,網路慢的朋友多多包涵了。算法例程源碼編譯需VC 、DXSDK、DXGuide。
![]() ![]() ![]() ![]() // 單元塊扭曲算法 inline void CFeedBackApp::TextureBlock(int xo, int yo) { // 投影平面 float fLeftOffX, fLeftOffY; // 各行左端點相對于上一行左端點的偏移 float fRightOffY, fRightOffX; // 各行右端點相對于上一行右端點的偏移 float TX1, TY1, TX2, TY2; // 當前行左、右端點的坐標 float HDx, Hdy; // 當前行各點間的平均偏移量 float tx, ty; // 當前投影點坐標 // 渲染平面 int x, y; // 當前渲染點坐標 int xi=(xo<<4), yi=(yo<<4); // 當前渲染塊左上角坐標 WORD *Tptr; Tptr = &(m_awBuf1[xi m_nMul640[yi]]); fLeftOffX = (m_offset[xo] [yo 1].xint - m_offset[xo] [yo].xint) /16; // 計算平均偏移 fLeftOffY = (m_offset[xo] [yo 1].yint - m_offset[xo] [yo].yint) /16; fRightOffX = (m_offset[xo 1][yo 1].xint - m_offset[xo 1][yo].xint) /16; fRightOffY = (m_offset[xo 1][yo 1].yint - m_offset[xo 1][yo].yint) /16; // 計算平均偏移 TX1 = m_offset[xo] [yo].xint; // 取投影圖塊第一行左端點坐標 TY1 = m_offset[xo] [yo].yint; TX2 = m_offset[xo 1][yo].xint; // 取投影圖塊第一行右端點坐標 TY2 = m_offset[xo 1][yo].yint; for (y=yi; y < (yi 16); y ) { HDx = (TX2-TX1) / 16; // 計算投影圖塊當前行各點的平均偏移 Hdy = ((TY2-TY1) / 16); tx = TX1; // 投影平面當前行左端點坐標 ty = TY1; for (x=xi; x < (xi 16); x ) { *Tptr = m_awBuf2[int(tx) m_nMul640[int(ty)] ]; tx = HDx; // 下一點 ty = Hdy; } Tptr = (SCRWIDTH-16); // 下一行 TX1 = fLeftOffX; // 計算投影平面中下一行左、右端點的坐標 TY1 = fLeftOffY; TX2 = fRightOffX; TY2 = fRightOffY; } }網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2002/08/21 15:18:19 |
kenn
一般會員 ![]() ![]() 發表:5 回覆:3 積分:1 註冊:2004-12-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |