1º aclaración: un valor arbitrario es aquel valor que tu decides, no es un valor aleatorio.
2º Aclaración: Vas a necesitar saber sobre matrices para entender todo lo que voy a explicar abajo.
//////////////////////////////////////////////////////////////
Bueno, sabiendo que trabajas con el OpenGL antiguo, te puedo indicar mejor.
Cuando rotas con glTranslatef, los tres últimos parámetros son vectores que representan ejes de rotación. Entonces, en resumidas cuentas, hay que seguir estos pasos:
1º Paso (Opcional): Declarar una estructura llamada vec3, que represente un vector en 3D:
struct vec3 {
float x;
float y;
float z;
};
Además de una estructura que represente una matriz de 3x3:
struct mat3 {
float elementos[3][3];
};
2º Paso: Declarar un vector 3D que represente la dirección relativa en la que quieres mover el cubo (en tu caso, como lo quieres mover por el eje X, pues el vector sería (1, 0, 0)):
vec3 eje_desplazamiento = {1, 0, 0};
3º Paso: Crear matriz de rotación. Para realizar este paso, debes saber que la matriz de rotación sobre un eje es la siguiente:
Una vez sabido esto, declaramos una función que asigne una matriz de rotación a nuestra matriz:
void rotar_matriz(float angulo, mat3& matriz, vec3& eje) {
matriz.elementos[0][0] = cos(angulo) + pow(eje.x, 2.0)*(1 - cos(angulo));
matriz.elementos[0][1] = eje.x*eje.y*(1 - cos(angulo)) - eje.z*sin(angulo);
matriz.elementos[0][2] = eje.x*eje.z*(1 - cos(angulo)) + eje.y*sin(angulo);
matriz.elementos[1][0] = eje.x*eje.y*(1 - cos(angulo)) + eje.z*sin(angulo);
matriz.elementos[1][1] = cos(angulo) + pow(eje.y, 2.0)*(1 - cos(angulo));
matriz.elementos[1][2] = eje.y*eje.z*(1 - cos(angulo)) - eje.x*sin(angulo);
matriz.elementos[2][0] = eje.x*eje.z*(1 - cos(angulo)) - eje.y*sin(angulo);
matriz.elementos[2][1] = eje.y*eje.z*(1 - cos(angulo)) + eje.x*sin(angulo);
matriz.elementos[2][2] = cos(angulo) + pow(eje.z, 2.0)*(1 - cos(angulo));
}
4º Paso: Crear una función (o si quieres sobrecargas el operador *) que multiplique una matriz por un vector:
void multiplicar(mat3& matriz, vec3& vector) {
vec3 resultado = {0, 0, 0};
resultado.x = matriz.elementos[0][0] * vector.x + matriz.elementos[0][1] * vector.y + matriz.elementos[0][2] * vector.z;
resultado.y = matriz.elementos[1][0] * vector.x + matriz.elementos[1][1] * vector.y + matriz.elementos[1][2] * vector.z;
resultado.y = matriz.elementos[2][0] * vector.x + matriz.elementos[2][1] * vector.y + matriz.elementos[2][2] * vector.z;
vector.x = resultado.x;
vector.y = resultado.y;
vector.z = resultado.z;
}
5º Paso: rotar el vector que declaramos en el paso dos tal y como has rotado el cubo:
vec3 eje_desplazamiento = {1, 0, 0};
mat3 matriz_rotacion;
rotar_matriz(objPruebas1.rotX, matriz_rotacion, {1, 0, 0});
multiplicar(matriz_rotacion, eje_desplazamiento);
rotar_matriz(objPruebas1.rotY, matriz_rotacion, {0, 1, 0});
multiplicar(matriz_rotacion, eje_desplazamiento);
rotar_matriz(objPruebas1.rotZ, matriz_rotacion, {0, 0, 1}); // Date cuenta que el tercer parametro es el mismo que usabas en glRotatef
multiplicar(matriz_rotacion, eje_desplazamiento);
5º Paso: desplazar el cubo. Ahora ya tenemos el eje donde se desplazará el cubo rotado tal y como hemos rotado el cubo. Ahora tenemos que desplazar el cubo:
float unidades_a_desplazar = 5.0f; // Aquí pones las unidades que te quieres desplazar. Por ejemplo, yo he puesto 5.0f, pero tu puedes poner el valor que quieras.
eje_desplazamiento.x *= unidades_a_desplazar;
eje_desplazamiento.y *= unidades_a_desplazar;
eje_desplazamiento.z *= unidades_a_desplazar;
glTranslatef(eje_desplazamiento.x, eje_desplazamiento.y, eje_desplazamiento.z);
Como ves, es un proceso relativamente largo, pero si quieres hacerlo manualmente, me temo que no tenemos otra salida.