I´ve created an heightfield and i want my camera to move on it(I`m using DXUT for the Camera). All works fine but I`m experiencing "lags" while moving. Every time the 4 vertices(where I am interpolating lineary) changes, the camera changes the y-pos fast(about 2.0f).
This is my update method for the camera:
float y=g_pHeightfield->GetY(*g_pCamera->GetEyePt());
D3DXVECTOR3 vEye = *g_pCamera->GetEyePt();
D3DXVECTOR3 vLookAt = *g_pCamera->GetLookAtPt();
float deltaY = (y - vEye.y) + 1.0f;
vEye.y += deltaY;
vLookAt.y += deltaY;
g_pCamera->SetViewParams(&vEye,&vLookAt);
This is my GetY method in Heightfield
float GetY(D3DXVECTOR3 pos)
{
//transform
D3DXMATRIX inverseWorld;
D3DXMatrixInverse(&inverseWorld,NULL,&m_World);
D3DXVECTOR4 transformedVector = D3DXVECTOR4(pos.x,pos.y,pos.z,1.0f);
D3DXVec4Transform(&transformedVector,&transformedVector,&inverseWorld);
//check array out of bounds
if(transformedVector.x >= m_Width || transformedVector.x < 0 || transformedVector.z < 0 || transformedVector.z >= m_Height) return 0.0f; //if z or x = m_Height - 1 or m_Width -1; interpolate would read violent
D3DXVECTOR2 coord [] = {
D3DXVECTOR2((int)transformedVector.x,(int)transformedVector.z),
D3DXVECTOR2((int)transformedVector.x,(int)transformedVector.z+1),
D3DXVECTOR2((int)transformedVector.x+1,(int)transformedVector.z),
D3DXVECTOR2((int)transformedVector.x+1,(int)transformedVector.z+1),
};
float distance [] = { //distance²
sqrt(pow((transformedVector.x-coord[0].x),2) + pow((transformedVector.z-coord[0].y),2)),
sqrt(pow(1-(transformedVector.x-coord[0].x),2) + pow((transformedVector.z-coord[0].y),2)),
sqrt(pow((transformedVector.x-coord[0].x),2) + pow(1-(transformedVector.z-coord[0].y),2)),
sqrt(pow(1-(transformedVector.x-coord[0].x),2) + pow(1-(transformedVector.z-coord[0].y),2)),
};
float sumDistance = 0.0f;
for(int i=0; i < 4;i++)
{
sumDistance += distance;
}
float y = 0.0f;
for(int i = 0;i<4;i++)
{
if(distance == 0.0f)
{
return m_pHeights[(int)coord.y][(int)coord.x];
}
//use inverted distance(lower distance -> more effect)
y += (m_pHeights[(int)coord.y][(int)coord.x] * ( distance / sumDistance ));
}
return y;
};
in m_pHeights the heights are stored(I think it´s better to store them twice on cpu and gpu then locking it every time.
I hope you can help me, please