Ayuda con las matemáticas !!!

Iniciado por BlackM4ster, 10 Abril 2013, 20:36 PM

0 Miembros y 1 Visitante están viendo este tema.

BlackM4ster

Hola, estoy programando bounding boxes y tengo un problema a la hora de girar el objeto. P es el centro del objeto, tenemos el tamaño de x y de z. También tenemos el ángulo de rotación respecto al eje Z. Cual sería la formula para sacar el punto B en el segundo ejemplo?

- Pásate por mi web -
https://codeisc.com

avesudra

#1
Es que te podría ayudar pero no entiendo como está el objeto en el plano ahora mismo, aunque suponiendo que quieres girarlo con respecto al eje Z puedes usar trigonometría(que creo que sigue valiendo en el 3D por lo menos en este caso):
Siendo un punto B(1x,2y,3z) girarlo con respecto al eje Z 20º ,como la altura no cambia pues puedes girarlo con trigonometría quedando el punto

B' = ( cos(20) * 1 , 2 * sen (20) , 3z) = ( 0,93x , 0,68y , 3z)

Regístrate en

BlackM4ster

mm interesante, lo estaba resolviendo yo de esta manera:
dist[1] = sqrt(pow(pj.x-vx[1],2)+pow(pj.z-vz[1],2));
for (int i=1;i!=9;i+=2){
vx[i] = pj.x + dist[1] * sin((pj.ang_x+ang[i])*PI/180);
vz[i] = pj.z + dist[1] * cos((pj.ang_x+ang[i])*PI/180);}
- Pásate por mi web -
https://codeisc.com

amchacon

En lugar de PI/180, pon:

0,0174532

Le quitas a la maquina una división ingame (recuerda que la división es una operación costosa).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

BlackM4ster

Muchas gracias a los 2, es cierto, pero la optimizacion la haré más tarde  ;-)
- Pásate por mi web -
https://codeisc.com

Kilowatt

#5
Siento si interrumpo, solo pasaba por aqui, vi el problema y me gustaria poner mi solucion a ver si la ven bien.

Trasladas el eje a p (Al final sumaras las coordenadas del vector (OP) que une el origen que finalmente uses y el punto p).

Ahora, conoces el vector Bp (B con coordenadas con respecto a P)  y quieres B'P (B' con coordenadas tambien con respecto a P). En tu ejemplo, Bp seria ((-tam_x/2)X + (tam_z/2) Z).

Sabiendo Bp conoces Xbp y Zbp, sus coordenadas, por lo que tambien:
El modulo de Bp: Mbp = ((Xbp^2)+(Zbp^2))^(1/2);
Su angulo con respecto al eje P: Abp=arctg(Zbp/Xbp);

Tambien sabes el angulo de rotacion, que sera positivo o negativo segun el sentido de rotacion, en tu ejemplo negativo: -Ar.

Asi que las coordenadas de B'p seran ((Mbp*Cos(Abp - Ar))X + (Mbp*Sen(Abp - Ar))Z)

Y tu punto B' con respecto al eje que quieras usar (O) sera:

B' = (Xb'p + Px, Zb'p + Pz); Donde (Xb'p , Zb'p) son las coordenadas del vector B'p, ya hallado ; y (Px , Pz) son las coordenadas del punto p con respecto a O.

BlackM4ster

 ;-) Te aplaudo, gracias por la respuesta. Ahora mismo, los bounding boxes son cuadrados (angulos de 45º y 135), asi que directamente los pongo yo. Estoy trabajando en un loader de objetos en 3D. Cuando acabe de hacerlo, aplicaré tu forma ya que no serán todos cuadrados. Por casualidad no sabrias detectar colisiones entre un bounding box alineado al objeto y otro? o uno alineado y el otro a los ejes?
- Pásate por mi web -
https://codeisc.com

Kilowatt

#7
Antes de nada, perdon por la tardanza.

