Anuncios Google

Formula para la orientación espacial usando un vector 3D[MOVIDO]

Que tal chicos, recien me he incorporado, y ando buscando una formula trigonométrica para desplazar un objeto 3d por el espacio o para poner orbitando un objeto sobre sus dos ejes... hace tiempo lo hice, pero ese trabajo fue borrado al romperse "fisicamente" el dispositivo que lo almacenaba...

De las pocas cosas que me acuerdo, es por ejemplo de girar un objeto sobre otro en un sólo eje, la clave es el fundamento elemental de la trigonometría, pero lo demás no se cómo hacerlo, ya que las matemáticas no fueron lo mío:

 

AnguloH=atan2(DistZ,DistX)
 
posX=radio*cos(AnguloH)
 
posZ=radio*sin(AnguloH)
 
...
 
...

 

Ésta misma formula sirve también para dibujar un círculo o describir un movimiento circular, logicamente variando el ángulo, que puede estár en radianes cómo en grados...

Bueno si alguien sabe de lo que estoy hablando que por favor conteste, gracias.

 

Editado: Movido a programacion, por favor postea en el lugar correcto, revise las normas de la comunidad. Gracias. Awe


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de copete23

Hola, ¿lo que quieres es

Hola, ¿lo que quieres es que rote al pulsar determinado boton, y se mueva a la direccion a la que mira, o que rote y se mueva hacia la posicion de un punto ya dado.

 

para moverse hacia un punto en concreto hay que obtener el angulo, creo que de esta forma

 

anguloxy=atan2(destino.y-objeto.y, destino.x-objeto.x);

anguloH=atan2(objeto.z, destino.x);

 

luego para moverse:

posx-=-cos(anguloxy)*velocidad;

posy-=-sin(anguloxy)*velocidad;

posz-=-cos(anguloH)*velocidad;

 

y para que el objeto rote segun la orientacion:

rotxy=anguloxy*(180 / 3.1416));

rotZ=anguloH*(180 / 3.1416));

 

Creo que puede ser algo así pero tal vez me he liado XD

saludos

Imagen de WhiteSkull

Si esa es, gracias copete ,

Si esa es, gracias copete , estás añadido a la lista de créditos de mi proyecto DS Guiño

 

Veo que te desenvuelves bien en 3D, tienes alguna scene o demo hecha? Yo la verdad que sólo estoy cargando modelos 3D para ver las limitaciones en el diseño, no veas lo lento que va compilando cuando le metes más de 20000 líneas de código opengl... de todas formas las pruebas las haré con modelos primitivos, si no, no veas, con lo que me gusta a mi cambiar una línea... no acabaría nunca... Por cierto me olvidé de comentar, el proyecto es sobre un "DoubleDragon" 3D, ya tengo un escenario para la primera fase, y ésta noche me pondré con el montaje del escenario, puede que te muestre algo dentro de una semana...

Un consejo.

Por si acaso te aviso, jeje. No uses floats. Son muy lentos de procesar para la DS. Usa fixed point en su lugar. Por ejemplo, en lugar de usar glVertex3f, usa glVertex3v16. En C:\devkitPro\libnds\include\nds\arm9\videoGL.h tienes las funciones que puedes usar.

Imagen de WhiteSkull

De momento, usando float me

De momento, usando float me va bien y estoy contento con los resultados, gracias por tu consejo AntonioDS, ya había leido sobre ésto y tengo documentación al respecto... pero continuaré con los float, me siento más cómodo, sobre todo a la hora de trabajar con las herramientas que tengo de diseño y conversión.

 

Además son sólo, aproximadamente, 7000 poligonos en pantalla/frame... recordad que el "cacharrillo" puede gestionar 120000 poligonos/segundo. 

 

