線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2831
推到 Plurk!
推到 Facebook!

圖像扭曲算法

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-21 15:16:07 IP:61.218.xxx.xxx 未訂閱
圖像扭曲算法    劉小軍    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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-26 22:21:24 IP:61.231.xxx.xxx 未訂閱
因為圖片不見了 想請問axsoft 大大 這個是不是可以做出像哈哈鏡的效果呢? m_offset[xo 1][yo 1].xint m_offset[xo 1][yo 1].yint xint 和 yint 應該是他自己寫的結構吧@@ 這個片段程式有人可以run出來嗎 可以分享一下這段程式嗎 謝謝
系統時間:2017-10-20 0:41:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!