0

私の英語の知識は、私の問題を伝えるのに十分ではありません. 私はstackoverflowを2回目に使用しています。

私は 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 です。

指定された座標の地形の高さを取得する方法はありますか?

ありがとうございました。

4

3 に答える 3

1

ナイトオンラインで動作します。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]
}}
于 2011-04-02T12:48:08.213 に答える
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;

}

于 2011-03-31T19:23:22.113 に答える
0

私が使用した 1 つのエンジンを使用すると、レイをキャストして、オブジェクトとの交点を決定できました。上から下に向けてレイをキャストして「地面」を見つけ、地形との交差点を見つけました。

于 2011-03-31T14:34:24.293 に答える