0

我的英语知识不足以告诉我的问题。我第二次使用stackoverflow。

我正在连接一个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

我找到了。谢谢大家。

游戏使用 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 回答
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 回答
0

我使用的一个引擎允许您投射光线并确定它们与物体的交点。我通过从上方投射一条瞄准下方的射线找到了“地面”,并找到了与地形的交叉点。

于 2011-03-31T14:34:24.293 回答