I am having problem with the most basic physic response when the player collide with static wall, floor or roof. I have a simple 3D maze, true means solid while false means air:
bool bMap[100][100][100];
The player is a sphere. I have keys for moving x++, x--, y++, y-- and diagonal at speed 0.1f (0.1 * ftime). The player can also jump. And there is gravity pulling the player down. Relative movement is saved in: relx, rely and relz.
One solid cube on the map is exactly 1.0f width, height and depth. The problem I have is to adjust the player position when colliding with solids, I don't want it to bounce or anything like that, just stop. But if moving diagonal left/up and hitting solid up, the player should continue moving left, sliding along the wall.
Before moving the player I save the old player position:
oxpos = xpos;
oypos = ypos;
ozpos = zpos;
vec3 direction;
direction = vec3(relx, rely, relz);
xpos += direction.x*ftime;
ypos += direction.y*ftime;
zpos += direction.z*ftime;
gx = floor(xpos+0.25);
gy = floor(ypos+0.25);
gz = floor(zpos+0.25);
if (bMap[gx][gy][gz] == true) {
vec3 normal = vec3(0.0, 0.0, 1.0); // <- Problem.
vec3 invNormal = vec3(-normal.x, -normal.y, -normal.z) * length(direction * normal);
vec3 wallDir = direction - invNormal;
xpos = oxpos + wallDir.x;
ypos = oypos + wallDir.y;
zpos = ozpos + wallDir.z;
}
The problem with my version is that I do not know how to chose the correct normal for the cube side. I only have the bool array to look at, nothing else. One theory I have is to use old values of gx, gy and gz, but I do not know have to use them to calculate the correct cube side normal.