A ver. Vayamos por puntos.
Cuando dices "arbitrario" en una matriz, ¿te refieres a valores que puedo cambiar y valores que no? ¿O te refieres a valores que son aleatorios? Como me digas que son valores aleatorios me quedo peor que antes.
Por otra parte, yo utilizo "glTranslatef()" y "glRotatef()" para mover el centro del objeto que voy a dibujar. Despues dibujo los vertices y elimino las transformaciones realizadas. Para ser mas concretos lo hago con el siguiente orden:
glTranslatef(objPruebas1.x, objPruebas1.y, objPruebas1.z);
glRotatef(objPruebas1.rotX, 1.0, 0.0, 0.0);
glRotatef(objPruebas1.rotY, 0.0, 1.0, 0.0);
glRotatef(objPruebas1.rotZ, 0.0, 0.0, 1.0);
En mi caso los objetos tienen tres floats de posicion y tres floats de rotacion indicados en grados, no en radianes. Para dibujar no hay problema, el problema son otras cosas que quiero desarrollar y que no puedo hasta no tener una funcion para movimientos locales 3D.
Y por ultimo, cosillas que no alcanzo a entender:
- ¿Cual es la diferencia entre "rotar eje" y "rotar cubo"?
- ¿El vector unitario debo calcularlo? ¿O ya lo tengo y aún no lo sé?
Las imagenes las tendiendo y es justo lo que busco conseguir. El problema es el codigo. Hasta hace algun tiempo para mi los vectores solamente eran arrays de datos donde acumular variables, objetos, enemigos,... Pero ahora me encuentro en la necesidad de entender las matematicas para manejarlos.
Me estoy haciendo un lio con el "pseudocodigo" ese. Ponme un codigo para esto y ya trataré de entenderlo despues (que es lo que he hecho mogollon de veces [no siempre, pero muchas veces]). ¿Que debería poner en donde tengo "#5248596GIRLEP"?
struct objType {
float posX;
float posY;
float posZ;
float rotX;
float rotY;
float rotZ;
objType();
};
objType::objType() {
posX = 0.0;
posY = 0.0;
PosZ = 0.0;
rotX = 0.0;
rotY = 0.0;
rotZ = 0.0;
}
objType movimientoLocal(float XOrigen = 0.0, float YOrigen = 0.0, float ZOrigen = 0.0, float rotX = 0.0, float rotY = 0.0, float rotZ = 0.0, float desplazamientoX = 0.0, float desplazamientoY = 0.0, float desplazamientoZ = 0.0) {
objType tempObj;
/*
¿Cual es el codigo que debería poner aqui?
#5248596GIRLEP (Esto tan extraño es como referencia, nada mas.)
*/
tempObj.rotX = rotX;
tempObj.rotY = rotY;
tempObj.rotZ = rotZ;
return tempObj;
}
objType objPruebas;
int main() {
objPruebas.rotX = 154.2;
objPruebas.rotY = 362.4;
objPruebas.rotZ = 15.7;
objPruebas = movimientoLocal(objPruebas.posX, objPruebas.posY, objPruebas.posZ, objPruebas.rotX, objPruebas.rotY, objPruebas.rotZ, 1.2, 0.0, 0.0);
cout << "La posicion del objeto es: {" << objPruebas.posX << "," << objPruebas.posY << "," << objPruebas.posZ << "}" << endl;
return 0;
}
Como se puede ver he puesto tres ejes de desplazamiento. Esto se debe a que aveces puede ser util un eje u otro dependiendo de como este distribuida la malla del objeto. Aveces el eje X del objeto puede representar el adelante y atrás ("+X" y "-X") de este. Otras veces puede ser el eje Z ("+Z" y "-Z"). Es por tener a mano un código mas polivalente.
También es evidente que podría pasar el objeto por referencia e indicarle los valores de desplazamiento para ahorrarme pasar tantas variables, pero no sería tan polivalente. También habría que evitar que la función utilizase la estructura del objeto en cuestión, pero para el ejemplo es lo de menos. Ya me encargaré después de adecuarla a cada necesidad que me surja.
Como referencia, yo me sé manejar con el logic brick de desplazamiento de Blender. Es por eso que me gustaría tener una función similar en C++ (pero en otros lenguajes también me puede ser útil para el futuro).