Mira para manejar todas las propiedades del cubo me manejo con 2 variables diferentes.
Una que guarda el origen, osea el punto central desde donde arranca el cubo.
Y otra que guarda por así decirlo, un offset de cada cada esquina con respecto a su origen.
Ejemplo yo creo un cubo, toma mi origen, y en la variable f_vCuboOrigin[ 3 ], guarda el origen.
Y luego por defecto los primeros offsets son:
PHP Code:
/* Z_AXIS, esta referido al superior e inferior ( Claro que esto es visible solo en el primer caso, luego si el cubo es girado en cualquiera de sus ejes euclideanos Pitch,yaw,roll, puede variar, y el inferior pasar a ser superior, pero yo lo sigo tomando como siempre, es simplemente una referencia, no le hagas mucho caso */
new const Float:fCube_default[ Z_AXIS ][ 4 ][ 3 ] =
{
{
{ -5.0, -5.0, -5.0 },
{ 5.0, -5.0, -5.0 },
{ 5.0, 5.0, -5.0 },
{ -5.0, 5.0, -5.0 }
},
{
{ -5.0, -5.0, 5.0 },
{ 5.0, -5.0, 5.0 },
{ 5.0, 5.0, 5.0 },
{ -5.0, 5.0, 5.0 }
}
};
Para girarlo tomo todos los offset y los giro en relacion a su origen, con unos stock, para cada condicion, eso anda perfecto, tambien puedo controlar el ancho, alto, y profundo, y moverlo en los ejes X,Y,Z, y/o transladarlo a un diferente origen.
En cuanto a lo del touch, no lo puedo utilizar, una entidad es estatica, y en el momento de colisionar me lo tomaria con un angulo { 0.0, 0.0, 0.0 }, estaria descartando posibilidades, y tomando otras que no me sirven. Utilizo este metodo, porque lei que es el que utilizan dentro de la colision con caras, al momento de trabajar con objetos relacionados a meshes, por ello estaba utilizando un algoritmo basado en el Algoritmo de trazado de rayos, solo que transladado a un plano 3D y no 2D, no es dificil, si se puede saber si una linea colisiona/atravieza/intersecta con un plano 3D, ya esta todo listo.
El trazado de rayos, esta diseñado para figuras irregulares, tanto como regulares, por ello es muy bueno, lo unico que hay que hacer, es trazar una linea desde un origen hasta su otro punto, y para saber si el punto esta dentro de la figura ( poligono, cuadrado, triangulo, etc ), se debe tomar en cuenta todos sus lados, es por ello, que si se produce interseccion en un numero par de lados, el punto se encuentra fuera, y si se produce en un numero impar, esta dentro.
Saludos.
PD: Disculpa el retraso, recien me siento frente al PC.
Edit:
Creo que se como solucionar el problema.
Lo que pasa es que yo estoy verificando si el segmento ( aiming origin - origin player ), esta colisionando con el plano ( el plano esta contenido por infinitos puntos ), hasta ahi vamos bien, pero yo ademas de hacer eso que es hasta ahora lo q tengo, deberia verificar si el punto de interseccion se encuentra dentro de la face, osea triangulo.
Estuve buscando y voy a aplicarlos, si alguien quiere interesarse y trasladar el pseudocodigo, o ecuación algebraica a PAWN, y postearlo aquí no hay problema.
Saludos.
PD: Aviso cuando termine si me funco.
Edit2:
Lo logre
Improvisé este STOCK, viendo una función que usaban en C#.
Esta basada en las "Coordenadas Baricéntricas".
PHP Code:
stock Float:dot( Float:u[ 3 ], Float:v[ 3 ] )
{
return ( u[ 0 ] * v[ 0 ] + u[ 1 ] * v[ 1 ] + u[ 2 ] * v[ 2 ] );
}
stock in_triangle( Float:A[ 3 ], Float:B[ 3 ], Float:C[ 3 ], Float:P[ 3 ] )
{
new Float:v0[ 3 ], Float:v1[ 3 ], Float:v2[ 3 ];
xs_vec_sub( C, A, v0 );
xs_vec_sub( B, A, v1 );
xs_vec_sub( P, A, v2 );
// Compute dot products
new Float:dot00 = dot(v0, v0)
new Float:dot01 = dot(v0, v1)
new Float:dot02 = dot(v0, v2)
new Float:dot11 = dot(v1, v1)
new Float:dot12 = dot(v1, v2)
// Compute barycentric coordinates
new Float:invDenom = 1 / (dot00 * dot11 - dot01 * dot01)
new Float:u = (dot11 * dot02 - dot01 * dot12) * invDenom
new Float:v = (dot00 * dot12 - dot01 * dot02) * invDenom
// Check if point is in triangle
return (u >= 0) && (v >= 0) && (u + v < 1);
}
Luego lo demas esta basado como dije antes, no cambie nada, lo unico que hice fue obtener el valor del escalar del vector director, en caso que colisione con alguno de los planos relacionados al cubo.
Luego lo unico que hago, cuando colisiona, y si el escalar esta entre el rango 0.0 a 1.0, y no pasa de ese rango, continuo verificando, esa cara/face de 3 vertices, osea un triangulo y si el punto obtenido por ( V0 + ( vectorDirector * t ) ) al momento de la colisión con el plano, esta dentro de esos 3 vertices, significa que atravieza una de las caras del cubo.
Saludos.
__________________