Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: CoLSoN2 en 25 de Diciembre de 2002, 12:24:30 AM

Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 25 de Diciembre de 2002, 12:24:30 AM
                                Bueno, creo que el subject define bastante claro lo que quiero hacer pero no consigo, hasta ahora el "efecto-cámara" que he conseguido puede verse aquí:

http://www.warcraft3es.com/test.rar 1.2MB | WinRAR | DirectX 8.1                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Haddd en 31 de Diciembre de 2002, 10:58:46 AM
                                Lo siento, pero no me funciona.                                
Título: ....
Publicado por: Grugnorr en 31 de Diciembre de 2002, 11:43:04 AM
                                :(  ERROR! Rendering from index buffer en loadModel.log

Pantalla en negro salvo los fps...

GF4Ti4200.


PD: Parece que el problema anda por aquí:

Secuencia en loadModel.log :
------------------------------------
Vertices copied
VBuffer created
Indices copied
IBuffer created
Loading texture
Texture created
Setting material
ERROR! Rendering from index buffer
------------------------------------------------

PDD: Eso de copiar los vertices antes de crear el VB suena raro, lo mismo con el IB :D                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Lord Trancos en 31 de Diciembre de 2002, 03:54:12 PM
                                Coz, a mi se q me rula,... :D (banshee rulez...)

pd. por cierto, ¿cual es exactamente el problema que tienes con la camara?                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 01 de Enero de 2003, 05:43:45 PM
                                a los dos que les falla, teneis instalado DX9? lo digo porque este usa 8.1, y según he oído han cambiado el DrawIndexedPrimitive ese, no se si afectará ...

He subido un nuevo test que refleja lo que tengo ahora, para que lo entendais mejor (al final del post). Aunque quizá os apañeis con este par de shots (dedicado a ethernet ;*)

Ahora mismo utilizo, para posicionar la cámara a cada frame el D3DXMatrixLookAtLH, utilizando la posición de la nave como referencia, pero restandole una cantidad en Y y en Z, para que se vea desde atrás. NOTA: si le pongo exactamente la de la nave (se ve desde la cabina) consigo el efecto que quiero, pero necesito que se vea desde atrás.
Como dirección, utilizo la misma que la nave, esto está bien, y como up también la de la nave.

En esta imagen
(http://www.warcraft3es.com/camra.gif)
podemos ver la situación de la nave y la cámara en el momento de inicio del programa, así como al girar la cámara. Nótese que al girar, la cámara deja de estar detrás de la nave.
NOTA: las lineas azules marcan el campo de visión de la cámara

En esta imagen vemos lo que quiero conseguir en los giros. Bueno, en todo momento ;)
(http://www.warcraft3es.com/camra2.gif)

Test2: 900 y pico kb's en wrar3 :
http://www.warcraft3es.com/test2.rar

--saludos                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Lord Trancos en 01 de Enero de 2003, 07:04:34 PM
                                Yo tengo DX9 :)

En cuanto a lo de la camara... solo necesitas saber la rotacion de la nave y un poco de trigonometria :)

s = posicion de la nave
a = angulo de rotacion (eje Y) de la camara
c = posicion de la camara
distancia = distancia de la camara

c.x = s.x + (cos(a) * distancia)
c.z = s.z + (sin(a) * distancia)
c.y = s.y + distancia

debe de ser algo asin... pero q conste q soy muy malo con las mates  :oops:  y suelo fallar cuando hago cosas de memoria (como ahora)   :loco:                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 01 de Enero de 2003, 07:11:21 PM
                                Yo creo que todos esos signos que has puesto deberían ser negativos, si no, te saldrá la cámara por delante de la nave.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 01 de Enero de 2003, 07:30:33 PM
                                hm, para los demás ejes de rotación supongo que será igual, no? Lo digo porque puede moverse en cualquier dirección.

