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
Lo siento, pero no me funciona.
:( 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
Coz, a mi se q me rula,... :D (banshee rulez...)
pd. por cierto, ¿cual es exactamente el problema que tienes con la camara?
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
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:
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.
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 ;*
Hmmm me da que es algo más complicado para 3D, a menos que no vayas a cabecear con la cámara.
Eso pensaba, por eso pregunté XD
Cabecear?
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.
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....)
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.
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?
el MilkShape3D. Exportar > MS3D ASCII
por cierto, te va el programa? XD
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 :)
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
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
Colson, el ultimo codigo q te puse funciono ? :)
Colson, no son de 512... son de 256. Pero bueno, eso ya es cosa tuya.
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..
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
cos y sin son funciones que esperan el ángulo en radianes...están rot.x, rot.y y rot.z en radianes?
Saludos
sip
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.
tal como está el codigo, nada más empezar (rotaciones = 0 y posnave = 0), se ve así:
(http://www.warcraft3es.com/camra3.GIF)
¿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.
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
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.
si, justo eso me pasa XDDDDD
que dices que debería cambiar?
P.D: me traduces ? direcciónalgorrotadaenelejeperpendicularalY oO
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.
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.
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.
vale ya lo he conseguido, gracias ;)
Sube el resultado cuando puedas, quiero ver la nave desde otro ángulo :)
pon tambien el codigo fuente del algoritmo!!! :D
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
a mi el vector Up ese no me acaba de convencer.... :P
me temo q colson no ha pillado para q vale el vector up :DDDDD
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
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!
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!
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".
El vect up tambien puede ser interesante que reciba las rotaciones del eje X,... vamos, creo yo. :)
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 ;)
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 :)
me referia a cuando la nave se inclina para subir o bajar
Si, Lord Trancos, se a que te refieres. Veré lo que puedo hacer =)
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.
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;
voy a probar a ver que tal queda thxx :-)