Autor
|
Tema: Ayuda con las matemáticas !!! (Leído 9,248 veces)
|
BlackM4ster
Desconectado
Mensajes: 499
Error, el teclado no funciona. Pulse F1 para continuar
|
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?
|
|
|
En línea
|
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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)
|
|
« Última modificación: 10 Abril 2013, 21:33 pm por avesudra »
|
En línea
|
Regístrate en
|
|
|
BlackM4ster
Desconectado
Mensajes: 499
Error, el teclado no funciona. Pulse F1 para continuar
|
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);}
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
En lugar de PI/180, pon: Le quitas a la maquina una división ingame (recuerda que la división es una operación costosa).
|
|
|
En línea
|
|
|
|
|
Kilowatt
Desconectado
Mensajes: 11
|
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.
|
|
« Última modificación: 11 Abril 2013, 16:30 pm por Kilowatt »
|
En línea
|
|
|
|
|
Kilowatt
Desconectado
Mensajes: 11
|
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.
|
|
« Última modificación: 22 Abril 2013, 20:59 pm por Kilowatt »
|
En línea
|
|
|
|
Kilowatt
Desconectado
Mensajes: 11
|
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.
|
|
|
En línea
|
|
|
|
BlackM4ster
Desconectado
Mensajes: 499
Error, el teclado no funciona. Pulse F1 para continuar
|
Pues yo he conseguido sacar los ocho vertices de ambos bounding boxes y sería con eso
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Ayuda con las matemáticas !!!
Programación General
|
BlackM4ster
|
1
|
2,399
|
24 Abril 2013, 19:22 pm
por Saberuneko
|
|
|
Ayuda con las matemáticas 2 !!!
Programación C/C++
|
BlackM4ster
|
4
|
2,929
|
14 Abril 2013, 11:35 am
por BlackM4ster
|
|
|
Ayuda: Mejorar en matemáticas
Foro Libre
|
orocrux
|
3
|
1,718
|
7 Enero 2015, 00:47 am
por JonaLamper
|
|
|
ayuda con matematicas
Dudas Generales
|
MRx86
|
3
|
2,597
|
1 Diciembre 2016, 15:23 pm
por MCKSys Argentina
|
|
|
Develar un hash sha 256 o 512 con matematicas vorticiales
Hacking
|
Kerstui
|
4
|
5,330
|
15 Mayo 2024, 01:09 am
por Serapis
|
|