y thx ;*                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 01 de Enero de 2003, 07:39:35 PM
                                Hmmm me da que es algo más complicado para 3D, a menos que no vayas a cabecear con la cámara.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 01 de Enero de 2003, 07:55:24 PM
                                Eso pensaba, por eso pregunté XD

Cabecear?                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 01 de Enero de 2003, 08:20:03 PM
                                Emmm... un avión puede inclinarse a izquierda o derecha, rotar plano o cabecear (para aterrizar o despegar). Las fórmulas de Trancos sirven si sólo te mueves en 2D, en el mismo plano. Pero si quieres inclinarte arriba o abajo, tendrás que tener en cuenta otra rotación más, es decir, otro ángulo más, que será el que tenga la normal de la cámara (tiene un nombre especial, pero ahora mismo no recuerdo cómo se llama).
No me hagas mucho caso, me estoy haciendo la picha un lío... igual el lookAt ya recoge esa otra dirección, y entonces tendrías que multiplicar las distancias por los senos y cosenos de los ángulos del lookat tal y como ha puesto Trancos.
Args, brain failure.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Lord Trancos en 01 de Enero de 2003, 10:57:41 PM
                                RotX, RotY, RotZ = rotaciones de la nave

pCamRelat = posicion relativa de la camara respecto de la nave

pAt = posicion de la nave

pUp.x = cos(RotZ)
pUp.y = sin(RotX) * sin(RotZ)
pUp.z = cos(RotX)

pEye.x = pAt.x + (pCamRelat.x * cos(RotZ) * cos(RotY))
pEye.y = pAt.y + (pCamRelat.y * sin(RotX) * sin(RotZ))
pEye.z = pAt.z + (pCamRelat.z * cos(RotX) * sin(RotY))

NOTA: :oops:  creo q he escrito alguna barbaridad (insisto, las mates no son lo mio....)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 01 de Enero de 2003, 11:24:33 PM
                                Esto me parece más ajustado, sí. Además incluyes el giro de inclinación, que tampoco habíamos tenido en cuenta antes. Bona nit a tots.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Loover en 02 de Enero de 2003, 02:07:00 PM
                                Oye Colson, he visto que la malla de la nave la tienes en modo ascii. ¿Qué programa o plugin has usado para crear ese archivo?                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 02 de Enero de 2003, 03:13:27 PM
                                el MilkShape3D. Exportar > MS3D ASCII

por cierto, te va el programa? XD                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Loover en 02 de Enero de 2003, 03:41:54 PM
                                Ah si! Si me va muy bien. Muy chula la nave girando y el skybox. Aunque prueba a ponerle uno de mayor tamaño (me refiero a la textura) que se ve demasiado difuminado.

Radeon 7200 64Mb

¿Y el ascii... lleva la misma información que un archivo típico en binario del milkshape?

PD: Voy a bajarme el milkshape :)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: BeRSeRKeR en 02 de Enero de 2003, 04:46:55 PM
                                Lo bueno del formato ascii de Milkshape es que soporta bones y todo. En la page de chumbalum podrás encontrar un cargador con soporte para bones...

Saludos                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 02 de Enero de 2003, 07:33:53 PM
                                si, es igual que el binario pero en ascii

las texturas del skybox creo que son 512x512, más sería abusibo
o te refieres a la nave? esa usa 256x256                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Lord Trancos en 02 de Enero de 2003, 07:49:46 PM
                                Colson, el ultimo codigo q te puse funciono ? :)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Loover en 02 de Enero de 2003, 09:46:34 PM
                                Colson, no son de 512... son de 256. Pero bueno, eso ya es cosa tuya.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 02 de Enero de 2003, 11:32:52 PM
                                Loover, probaré con 512

Trancos, es que no he podido aún probarlo porque por otra cosa que cambie me da un error de compilación que no he podido resolver, me dice:
'void' invalid with all types