Realmente lo más pesado es la compilación... al usar directamente los modelados en "opengl c", te puedes imaginar si no lo has hecho aún, por lo menos en mi portatil, 20000 líneas, se toma tranquilamente 10 minutos, y conservando algunos ficheros compilados sin modificar (sin hacer "clean"), por eso es bueno trabajar con varias fuentes, además de que el código no se te hace una "locura" y luego no hay por donde cogerlo... La ventaja de usar código opengl, es que es casi instantáneo, no se pierde apenas rendimiento, mientras que si guardo los vertices, normales, etc... y luego combino uno o varios procedimiento for, que a su vez tenga en cuenta la distancia de todos los vertices con respecto a la cámara, para pintarlos en un orden... buff... eso si que relanteliza, por mucho fixed point que uses... ya falta poco para que os mande "algo" Guiño

¿7000 polígonos/frame?

Que va. XD Tienes 6144 vértices disponibles por frame, lo que hace un total de 2048 triángulos. XD Hay trucos para aumentar este número, pero no se conserva el buffer z entre cada frame así que tienes que dibujar el escenario por partes.

 

Y no, por muchas operaciones que hagas, fixed point es muchísimo más rápido. Además, puedes aprovechar el coprocesador de divisiones y raíces cuadradas, cosa que no puedes hacer si usas floats.

 

Si es que en realidad cuando llamas a una función de libnds de gl que usa floats, está convirtiéndolos a fixed point. La DS no trabaja con floats para nada. glVertex3f llama a glVertex3v16 cambiando los floats por fixed point.

Imagen de WhiteSkull

NOOOOOOOOOOOOOOOOOOOOOOOrrrr

jajaja A ver Antoñito... son 7000 polígonos, se lo que es un polígono y lo que e sun vertice... claro que se puede, tu mismo nombras la respuesta... y además no lo entendistes bien... cuando digo polígonos en escena, no me refiero al escenario, la escena es lo que muestras, los actores, el escenario, todo lo visual... sumado en su totalidad es lo que tiene... además es un cálculo aproximado... el escenario unos 3000, los PJ 300, el mobiliario 100, multiplicalo por 5 o 10... y más o menos es eso...