Realmente no se a que te refieres con bounding box alineado al objeto, porque de programacion en C no voy muy alla, solo he hecho java. De todas formas voy a suponer que el bounding box delimita hasta donde llega el objeto (por su nombre) y quieres saber si hay colision entre dos de estas cajas. A no ser que ya haya metodos que faciliten el trabajo, detectar una colision lleva un poquito de trabajo desde mi punto de vista, pero supongamos algo:

Lo normal es que no haya colisiones, asi que un metodo que no requiera mucho trabajo por parte del PC y que si da true significa que NO HAY colisiones sera el siguiente (Ojo, si este algoritmo da true significa que no hay colisiones, pero si da false no significa nada, puede que las haya o puede que no, y tendremos que estudiarlo mas a fondo, pero en principio esta bien para ponerlo de condicion en un if y ahorrarnos computo si lo normal es que no se produzcan colisiones).

El principio es el siguiente: Tenemos dos bounding boxes, una centrada en P0 y otra en P1, si sus origenes distan mas de la distancia entre el punto de la BB en P0 mas lejano del centro (P0), sumado a la distancia del punto de la BB en P1 mas lejano del centro (P1), es imposible que haya colision.

Esto es, si el modulo del vector que va desde P0 hasta P1, desde ahora P01, es menor que dicha distancia, da false. Definamos algunas cosas:

P01 = ((XP0 - XP1)X + (ZP0 - ZP1)Z); Vector P01
MP01 = ((XP01)^2 + (ZP01)^2)^(1/2) = ((XP0 - XP1)^2 + (ZP0 - ZP1)^2)^(1/2) ; Modulo del vector P01

Ahora necesitamos la distancia al centro del punto(s) mas lejano. Siendo cuadrados, dichos puntos son los vertices, llamemos a la longitud del lado de la BB0, L0, y L1 para el lado de BB1. Voy a generalizarlo para rectangulos, pues en tu ejemplo has llamado de distinta forma a los lados (tam_x y tam_z), asi que supongo que no tienen porque ser iguales, de esta forma BB0 tiene los lados L0A y L0B, y BB1 tiene L1A y L1B. (Ejemplo: si la caja de tu dibujo fuera BB0, L0A seria tam_x y L0B sera tam_z o al reves, el orden es indiferente). Definimos:

DM0 = ((L0A/2)^2 + (L0B/2)^2)^(1/2); Mayor distancia desde P0 hasta un punto contenido en BB0, esto es, a cuanta distancia esta el punto mas externo de BB0.
DM1 = ((L1A/2)^2 + (L1B/2)^2)^(1/2); Analogo a DM0, pero para BB1.

Asi, si MP01 es menor que DM0 + DM1, el algoritmo da true y deberias estudiar mas a fondo lo que esta pasando con otro algoritmo que pensare luego para hacerlo con la mayor simpleza que se me ocurra. Sin embargo, si da false, puedes descartar toda posibilidad de colision.

Espero que te sirva de algo, aunque lo he hecho bastante rapido sin pensarlo mucho, asi que puede ser que tenga errores o que haya una manera mas rapida y facil de hacerlo y la he pasado por alto. Intentare ponerte que haria yo en caso de que diera false lo antes posible.

Un saludo.

Kilowatt

He estado pensando un poco lo de las colisiones, y aunque creo que voy camino de dar con un metodo, me facilitaria mucho las cosas saber con que informacion de las bounding boxes cuentas en todo momento, ademas de las coordenadas del centro y la longitud de sus lados. Si pudiera conocer su grado de inclinacion o la posicion concreta de sus vertices en ese momento por ejemplo atajaria bastante, ya que con lo que se estoy haciendo cosas demasiado complejas para calcular algo tan simple, asi que dudo que tenga alguna utilidad.

BlackM4ster

Pues yo he conseguido sacar los ocho vertices de ambos bounding boxes y sería con eso
- Pásate por mi web -
https://codeisc.com