en una funcion que tiene un parametro un void*, y pase lo que le pase, me da ese error, incluso NULL..                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 03 de Enero de 2003, 01:45:17 AM
                                Lord Trancos, no funsiona, hace cosas raras la cámara :



  D3DXVECTOR3 rot = player.GetRot();

  D3DXVECTOR3 pos = player.GetPos();

  D3DXVECTOR3 cam = D3DXVECTOR3(0,30,-100);

  D3DXVECTOR3 up;

  D3DXVECTOR3 eye;



  up.x = cos(rot.z);

  up.y = sin(rot.x)*sin(rot.z);

  up.z = cos(rot.x);

  eye.x = pos.x + (cam.x * cos(rot.z) * cos(rot.y));

  eye.y = pos.y + (cam.y * sin(rot.x) * sin(rot.z));

  eye.z = pos.z + (cam.z * cos(rot.x) * sin(rot.y));

 

  D3DXMatrixLookAtLH(&matrix,&eye,&player.GetDir(),

   &up);



No, si al final pondré un punto de mira y arreando XD                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: BeRSeRKeR en 03 de Enero de 2003, 02:30:51 AM
                                cos y sin son funciones que esperan el ángulo en radianes...están rot.x, rot.y y rot.z en radianes?

Saludos                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 03 de Enero de 2003, 07:25:21 PM
                                sip                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 03 de Enero de 2003, 07:47:17 PM
                                A mí me sigue pareciendo que con la suma la cámara te saldrá por delante de la nave en vez de por detrás.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 03 de Enero de 2003, 07:54:35 PM
                                tal como está el codigo, nada más empezar (rotaciones = 0 y posnave = 0), se ve así:

(http://www.warcraft3es.com/camra3.GIF)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 03 de Enero de 2003, 08:19:40 PM
                                ¿Y cómo debería verse? Parece que hay una rotación 90º a la izquierda de la cámara, prueba a ponerle nada más empezar una rotación 90º a la derecha. y luego todo el cacao.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 03 de Enero de 2003, 08:26:03 PM
                                igualmente luego no sigue así, al mínimo cambio hace cosas muy raras.

Bueno, he conseguido una tercera persona exacta, osea justo en la cola, a una distancia, pero esto no me interesa ya que tapa lo que sería "el objetivo", por eso necesito que tenga una cierta perspectiva en Y.

lo he hecho con:

posCam = posNave - dirrección*distanciaDeSeparación

, como se hace en los avances en los Update()'s y demás, pero cambiando velocidad por distancia y posAnterior pro posNave.

Si quereis verlo, http://www.warcraft3es.com/test3.rar : 1.3MB                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 03 de Enero de 2003, 10:03:17 PM
                                posCam = posNave - dirrección*direcciónalgorrotadaenelejeperpendicularalY*distanciaDeSeparación+distanciademásenY

:?:

Por cierto, cuando subes hasta el tope y das las "vuelta", tendrías que corregir también el giro de cámara para que no te saliera todo boca abajo.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 03 de Enero de 2003, 10:56:06 PM
                                si, justo eso me pasa XDDDDD
que dices que debería cambiar?

P.D: me traduces ? direcciónalgorrotadaenelejeperpendicularalY  oO                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 04 de Enero de 2003, 12:00:15 AM
                                A ver, antes de situar la cámara, elévala un poco y hazla apuntar hacia abajo de la manera en la que quieras que esté siempre después. Una vez la tengas como quieres sobre parado, miras qué rotaciones o desplazamientos has hecho y se lo añades a la formulita que habías puesto tú antes. Con eso debería bastar.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 04 de Enero de 2003, 01:24:21 AM
                                pero si en el vector direccion ya lleva esas rotaciones, osea esa es la dirección de la nave una vez hechas todas las rotaciones.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 04 de Enero de 2003, 03:37:57 PM
                                Sí, pero aparte de las rotaciones de la nave, tú quieres que la cámara sobresalga con un desplazamiento hacia arriba y que mire un poco hacia abajo, ¿no?. Esas dos transformaciones de más son las que deberías añadir.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 04 de Enero de 2003, 07:27:01 PM
                                vale ya lo he conseguido, gracias ;)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 04 de Enero de 2003, 10:32:01 PM
                                Sube el resultado cuando puedas, quiero ver la nave desde otro ángulo  :)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Lord Trancos en 05 de Enero de 2003, 09:19:35 AM
                                pon tambien el codigo fuente del algoritmo!!! :D                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 05 de Enero de 2003, 10:13:28 AM
                                cuando acaben las vacaciones subiré una nueva prueba con algo más que una nave dando vueltas XD
