在 directx 应用程序中,找到已知位置的 z(地形)

发布于 2024-10-28 03:41:53 字数 409 浏览 1 评论 0原文

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

我正在挂接一个 directx 应用程序,我可以在屏幕上写一些东西并从屏幕和其他东西获取输入。

这个游戏有一个地形,还有很多玩家。我可以直接编辑玩家位置(x、z、y)。但是当我编辑x和z坐标时,玩家正在飞行:)因为我不知道如何计算y坐标(地形高度),所以我无法计算它。

玩家坐标为 700, 5.41, 600

当游戏将其编辑为 800 和 700 时,

,当我将其编辑为 800 和 700 时,游戏将 y 更改为 6.50,y 坐标仍然

是 5.41 6.50 坐标,地形高度为 (800, 700), 5.41 是 700,600 地形高度。

有没有办法获得特定坐标的地形高度?

更谢谢你了。

My english knowlage is not good enought to tell my problems. and i am using stackoverflow second time.

i am hooking a directx application, i just can wrote something to screen and get input from screen and other things.

This game has a terrain, and a lot of players. I can directly edit the player location (x, z, y). But when i edit x and z coordinate, the player is flying :) because i don't know how to calculate the y coordinate (terrain height), i can't calculate it.

Player coordinate is 700, 5.41, 600

when game edit it to 800 and 700, game makes y to 6.50

when i edit it to 800 and 700, the y coordinate still 5.41

6.50 is coordinate, height of terrain of (800, 700), 5.41 is 700,600 terrain height.

Is there a any way to get height of the terrain for speficed coordinate?

Thank you much more.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

逆光飞翔i 2024-11-04 03:41:53

我找到了。
谢谢大家。

游戏正在使用 N3Terrain :)

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

{
整数 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;

}

I found it.
Thanks to everyone.

The game is using 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;

}

谈情不如逗狗 2024-11-04 03:41:53

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

One engine I used allowed you to cast rays and determine their intersection with objects. I found the "ground" by casting a ray from above aimed down and found the intersection with the terrain.

鹿港巷口少年归 2024-11-04 03:41:53

它适用于 Knight 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]
}}

It works on Knight OnLine. its a wrapper to 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]
}}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文