2011-03-31 67 views
0

我的英語知識不足以說明我的問題。我第二次使用stackoverflow。在directx應用程序中,找到已知位置的z(terrain)

我掛鉤了一個directx應用程序,我只能寫一些東西來屏幕和從屏幕和其他東西獲取輸入。

這場比賽有一個地形,和很多球員。我可以直接編輯玩家位置(x,z,y)。但是當我編輯x和z座標時,玩家正在飛行:)因爲我不知道如何計算y座標(地形高度),所以我無法計算它。

球員座標爲700,5.41,600

當遊戲編輯800和700,遊戲使y以6.50

當我把它編輯到800和700,y座標還是5.41

6.50是座標,地形高度(800,700),5.41是地形高度700,600。

有沒有什麼辦法讓地形的高度爲座標?

非常感謝。

+2

_You_創建了地形莫名其妙,所以你告訴我們! – 2011-03-31 14:11:01

+0

我只是用dll鉤住這個程序......我不知道如何創建地形。 – 2011-03-31 14:13:31

+0

@ user439857:不知道地形的任何事情,我不能告訴你如何知道任何有關地形... – 2011-03-31 14:14:08

回答

1

它適用於騎士Online。它是一個包裝到CN3Terrain :: GetHeight(float x,float z)。

float getY(float x, float z) { 
__asm { 
    PUSH 0 
    PUSH z 
    PUSH x 
    MOV ECX,DWORD PTR DS:[0x0C26C20] 
    MOV ECX,DWORD PTR DS:[ECX+1Ch] 
    MOV EDX,DWORD PTR DS:[ECX] 
    CALL DWORD PTR DS:[EDX+34h] 
}} 
0

我使用的一個引擎允許您投射射線並確定它們與對象的交集。我通過從上面投射射線找到了「地面」,並找到了與地形的交點。

+0

我真的無法理解,因爲我的英文knowlage :( 無論如何,謝謝 – 2011-03-31 15:26:03

1

我找到了。 感謝大家。

該遊戲使用N3Terrain :)

float CN3Terrain::GetHeight(float x, float z) 

{ INT IX,IZ; ix =((int)x)/ TILE_SIZE; iz =((int)z)/ TILE_SIZE;

if(ix<0 || ix>(m_ti_MapSize-2)) return -FLT_MAX; 
if(iz<0 || iz>(m_ti_MapSize-2)) return -FLT_MAX; 

float dX, dZ; 
dX = (x - (ix*TILE_SIZE))/TILE_SIZE; 
dZ = (z - (iz*TILE_SIZE))/TILE_SIZE; 

float y; 
float h1, h2, h3, h12, h13; 

if((ix+iz)%2==0) //»ç°¢ÇüÀÌ/¸ð¾ç.. 
{ 
    h1 = m_pMapData[ix*m_ti_MapSize + iz].fHeight; 
    h3 = m_pMapData[(ix+1)*m_ti_MapSize + (iz+1)].fHeight; 
    if (dZ > dX) //À­ÂÊ »ï°¢Çü.. 
    { 
     h2 = m_pMapData[ix*m_ti_MapSize + (iz+1)].fHeight; 

     h12 = h1 + (h2-h1) * dZ; // h1°ú h2»çÀÌÀÇ ³ôÀÌ°ª 
     h13 = h1 + (h3-h1) * dZ; // h1°ú h3»çÀÌÀÇ ³ôÀÌ°ª 

     y = h12 + ((h13-h12) * (dX/dZ)); // ã°íÀÚ ÇÏ´Â ³ôÀÌ°ª 
     return y; 
    } 
    else //¾Æ·¡ÂÊ »ï°¢Çü.. 
    { 
     if(dX==0.0f) return h1; 

     h2 = m_pMapData[(ix+1)*m_ti_MapSize + iz].fHeight; 

     h12 = h1 + (h2-h1) * dX; // h1°ú h2»çÀÌÀÇ ³ôÀÌ°ª 
     h13 = h1 + (h3-h1) * dX; // h1°ú h3»çÀÌÀÇ ³ôÀÌ°ª 

     y = h12 + ((h13-h12) * (dZ/dX)); // ã°íÀÚ ÇÏ´Â ³ôÀÌ°ª 
     return y; 
    } 
} 

else if ((ix+iz)%2==1) //»ç°¢ÇüÀÌ ¿ª½½·¹½¬ ¸ð¾ç.. 
{ 
    h1 = m_pMapData[(ix+1)*m_ti_MapSize + iz].fHeight; 
    h3 = m_pMapData[ix*m_ti_MapSize + (iz+1)].fHeight; 

    if ((dX+dZ) > 1.0f) //À­ÂÊ »ï°¢Çü.. 
    { 
     if(dZ==0.0f) return h1; 
     h2 = m_pMapData[(ix+1)*m_ti_MapSize + (iz+1)].fHeight; 

     h12 = h1 + (h2-h1) * dZ; 
     h13 = h1 + (h3-h1) * dZ; 

     y = h12 + ((h13-h12) * ((1.0f-dX)/dZ)); 
     return y; 
    } 
    else //¾Æ·¡ÂÊ »ï°¢Çü.. 
    { 
     if(dX==1.0f) return h1; 
     h2 = m_pMapData[ix*m_ti_MapSize + iz].fHeight; 

     h12 = h2+(h1-h2)*dX; // h1°ú h2»çÀÌÀÇ ³ôÀÌ°ª 
     h13 = h3+(h1-h3)*dX; // h1°ú h3»çÀÌÀÇ ³ôÀÌ°ª 

     y = h12 + ((h13-h12) * (dZ/(1.0f-dX))); 
     return y; 
    } 
} 

return -FLT_MAX; 

}

相關問題