mientras, el "algoritmo" para obtener el resultado ha sido:





  D3DXVECTOR4 temp = D3DXVECTOR4(0,0,1,1);

  D3DXVECTOR3 dir = D3DXVECTOR3(0,0,1);



  D3DXVECTOR3 up = D3DXVECTOR3(0,1,0);

  D3DXVECTOR3 rot = player.GetRot();

  D3DXMatrixRotationYawPitchRoll(&matrix,rot.y,

   rot.x+D3DXToRadian(20),rot.z);

  D3DXVec3Transform(&temp,&dir,&matrix);

  D3DXVec4Normalize(&temp,&temp);

  dir.x = temp.x; dir.y = temp.y; dir.z = temp.z;

  D3DXVECTOR3 pos = player.GetPos();

  D3DXVECTOR3 eye = pos - dir*150;





  D3DXMatrixLookAtLH(&matrix,&eye,

   &player.GetDir(),&up);



aunque como bien decía Mars, al llegar al llegar a "arriba" en las rotaciones, la cámara se da la vuelta y se ve la nave arriba de la pantalla boca abajo, y no entiendo pq oO                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Lord Trancos en 05 de Enero de 2003, 10:43:34 AM
                                a mi el vector Up ese no me acaba de convencer.... :P                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: ethernet en 05 de Enero de 2003, 12:55:14 PM
me temo q colson no ha pillado para q vale el vector up :DDDDD
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 05 de Enero de 2003, 03:01:55 PM
                                Yo no tengo ni idea de para qué vale. Si sois tan amables de explicarlo en lugar de tacharlo como fallo únicamente, os lo agradeceré  :I                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: BeRSeRKeR en 05 de Enero de 2003, 04:16:36 PM
                                Pues a mi si me convence el vector Up...siempre y cuando el vector look no coincida con el vector Up!. La existencia del vector Up se debe a que con el vector Look y el Up, la función D3DXMatrixLookAtLH, calcula el vector Right a través del producto vectorial entre Look y Up. Una vez que tiene el vector Right, regenera el vector Up haciendo el producto vectorial entre Look y Right y ya tiene los vectores necesarios para crear una matriz "LookAt"  :D

Saludoooooos!                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: AgeR en 05 de Enero de 2003, 04:18:03 PM
                                Estooo yo es que me explico bastante mal, así que a ver si poniendo un ejemplo queda mas decente :

Imagínate que vas caminando por la calle normalmente (por el suelo, vamos). En ese momento tu "vector up" (como se llama a eso en castellano?) sería [0,1,0], usease positivo en el eje Y.
Ahora imagínate que andas cabeza abajo(o_O)... tu "vector up" sería negativo en el eje Y.

Bueno, todo esto es más fácil verlo probando a cambiar los valores del vector y ver lo que pasa.
Hmmm menos mal que no me quiero hacer profesor... XD

Saludos!                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 05 de Enero de 2003, 05:38:26 PM
                                Vale, entonces lo único que tienes que hacer es que cuando el vector up sea [0,-1,0] la cámara reciba una rotación ennn el eje de la z, creo, 180º, para que todo continúe "boca arriba".                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Lord Trancos en 06 de Enero de 2003, 09:41:47 AM
                                El vect up tambien puede ser interesante que reciba las rotaciones del eje X,... vamos, creo yo. :)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Mars Attacks en 06 de Enero de 2003, 10:38:01 AM
                                Te refieres a un efecto de balanceo cuando la nave gira, ¿no? Una cosa que queda bastante bien y que Drakkar ha hecho en el blast es que la cámara gire hasta la mitad del ángulo que se balancea la nave cuando lo ves en primera persona; así da un efecto mucho más realista.
