В приложении DirectX найдите z (местность) с известным местоположением - PullRequest
0 голосов
/ 31 марта 2011

Мой английский не достаточно хорош, чтобы рассказать о моих проблемах. и я использую stackoverflow второй раз.

Я подключаю приложение DirectX, я просто могу написать что-то на экран и получить информацию с экрана и другие вещи.

В этой игре есть местность, и много игроков. Я могу напрямую редактировать местоположение игрока (x, z, y). Но когда я редактирую координаты x и z, игрок летит :), потому что я не знаю, как рассчитать координату y (высоту местности), я не могу ее вычислить.

Координаты игрока 700, 5,41, 600

когда игра редактирует его до 800 и 700, игра превращается в 6.50

, когда я редактирую его на 800 и 700, координата y все еще 5.41

6.50 - это координата, высота местности (800, 700), 5.41 - это 700 600 высот местности.

Есть ли способ получить высоту местности по указанной координате?

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 31 марта 2011

Я нашел это.Спасибо всем.

Игра использует 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;

}

1 голос
/ 02 апреля 2011

Работает на Knight OnLine.это оболочка для CN3Terrain :: GetHeight (с плавающей точкой x, с плавающей точкой z).

0 голосов
/ 31 марта 2011

Один двигатель, который я использовал, позволял вам излучать лучи и определять их пересечение с объектами.Я нашел «землю», бросив луч сверху вниз и обнаружил пересечение с местностью.

...