Programacion 3D¿Como dividir la pantalla segun jugadores?

Buenas a todos de nuevas!!! Como ya comente en otro hilo del foro estoy intentando hacer un jueguecillo cutrero en 3D y tengo un problema que hace que no pueda seguir. Me gustaria añadirle la funcionalidad de multijugador y para ello me gustaria que si hay dos jugadores se dividiese la pantalla de la TV en dos y asi hasta cuatro.
He mirado las funciones de las librerias gu.h/gx.h y el manual de Hermes para graficos en 3D pero no se me ocurre como hacerlo :-? .

Podria hacerse con multiples GX_SetViewport(0,0,rmode->fbWidth,rmode->efbHeight,0,1);???

Cualquier sugerencia sera bien recibida!!! Saludos!! [plas]

P.D. Agradecerle a [tadoramo] Hermes la publicacion del tutorial Graficos 3D para wii que ha sido de gran ayuda para iniciarme en este mundillo!!!!
Bueno, el revolution engine lo hace asi que puedes usarlo o simplemente mirar el código a ver cómo lo hace:
http://www.revolutionengine.tk/
(no creo que esto sea considerado spam, no?)
woltrixx escribió:Bueno, el revolution engine lo hace asi que puedes usarlo o simplemente mirar el código a ver cómo lo hace:
http://www.revolutionengine.tk/
(no creo que esto sea considerado spam, no?)


Hola Woltrixx aprovecho para preguntarte por aquí, que en el IRC no solemos coincidir:

¿Cuál es la versión más reciente estable que hay de REVEngine? Es que la 0.4 Alpha3 tiene un bug conocido y la Alpha2 me da igualmente error cuando asigno cualquier textura a un modelo. ¿Tienes tú el mismo error? :-?

A ver si consigo que finalmente me funcione, que le tengo mucho cariño a este engine ya ha llegado la hora de usarlo. ;)

Salu2!
Si se puede hacer con setviewport. Tienes que hacer cuatro renderizados cambiando el viewport. Luego el flush y swapbuffers.
Vrsquid escribió:Si se puede hacer con setviewport. Tienes que hacer cuatro renderizados cambiando el viewport. Luego el flush y swapbuffers.



Gracias Vrsquid!! Anoche comprobe que se tienen que hacer setviewport pero no conseguia que se me refrescara la pantalla correctamente aparecian muchos frames negros :( , parecia que estaba utilizando un televisor con una frecuencia de 10 Hz [+risas] jejejejjeje .
¿¿¿ El flush y el swapbuffers lo tengo que hacer por cada setviewport???

Saludos!
paipum escribió:(..) ¿ El flush y el swapbuffers lo tengo que hacer por cada setviewport? (..)


Hablo de oídas (aún no he programado con diferentes viewports en Wii) pero se supone (s.e.u.o.) que tienes que intercambiar los búferes en cada contexto. En resumen, sí.

Saludos.
Lo voy a poner lo que se hace por cada frame.

limpiar el buffer de color

player 1:
setviewport
resetear matrix de proyeccion
seleccionar nuevo modo de perspectiva
resetear matriz de mundo
limpiar el buffer de profundidad
dibujar

player 2:
setviewport
resetear matrix de proyeccion
seleccionar nuevo modo de perspectiva
resetear matriz de mundo
limpiar el buffer de profundidad
dibujar

player 3:
setviewport
resetear matrix de proyeccion
seleccionar nuevo modo de perspectiva
resetear matriz de mundo
limpiar el buffer de profundidad
dibujar

player 4:
setviewport
resetear matrix de proyeccion
seleccionar nuevo modo de perspectiva
resetear matriz de mundo
limpiar el buffer de profundidad
dibujar

flush
Swap buffers

el swap buffers se hace al final el flush es opcional tanto al acabar de dibujar cada jugador como antes del swap buffers pero yo siempre lo pongo antes de cambiar de buffer. Tambien aclaro que no se cambia en ningun momento el DC sigue siendo el mismo pero no lo dibujamos entero.
Muchas gracias Vrsquid me ha quedado mas claro. Lo unico que me queda por confirmar es que cuando dices swap buffers te refieres a
VIDEO_SetNextFramebuffer(frameBuffer[frame]);
??? Perdona por mi ignorancia, pero en temas de programacion grafica estoy empezando y hay cosas que se me escapan y que supongo que deberia saberlas. A ver si tengo un rato esta noche y lo puedo probar que tambien estoy liado con la usb gecko que me acabo de comprar y no consigo poder cargar dols enviandolos por el usb [+furioso] .

Saludos!!
No sé en qué estás programando, pero mi preferencia es NO actualizar en cada iteración las vistas, proyección, perspectiva, etc. Lo encuentro muy poco eficiente (es una preferencia personal, de todos modos).

Yo prefiero crear un objeto por cada contexto de renderizado (vista) y ajustar matriz de proyección, perspectiva, etc sólo al instanciar el objeto, o cuando cambia el lienzo común (que en Wii no será necesario porque siempre será la pantalla completa) o cuando se oculta alguna de las vistas definidas. Todo esto en un método para esa clase. Y en otro método, realizar simplemente el dibujo de cada escena, comprobando antes si el contexto tratado en esa ocasión debe reajustarse. Si no es necesario, todos esos pasos se ahorran.

Y por último, con un timer (definido también en el propio objeto "vista"), llamo al método para dibujar la escena (donde sí se intercambias los búferes), asegurando así un refresco "constante" de la pantalla.

En mi opinión es mejor solución que ir iterando a saco.

Saludos.
Deschamps escribió:No sé en qué estás programando, pero mi preferencia es NO actualizar en cada iteración las vistas, proyección, perspectiva, etc. Lo encuentro muy poco eficiente (es una preferencia personal, de todos modos).

Yo prefiero crear un objeto por cada contexto de renderizado (vista) y ajustar matriz de proyección, perspectiva, etc sólo al instanciar el objeto, o cuando cambia el lienzo común (que en Wii no será necesario porque siempre será la pantalla completa) o cuando se oculta alguna de las vistas definidas. Todo esto en un método para esa clase. Y en otro método, realizar simplemente el dibujo de cada escena, comprobando antes si el contexto tratado en esa ocasión debe reajustarse. Si no es necesario, todos esos pasos se ahorran.

Y por último, con un timer (definido también en el propio objeto "vista"), llamo al método para dibujar la escena (donde sí se intercambias los búferes), asegurando así un refresco "constante" de la pantalla.

En mi opinión es mejor solución que ir iterando a saco.

Saludos.


Es una buena opcion a tener en cuenta, lo estudiare mas detenidamente este fin de semana a ver si termina de convencerme. Estoy programando con las librerias gu.h y gx.h.


Ya me funciona!!! Al pelo no pero casi, me falta algun ajuste tonto pero rula. Lo que me faltaba era poner
GX_DrawDone();
por cada jugador o perspectiva. A ver ahora con que me atranco, jejejejjee

Saludos
9 respuestas