tag:blogger.com,1999:blog-2060897779951510272024-03-18T22:08:07.006-05:00SteelX Desarrollo de JuegosJuan Carlos Oterohttp://www.blogger.com/profile/15801016748101762493noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-206089777995151027.post-16468423391339874932008-07-05T11:02:00.004-05:002008-07-05T11:28:23.108-05:00Nodos de EscenaEsta es una parte importante de Ogre, pues se pueden crear Objetos, Entidades, pero para que puedan tener interacción deben estar asociados a un SceneNode. estos nodos la mayoría de las Veces son creados con e SceneManager de esta manera :<br /><div style="border: 1px groove rgb(91, 0, 183); background-color: rgb(221, 249, 255);"><br />SceneNode* NodoDeEscena = mSceneMgr->getRootSceneNode()->createChildSceneNode( "Nodo" );<br /></div><br /><br />pero no todo los nodos son hijos de SceneManager (mSceneMgr). También los Nodos pueden ser Hijos de otros nodos, así con esto si el padre se mueve el hijo se mueve con el. Un ejemplo un arma, un bate de baseball. Si creamos un nodo que sea un hombre para cargar un bate sería<br /><br /><div style="border: 1px groove rgb(91, 0, 183); background-color: rgb(221, 249, 255);"><br />SceneNode* NodoHombre = mSceneMgr->getRootSceneNode()->createChildSceneNode( "hombre" );<br /><br />SceneNode* NodoBate = NodoHombre ->createChildSceneNode( "bate" );<br /><br /></div><br /><br />así el bate queda siendo hijo de Hombre y se mueve para donde hombre vaya.<br /><br /><br />En otra ocasión explicaré los nodos huérfanos.Juan Carlos Oterohttp://www.blogger.com/profile/15801016748101762493noreply@blogger.com0tag:blogger.com,1999:blog-206089777995151027.post-40532806552454681502008-06-30T20:44:00.001-05:002008-11-13T04:43:22.676-05:00Crear una aplicación básica en OgreBuenas, esto si es un dolor de cabeza para cualquiera que esté empezando con este buen motor.<br /><br />Requisitos:<br /><br />-C++ (está demás ponerlo, pero casos se han visto)<br />-Visual Studio 2005 o 2008 express<br />-Ogre Eihort version 1.47 o superior<br /><br /><br />Configuración del visual studio,usando lo básico de Visual C++:<br /><br />abrimos el Visual C++ y creamos una aplicación nueva y seleccionamos <span style="font-weight: bold;">win32project </span> y le colocamos un nombre y pasamos a la siguiente ventana.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2hSiFrazyoLMgKpDqPKuhm4Kt1M0LX4dq7yAqnld6sikBLepv6vNLvjdI9h7lT45YvTf55Eh_R7uhvG8CwGTW4xIDS-KWDqMCFdblY4QMTJsNJa7_laF9wYC658pDyq4w834asiTtufiP/s1600-h/crear_nuevo.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2hSiFrazyoLMgKpDqPKuhm4Kt1M0LX4dq7yAqnld6sikBLepv6vNLvjdI9h7lT45YvTf55Eh_R7uhvG8CwGTW4xIDS-KWDqMCFdblY4QMTJsNJa7_laF9wYC658pDyq4w834asiTtufiP/s320/crear_nuevo.jpg" alt="" id="BLOGGER_PHOTO_ID_5194851570586022434" border="0" /></a>Seleccionamos Windows application en la otra ventana y seleccionamos la casilla de empty project. Con esto evitamos que se creen varios archivos innecesarios.<br /><br />primero agregamos un archivo de tipo cpp, en el menú project, seleccionamos add new item. Le damos un nombre por ejemplo<span style="color: rgb(51, 102, 255);"> <span style="font-weight: bold; color: rgb(0, 0, 153);">main</span></span>.<br /><br />ahora a la parte de la configuración del proyecto. En el menú project, seleccionamos <span style="font-weight: bold;">properties</span> o presionamos <span style="font-weight: bold;">alt +f7</span>, vamos a configurar para modo de depuración(debug).<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioDhcqeRtQk3NahiXqsz_RFSWsnbZUt0J448UGUOWgCBq3kwuNggEt3sdiwJW3bWwo_j_5Rqvoa0nuemK47fWE2X3vMd0Uvck-UlUwbq64awb4mNwvfwKGJB07mwXDiXw1l0J-hEHMQA4_/s1600-h/propiedades.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioDhcqeRtQk3NahiXqsz_RFSWsnbZUt0J448UGUOWgCBq3kwuNggEt3sdiwJW3bWwo_j_5Rqvoa0nuemK47fWE2X3vMd0Uvck-UlUwbq64awb4mNwvfwKGJB07mwXDiXw1l0J-hEHMQA4_/s320/propiedades.jpg" alt="" id="BLOGGER_PHOTO_ID_5217732093789798674" border="0" /></a> <span style="font-weight: bold;"> imagen 2: C/C++</span><br /><br />Seleccionamos C/C++ en el árbol de opciones( señalado en la imagen 2 por un círculo rojo) y pro cedemos a configurar en la etiqueta general la opción: <span style="color: rgb(0, 0, 153);">Additional Include Directories </span>agregando<br /><br /><div style="background-color: rgb(185, 238, 238);"><br /><span style="color: rgb(153, 0, 0); font-weight: bold;">$(OGRE_HOME)\include</span><br /><span style="color: rgb(153, 0, 0); font-weight: bold;">$(OGRE_HOME)\samples\include</span><br /><br /></div><br />Ahora con la parte de encadenamiento mal llamada linkeo que en español no existe. Me refiero a la sección del Linker( círculo rojo en la imagen 3).<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZjwWLZnjP2lms0HtwBlMTiVg0h0HUs9IaaACqkr1AT9_0LNbTFATKdSfuoUt6n8If_9y9ge3c9UW6grHKxMZ4NFdlw3PzvDk5kacoKCxIUpPa62tCWSLn2pTZk0zHwufybCHvx9Ep56dz/s1600-h/propiedades+2.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 349px; height: 206px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZjwWLZnjP2lms0HtwBlMTiVg0h0HUs9IaaACqkr1AT9_0LNbTFATKdSfuoUt6n8If_9y9ge3c9UW6grHKxMZ4NFdlw3PzvDk5kacoKCxIUpPa62tCWSLn2pTZk0zHwufybCHvx9Ep56dz/s320/propiedades+2.jpg" alt="" id="BLOGGER_PHOTO_ID_5217834773051917426" border="0" /></a> <span style="font-weight: bold;"> imagen 3</span>.<span style="font-weight: bold;"> Linker</span><br /><br /><br />colocamos en la etiqueta general la opción <span style="color: rgb(0, 0, 153);">Additional Include Directories</span><br /><br /><div style="background-color: rgb(185, 238, 238);"><br /><span style="color: rgb(153, 51, 0); font-weight: bold;">$(OGRE_HOME)\lib</span><br /><br /></div><br />y en la etiqueta Input en la opción Additional Dependencies las librerías que se van a encadenar.<br /><br /><div style="background-color: rgb(185, 238, 238);"><br /><span style="color: rgb(153, 0, 0); font-weight: bold;">OgreMain_d.lib</span><br /><span style="color: rgb(153, 0, 0); font-weight: bold;">OIS_d.lib</span><br /><br /></div><br /><code><br /></code><div style="background-color: rgb(255, 255, 191);"><br /><span style="color: rgb(255, 102, 102); font-weight: bold;">NOTA:</span><br /><span style="color: rgb(51, 102, 255); font-style: italic;">los errores al compilar el programa que se producen cuando se ve de este estilo " error LNK2019: unresolved external symbol ", es porque faltan algunos de los .lib's o un archivo fuente .cpp( .c en el caso de C puro).</span><br /><br /><span style="color: rgb(51, 102, 255); font-style: italic;">notese que las librerias son llevan un _d acompañando el nombre, esto está indicando que solo son para compilar en modo depuración(debug). Para release las librerías no incluyen esa parte</span>.<br /><br /></div><br />Bueno, ya estamos listos para empezar a escribir code.<br /><br />Usaremos lo que trae Ogre cómo predeterminado para hacer la aplicación. Me refiero a "ExampleApplication.h" y "ExampleFrameListener.h". es suficiente incluir "ExampleApplication.h" ya que este contiene el otro.<br /><br /><div style="border: 1px groove rgb(91, 0, 183); background-color: rgb(221, 249, 255);"><br /><span style="color: rgb(0, 0, 153);">#include "ExampleApplication.h"</span><br /><br /></div>Hacemos la clase heredada de FrameListener<br /><br /><div style="border: 1px groove rgb(91, 0, 183); background-color: rgb(221, 249, 255);"><br /><span style="color: rgb(0, 0, 153);">class testingFrameListener : public ExampleFrameListener</span><br /><span style="color: rgb(0, 0, 153);">{</span><br /><span style="color: rgb(0, 0, 153);">private:</span><br /><span style="color: rgb(0, 0, 153);"> SceneManager* mSceneMgr;</span><br /><span style="color: rgb(0, 0, 153);">public:</span><br /><span style="color: rgb(0, 0, 153);"> testingFrameListener(SceneManager *sceneMgr, RenderWindow* win, Camera* cam)</span><br /><span style="color: rgb(0, 0, 153);"> : ExampleFrameListener(win, cam,false,false),</span><br /><span style="color: rgb(0, 0, 153);"> mSceneMgr(sceneMgr)</span><br /><span style="color: rgb(0, 0, 153);"> {</span><br /><span style="color: rgb(0, 0, 153);"> }</span><br /><br /><span style="color: rgb(0, 0, 153);"> bool frameStarted(const FrameEvent& evt)</span><br /><span style="color: rgb(0, 0, 153);"> {</span><br /><span style="color: rgb(0, 0, 153);"> bool ret = ExampleFrameListener::frameStarted(evt);</span><br /><br /><br /><span style="color: rgb(0, 0, 153);"> return ret;</span><br /><br /><span style="color: rgb(0, 0, 153);"> }</span><br /><br /><span style="color: rgb(0, 0, 153);">};</span><br /><br /><br /></div><br /><br /><br /><div style="border: 1px groove rgb(91, 0, 183); background-color: rgb(221, 249, 255);"><br /><span style="color: rgb(0, 0, 153);">class testingApp : public ExampleApplication</span><br /><span style="color: rgb(0, 0, 153);">{</span><br /><span style="color: rgb(0, 0, 153);"> public:</span><br /><span style="color: rgb(0, 0, 153);"> testingApp()</span><br /><span style="color: rgb(0, 0, 153);"> {}</span><br /><br /><span style="color: rgb(0, 0, 153);"> ~testingApp()</span><br /><span style="color: rgb(0, 0, 153);"> {</span><br /><span style="color: rgb(0, 0, 153);"> }</span><br /><br /><span style="color: rgb(0, 0, 153);">protected:</span><br /><br /><span style="color: rgb(0, 0, 153);"> virtual void createCamera(void)</span><br /><span style="color: rgb(0, 0, 153);"> {</span><br /><span style="color: rgb(0, 0, 153);"> // Creando La camara</span><br /><span style="color: rgb(0, 0, 153);"> mCamera = mSceneMgr->createCamera("PlayerCam");</span><br /><br /><span style="color: rgb(0, 0, 153);"> // Posición a 500 en la dirección Z </span><br /><span style="color: rgb(0, 0, 153);"> mCamera->setPosition(Vector3(0,15,50));</span><br /><span style="color: rgb(0, 0, 153);"> // mirar a lo largo de -Z</span><br /><span style="color: rgb(0, 0, 153);"> mCamera->lookAt(Vector3(0,0,30));</span><br /><span style="color: rgb(0, 0, 153);"> mCamera->setNearClipDistance(5);</span><br /><br /><span style="color: rgb(0, 0, 153);"> }</span><br /><br /><span style="color: rgb(0, 0, 153);"> virtual void createViewports(void)</span><br /><span style="color: rgb(0, 0, 153);"> {</span><br /><span style="color: rgb(0, 0, 153);"> // Crear un viewport</span><br /><span style="color: rgb(0, 0, 153);"> Viewport* vp = mWindow->addViewport(mCamera);</span><br /><span style="color: rgb(0, 0, 153);"> vp->setBackgroundColour(ColourValue(0.1,0.1,0.1));</span><br /><br /><span style="color: rgb(0, 0, 153);"> // Alterar the camera para que concuerde con el wl Viewport</span><br /><span style="color: rgb(0, 0, 153);"> mCamera->setAspectRatio(</span><br /><span style="color: rgb(0, 0, 153);"> Real(vp->getActualWidth()) / Real(vp->getActualHeight()));</span><br /><span style="color: rgb(0, 0, 153);"> }</span><br /><br /><br /><br /><br /><span style="color: rgb(0, 0, 153);"> // Sobrecargar el método createScene es obligatorio</span><br /><span style="color: rgb(0, 0, 153);"> virtual void createScene(void)</span><br /><span style="color: rgb(0, 0, 153);"> {</span><br /><br /><span style="color: rgb(0, 0, 153);"> mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5,0.5));</span><br /><span style="color: rgb(0, 0, 153);"> mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);</span><br /> <br /><span style="color: rgb(0, 0, 153);"> //agregando un plano</span><br /><span style="color: rgb(0, 0, 153);"> Plane plane( Vector3::UNIT_Y, 0 );</span><br /><span style="color: rgb(0, 0, 153);"> MeshManager::getSingleton().createPlane("ground",</span><br /><span style="color: rgb(0, 0, 153);"> ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,</span><br /><span style="color: rgb(0, 0, 153);"> 1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);</span><br /><span style="color: rgb(0, 0, 153);"> Entity* planeN = mSceneMgr->createEntity( "GroundEntity", "ground" ); </span><br /><br /><span style="color: rgb(0, 0, 153);"> mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(planeN);</span><br /><span style="color: rgb(0, 0, 153);"> planeN->setMaterialName("Examples/Rockwall");</span><br /><span style="color: rgb(0, 0, 153);"> planeN->setCastShadows(false);</span><br /><br /><br /><span style="color: rgb(0, 0, 153);"> // Crear una luz</span><br /><span style="color: rgb(0, 0, 153);"> Light* l = mSceneMgr->createLight("MainLight");</span><br /><span style="color: rgb(0, 0, 153);"> l->setType( Light::LT_POINT );</span><br /><span style="color: rgb(0, 0, 153);"> l->setPosition(-5,100,100);</span><br /><br /><br /><br /><span style="color: rgb(0, 0, 153);"> }</span><br /><br /><span style="color: rgb(0, 0, 153);"> // Create new frame listener</span><br /><span style="color: rgb(0, 0, 153);"> void createFrameListener(void)</span><br /><span style="color: rgb(0, 0, 153);"> {</span><br /><span style="color: rgb(0, 0, 153);"> mFrameListener= new testingFrameListener(mSceneMgr, mWindow, mCamera);</span><br /><span style="color: rgb(0, 0, 153);"> mRoot->addFrameListener(mFrameListener);</span><br /><span style="color: rgb(0, 0, 153);"> }</span><br /><span style="color: rgb(0, 0, 153);">};</span><br /><br /><br /><br /></div><br /><br />y para poder ejecutarlo se necesita el punto de entrada<br /><br /><div style="border: 1px groove rgb(91, 0, 183); background-color: rgb(221, 249, 255);"><br /><span style="color: rgb(0, 0, 153);">#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32</span><br /><span style="color: rgb(0, 0, 153);">#define WIN32_LEAN_AND_MEAN</span><br /><span style="color: rgb(0, 0, 153);">#include "windows.h"</span><br /><span style="color: rgb(0, 0, 153);">#endif</span><br /><br /><span style="color: rgb(0, 0, 153);">#ifdef __cplusplus</span><br /><span style="color: rgb(0, 0, 153);"> extern "C" {</span><br /><span style="color: rgb(0, 0, 153);">#endif</span><br /><br /><span style="color: rgb(0, 0, 153);">#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32</span><br /><span style="color: rgb(0, 0, 153);"> INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )</span><br /><span style="color: rgb(0, 0, 153);">#else</span><br /><span style="color: rgb(0, 0, 153);"> int main(int argc, char *argv[])</span><br /><span style="color: rgb(0, 0, 153);">#endif</span><br /><span style="color: rgb(0, 0, 153);"> {</span><br /><span style="color: rgb(0, 0, 153);"> // Create application object</span><br /><span style="color: rgb(0, 0, 153);"> testingApp app;</span><br /><br /><br /><br /><span style="color: rgb(0, 0, 153);"> try {</span><br /><span style="color: rgb(0, 0, 153);"> app.go();</span><br /><span style="color: rgb(0, 0, 153);"> } catch( Ogre::Exception& e ) {</span><br /><span style="color: rgb(0, 0, 153);">#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32</span><br /><span style="color: rgb(0, 0, 153);"> MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);</span><br /><span style="color: rgb(0, 0, 153);">#else</span><br /><span style="color: rgb(0, 0, 153);"> std::cerr << "Una excepción ha ocurrido: " <<></span></div><br /><br />Y a compilar, buena suerte en con Ogre, se necesita saber C++ en un grado medio y mucha paciencia.Juan Carlos Oterohttp://www.blogger.com/profile/15801016748101762493noreply@blogger.com2tag:blogger.com,1999:blog-206089777995151027.post-90125413408717248782008-03-24T11:59:00.004-05:002008-03-24T12:06:11.697-05:00WiiMote todo el poder del control del Wii para OgreSi, la versión nueva de Ogre, que actualmente está en desarrollo, incluye soporte para usar el control de Wii.<br /><br /><object height="355" width="425"><param name="movie" value="http://www.youtube.com/v/KsNqz68I5wk&hl=en"><param name="wmode" value="transparent"><embed src="http://www.youtube.com/v/KsNqz68I5wk&hl=en" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"></embed></object>Juan Carlos Oterohttp://www.blogger.com/profile/15801016748101762493noreply@blogger.com0tag:blogger.com,1999:blog-206089777995151027.post-6802584887324297572008-03-23T18:56:00.003-05:002008-03-23T19:12:25.897-05:00FísicasLas físicas son parte fundamental de la programación de vídeo juegos hoy en día. Ogre3d tiene detección de colisiones realizada con rayQueries. Pero afortunadamente existen librerías especializadas en Tratar las físicas que actualmente se le conocen cómo motores físicos ( physics engines) , para Ogre practicamente son adaptables todas las existentes.<br /><br />Existen diferentes motores y tipos de físicas, de cuerpos rigidos, de colisiones, ragdolls, fluidos, físicas suaves, de ropa y muchas más.<br /><br />Ogre tiene algunos wrappers que ayudan a integrar 4 motores conocidos:<br /><br />- Physx de Ageia, antes era novodex pero fue absorbido por ageia se integra con Ogre a través de NxOgre.<br /><br />- Newton, es una librería solida que tiene gran potencial, su uso es gratis para juegos no comerciales, y su wrapper se llama OgreNewt.<br /><br />- Ode, es una librería Opensource de gran uso, no solo dentro de Ogre sino otros motores la vienen implementando, su wrapper es OgreOde, actualmente tiene muy buenos ejemplos y el soporte lo proporcionan en el foro de Ogre.<br /><br />-Bullet es opensource y blender usa está librería para sus físicas rigidas. el wrapper para ogre Se llama OgreBullet.<br /><br />También existen para soft bodies, pero nos enfocaremos más en rigid bodies.<br /><a href="javascript:void(0)" tabindex="10" onclick="return false;"><span></span></a>Juan Carlos Oterohttp://www.blogger.com/profile/15801016748101762493noreply@blogger.com0tag:blogger.com,1999:blog-206089777995151027.post-70050428508594898112008-03-11T20:57:00.000-05:002008-03-23T18:33:16.343-05:00Level Editors para ogreOgre es muy poderoso, pero solo es un framework, así que se usa para construir aplicaciones, por suerte puede ser incluido en GUIs y APIs de desarrollo gráfico cómo WxWidgets, QT, MFC, winforms y el API de Windows. Efectivamente se han ido desarrollado tools que le facilitan la vida a los programadores y esto tiene cómo consecuencia la disminución en el tiempo de desarrollo, además de resultados no tan sometido a prueba y error.<br /><br />Entre estas tools, están los famosos editores de niveles, que sencillamente son WYSIWYG que permiten ubicar los Modelos y diferentes "cosas" tales cómo partículas y materiales. los contribuidores y seguidores de Ogre han desarrollado tanto OpenSource así cómo comerciales.<br /><br /><br />Proton Scene editor<br /><br />Desarrollado con MFC, aun está por definirse la licencia, pero según su autor podría ser GPL<br /><br />http://www.fun-byte.com/LevelEditor.swf<br /><br />WEditor, no he visto el video , pero tiene muy buenos comentarios<br /><br />https://sourceforge.net/project/showfiles.php?group_id=219451&package_id=264820&release_id=582431Juan Carlos Oterohttp://www.blogger.com/profile/15801016748101762493noreply@blogger.com0tag:blogger.com,1999:blog-206089777995151027.post-9412145189760881512008-03-01T16:11:00.000-05:002008-03-23T18:33:16.344-05:00Experiencias con Engines 3dHasta ahora solo llevo un año y medio teniendo experiencia con engines 3d, no he tratado con ninguno 2d, que creo para mi concepto es una etapa que se debe quemar.<br /><br />Opensource<br />Ogre3d es el opensource que más me ha llamado la atención, su arquitectura plugable es una verdadera ventaja, pero se debe saber algo más que c++ básico. Pero cómo es el engine gráfico que más me gusta trataré de dar mucha información sobre el, y publicar algunos snippets<br /><br />Irrlicht es Otro engine gráfico, es potente pero aun le falta, para empezar es bueno.<br /><br />Cristalspace3d , posee mucho soporte, no he de opinar mucho sobre este engine porque no lo he probado a plenitud.<br /><br />comerciales<br /><br />Torque, excelente para hacer juegos, tiene bastante soporte por un comodo precio, se necesita bastante c++ para lidiar con el SDK de este game engine.<br /><br />Shiva3d, gran engine, su principal desventaja es la documentación, pero ya están avanzando en ese aspecto.<br /><br /><br />3imapct, en realidad es una libreria especializada en vehiculos, fácil de usar, pero aveces desespera la forma de programar debido a estar vinculada a una dll.Juan Carlos Oterohttp://www.blogger.com/profile/15801016748101762493noreply@blogger.com2