Y sigues con el fixed point, te lo agradezco de verdad, cuando lo acabe te dejo todo el fuente para que lo putees todo lo que quieras ;) , los procesadores no trabajan con flotante, ninguno de ellos, estoy al tanto de cómo funciona un procesador (Arquitectura Von Newman), trabajan con registros, que son celdas de memoria que usan para cualquier operación... cargar un programa, realizar un cálculo, todo, funciona con registros... Si quisiera optimizar también podría usar ensamblador asm { con C++ , pero es que no quiero complicarme, estoy motivado lo suficiente para hacer algo a corto plazo, no quiero vender nada y ni ganar un premio al mejor código... ya una vez hecho el juego, se dará paso a la depuración... que si quieres te la dejo toa pa ti... Gracias Antoni, serás nombrado en los créditos cómo el hombre de los fixed point... es broma hombre no te lo tomes a mal... mira que casualidad, ya se compiló una cosita que voy a postearla para que la probeís.. 

 

Vale, lo del número de

Vale, lo del número de polígonos es que no habías dicho que no era lo que se iba a ver en pantalla, sino todo el escenario, ahora si tiene más sentido.

 

Pero yo te sigo diciendo que por mucha palabrería que me sueltes sobre la arquitectura del procesador, y de las posibles optimizaciones, usar floats es una estupidez, por lo menos en partes del código que se repitan mucho. Por cierto, para tu información, se programar en ensamblador, nunca he hecho nada en ARM para la DS, pero si para la GBC con su pseudo Z80, que es mucho más complicado.

 

Y hablando del procesador... el principal de la DS se supone que va a 66mhz, pero casi nunca va a esa velocidad porque el acceso a la memoria tiene unas penalizaciones muy grandes. Solo puede alcanzar esa velocidad cuando se ejecuta código de la ITCM que, lógicamente, no es lo habitual ya que solo tiene 32 kb de tamaño si no recuerdo mal. Si gastas la mitad de CPU en operaciones con floats y conversiones a fixed point, estás derrochando CPU por un tubo, a poco que tengas varios modelos animados y trates de hacer interpolación entre frames te comes la poca CPU que te queda. Lo ideal en la DS, es tener los modelos estáticos almacenados como display lists preparadas en el ordenador, que son muy rápidas de procesar, y el resto no queda mas remedio que hacerlo a mano, eso está claro, pero es mil veces más rapido dividir un int que un float, y más rapido aún multiplicar un int por el inverso del otro número, como sabrás. Si quieres usar floats, tu mismo... Supongo que estarás acostumbrado a programar para ordenadores donde mucha caña le tienes que meter al código para que le cueste procesarlo al ordenador, por muchos floats que uses, pero la DS no tiene nada que ver con un ordenador medianamente moderno...

 

Y dejo esta conversación, que veo que no lleva a ninguna parte.

Imagen de copete23

XD, jo que ganas tengo de

XD, jo que ganas tengo de aprender opengl, aunque por lo que he visto es lento hacer cosas en 3d, por ejemplo, ¿como haces para cargar un escenario, con sus diferentes objetos y demás? ¿hay que hacerse un editor? otra cosa es, ¿como cargas modelos externos? y ya otra cosa que me preocupa de esto son las colisiones, he oido por ahí que un sistema de colision simple, siempre que solo sea en el eje x e y, seria haciendo un mapa de colision mediante un aray pero ¿como sabes las medidas que tiene que tener?

En fin que tiene mucha telita esto del 3d XD

 

 

Imagen de WhiteSkull

PRUEBAME

Pues calculandolo, probándolo, y por último comprobando que encaja con el escenario, algunas veces se necesita mucha más presición en contra del rendimiento, pero yo suelo hacerlo al revés en éste escenario usé un array de 160 x 20... y me quedo perfecto... no solo funciona con dos ejes... yo puedo colocar un valor en la celda que indique la altura, cómo una especie de mapa de alturas, el cual se usa en normalmente para crear terrain o terrenos... es un sistema rápido, simple y que consume pocos recursos...

http://rapidshare.com/files/276570202/DoubleDII.nds.html

 


Imagen de copete23

XD, Pues mola, un juego de

XD, Pues mola, un juego de peleas calljeras como los de antaño, pero en 3d mola un monton, de momento las texturas se ven un poco chungas, supongo que tiene que ser un reto ponerlas, con lo limitada que esta la ds, no se cual será el tamaño maximo ¿128X128?.

Bueno parece que pormete, seguiré pendiente :)

 

Pd:Por cierto, estoy mirando como cargar modelos en 3d, que no tengo ni idea, pensé en hacer algo para cargar modelos md5 pero al ver su estructura me resulta muy complicado de momento XD ¿tu como los cargas, o que formato utilizas? lo que no pillo es como leer el archivo para pasar todos los datos de vertices y las posiciones de las texturas, pero vamos, que aún estoy muuuuy verde en esto del 3d, tengo que cambiar el chip 2d XD.

 

saludos!

Imagen de WhiteSkull

Bueno, si lo que quieres es

Bueno, si lo que quieres es desarrollar rápido, tienes que hacer lo siguiente, buscarte un editor 3D, por ejemplo el 3D MAX o BLENDER, luego necesitas un conversor de formato a "Opengl c", yo te recomiendo el Polytrans, de ésta forma te ahorrarás mucho tiempo de programación, y ya lo último es aprender un poco de "Opengl" , el opengl que incluye libnds , es una versión mini, yo de todas formas me guié desde éste documento, que te explica también cómo crear una clase para el formato X, www.lcc.uma.es/pfc/640.pdf

Luego sólo te queda experimentar primero con objetos muy simples, por ejemplo un cubo, un plano, etc... antes de dar paso a los objetos complejos...

 

suerte...

 

 

Imagen de copete23

Grácias :D, en cuanto a lo

Grácias :D, en cuanto a lo de 3d, me temo que no tengo nada, la verdad es que aún no me he puesto con ello, pero tengo intención de hacerlo XD, primero he de estudiarme un poco el funcionamiento de opengl. Lo malo del 3d es que se tarda muchisimo en hacer algo minimamente pasable XD.

Tiene que molar tu proyecto, me encantará seguirlo de cerca :)

saludos!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.