Pero bueno, lo primero es que funcione, y luego ya vendrán las pijaditas ;)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: AgeR en 06 de Enero de 2003, 12:01:40 PM
                                No solo balanceo... obviamente se puede usar para más efectos, como "andar por las paredes"... Yo y mis explicaciones de estar por casa... XD
Lo mejor es trastear con el vector de marras, no hay nada como una imagen :)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: Lord Trancos en 06 de Enero de 2003, 12:16:41 PM
                                me referia a cuando la nave se inclina para subir o bajar                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 06 de Enero de 2003, 01:52:14 PM
                                Si, Lord Trancos, se a que te refieres. Veré lo que puedo hacer =)                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: ElQueSeRompeElOrto en 14 de Enero de 2003, 11:31:07 PM
                                hAber ColSon2 ,hace algo mas facil y sencillo:

Agarra la matriz de transformacion de la nave y ubica la camara de esta manera:

Primero la orientamos:
---------------------------
MatrizCamara._11 = MatrizNave._11;
MatrizCamara._21 = MatrizNave._12;
MatrizCamara._31 = MatrizNave._13;

MatrizCamara._12 = MatrizNave._21;
MatrizCamara._22 = MatrizNave._22;
MatrizCamara._32 = MatrizNave._23;

MatrizCamara._13 = MatrizNave._31;
MatrizCamara._23 = MatrizNave._32;
MatrizCamara._33 = MatrizNave._33;

y despues la posicionamos:

Camara.pos.x = MatrizNave._41 + MatrizNave._31 * -fDistancia;
Camara.pos.y = MatrizNave._42 + MatrizNave._32 * -fDistancia;
Camara.pos.z = MatrizNave._43 + MatrizNave._33 * -fDistancia;

fDistancia seria la distancia de la camara a la nave.

la idea de este algoritmo es Copiar la matriz transpuesta de la nave a
la camara y despues posicionarla usando el elemento de la matrizNave
"._31 ,._32 y ._33" , que es un vector cuyo modulo vale 1 y apunta siempre hacia adelante de la camara ,por eso pongo negativo a fDistancia
asi la camara se posa atras , de lo contrario seria adelante .
Te lo describo porque capaz que la pifie escribiendo. pero la idea funciona.

Otra cosa es que la nave estara justo adelante de la camara lo que deverias hacer es esto:

Camara.pos.x = MatrizNave._41 MatrizNave._21 * fElevacion +
+ MatrizNave._31 * -fDistancia;

Camara.pos.y = MatrizNave._42 MatrizNave._21 * fElevacion +
+ MatrizNave._32 * -fDistancia;

Camara.pos.z = MatrizNave._43 MatrizNave._21 * fElevacion +
+ MatrizNave._33 * -fDistancia;

asi la camara esta un poco mas arriba ,igual juga un poco con los elementos de las matrices.
un saludo.                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: ElQueSeRompeElOrto en 14 de Enero de 2003, 11:33:33 PM
                                me equiboque en la formula final ,me olbide del mas  + :

Camara.pos.x = MatrizNave._41 + MatrizNave._21 * fElevacion +
+ MatrizNave._31 * -fDistancia;

Camara.pos.y = MatrizNave._42 + MatrizNave._21 * fElevacion +
+ MatrizNave._32 * -fDistancia;

Camara.pos.z = MatrizNave._43 + MatrizNave._21 * fElevacion +
+ MatrizNave._33 * -fDistancia;                                
Título: Cámara en 3º persona para un juego de naves
Publicado por: CoLSoN2 en 15 de Enero de 2003, 07:38:40 AM
                                voy a probar a ver que tal queda thxx :-)