Autor Wątek: Odczytanie wysokosci w konkretnym miejscu Hmapy  (Przeczytany 443 razy)

Offline duncarion

  • Użytkownik

# Styczeń 21, 2010, 12:10:38
Hej,

Probuje znalezc sposob aby odczytac pozycje gracza w konkretnym miejscu na mapie. Teren wygenerowany, postac umieszczona i.... kiedy sie poruszam dosyc czesto ekran "skacze" tak jakby nagle wysokosc byla o wiele za duza. Uzylem tego kodu : float  CTerrain::GetVertexHeight(int row, int col)
{
return _heightmap[row+(m_size*col)];
}
HRESULT CTerrain::GetY(D3DXVECTOR3& CameraPosition, float offset)
{
int a=0;
float minX=1000;
float minZ=1000;

for( float i = 0; i < m_gridSize; ++i )
{
for (float j = 0; j < m_gridSize; ++j )
{
if(m_verts[i+(257*j)].position.x<minX) minX = m_verts[i+(257*j)].position.x;
if(m_verts[i+(257*j)].position.z<minZ) minZ = m_verts[i+(257*j)].position.z;
}
}

float w = (CameraPosition.x - minX) / (float)m_spacing;
float q = (-CameraPosition.z - minZ) / (float)m_spacing;

col = static_cast<int>( floor(w) );
row = static_cast<int>( floor(q) );
 
A = GetVertexHeight(row, col);
B = GetVertexHeight(row, col+1);
C = GetVertexHeight(row+1, col);
D = GetVertexHeight(row+1, col+1);

float tx = static_cast<float>(col)-w;
float tz = static_cast<float>(row)-q;
 
    float txtz=tx*tz;
float h = A*(1-tz-tx+txtz)+B*(tx-txtz)+D*txtz+B*(tz-txtz);
CameraPosition.y = h+offset;
return S_OK;
}

Z gory dzieki za kazda sugestie :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Styczeń 21, 2010, 12:46:50
Witam ja uzywalem kiedys tego kodu sprawdzal sie bardzo dobrze:

float cHMap::GetHeight(float x, float z)
{

  float projCameraX = x / MAP_SCALE;
  float projCameraZ = z / MAP_SCALE;

int hflCol0 = int(projCameraX);
int hflRow0 = int(projCameraZ);
int hflCol1 = hflCol0 + 1;
int hflRow1 = hflRow0 + 1;


float h00 = g_terrain[hflCol0 + hflRow0*MAP_X][1];
float h01 = g_terrain[hflCol1 + hflRow0*MAP_X][1];
float h11 = g_terrain[hflCol1 + hflRow1*MAP_X][1];
float h10 = g_terrain[hflCol0 + hflRow1*MAP_X][1];

float tx = projCameraX - float(hflCol0);
float ty = projCameraZ - float(hflRow0);

float txty = tx * ty;

return h00 * (1.0f - ty - tx + txty)
+ h01 * (tx - txty)
+ h11 * txty
+ h10 * (ty - txty);
};

gdzie g_terrain ma postac float [MAP_X*MAP_Z][3] ale osobiscie polecam Zainteresowac sie PhysX bardzo latwo go dodac do silnika jest prosty i przejrzysty masa tutoriali i przykladow i ma wsparcie na kartach Nvidii :)