Tutorial Ogre3D: Creación de un proyecto paso por paso (y IV)

Escrito por aserrano. Posteado en C++, Desarrollo, Juegos, Motores 3D, Ogre

Recientemente google ha baneado mi página, me han bajado el PageRank de 2 a 0 y paulatinamente están bajando mis páginas indexadas.

Lo mejor o peor de la situación es que yo no he hecho nada, así que he decidido que no tengo ganas de seguir peleando ni escribiendo, ¿para qué? nadie lo iba a poder leer de todas formas:

Adjunto el listado del mini frame listener para terminar los artículos, si es que hay alguien que me sigue:

class MyFrameListener: public FrameListener {
 
public:
 
	// ctor/dtor
	MyFrameListener(RenderWindow* win) : mWindow(win){
		OIS::ParamList pl;
		size_t windowHnd = 0;
		std::ostringstream windowHndStr;
 
		m_timeElapsed = 0.0f;
 
		win->getCustomAttribute("WINDOW", &windowHnd);
		windowHndStr << windowHnd;
		pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
 
		mInputManager = OIS::InputManager::createInputSystem(pl);
		mKeyboard
				= static_cast<OIS::Keyboard*> (mInputManager->createInputObject(
						OIS::OISKeyboard, false));
	}
	virtual ~MyFrameListener() {
	}
 
	// We will provide some meat to this method override
	virtual bool frameStarted(const FrameEvent &evt);
 
	// We do not need to provide a body for either of these methods, since
	// Ogre provides a default implementation that does just this. However, for
	// the sake of illustration, we'll provide one here.
	virtual bool frameEnded(const FrameEvent &evt) {
		return true;
	}
	virtual bool processUnbufferedKeyInput(const FrameEvent& evt) {
 
		if(mWindow->isClosed()) return false;
		if (mKeyboard->isKeyDown(OIS::KC_ESCAPE)) //si pulsamos escape salimos de la aplicacion
			return false;
 
		return true;
	}
 
	// Override frameRenderingQueued event to process that (don't care about frameEnded)
	bool frameRenderingQueued(const FrameEvent& evt) {
		mKeyboard->capture();
 
		if( !mKeyboard->buffered() )
			if( processUnbufferedKeyInput(evt) == false )
				return false;
 
		return true;
	}
protected:
	OIS::InputManager* mInputManager;
	OIS::Keyboard* mKeyboard;
	RenderWindow* mWindow;
 
private:
	float m_timeElapsed;
};
 
bool MyFrameListener::frameStarted(const FrameEvent &evt) {
 
	m_timeElapsed += evt.timeSinceLastFrame;
 
}


Ogre3D: Paso a paso III

Tutorial Ogre3D: Creación de un proyecto paso por paso (III)

Escrito por aserrano. Posteado en C++, Juegos, Linux, Motores 3D, Ogre

Una vez inicializado Ogre Procederemos a la creación de la ventana y del SceneManager.

Recordemos que el gestor del escenario es un plugin especializado según el tipo de escenario y pueden ser de los siguientes tipos:

  • ST_GENERIC: Escenarios de propósito general
  • ST_EXTERIOR_CLOSE: Escenarios de exteriores de visibilidad media
  • ST_EXTERIOR_FAR: Practicamente no usado
  • ST_EXTERIOR_REAL_FAR: Escenarios de paisajes con grandes terrenos
  • ST_INTERIOR: Escenarios de interior, por ejemplo, edificios.

Veamos ya como crearlo:

mRoot->initialise(true, "Mi Ventana");	
 
RenderWindow* window = mRoot->getAutoCreatedWindow();
SceneManager *sceneMgr = mRoot->createSceneManager(ST_GENERIC);

A continuación crearemos la cámara que nos permitirá ver el escenario desde el ángulo y con la profundidad y distancia que queramos:

Camera* cam = sceneMgr->createCamera("Camara");
cam->setNearClipDistance(5);
cam->setFarClipDistance(1000);
cam->setAspectRatio(Real(1.333333));
 
Viewport* vp = window->addViewport(cam,0);
vp->setBackgroundColour(ColourValue(1, 0, 0));

Hemos definido para la cámara los valores de distincia mínima y máxima y su relación entre el tamaño x e y de la ventana que hemos creado, 800/600.

Además hemos añadido un viewport a la cámara con fondo de color rojo. Podremos tener tantos como queramos pero recuerda que se ordenan mediante el parámetro z-order y sólo puede existir uno por cada valor de z-order. Los viewport definen los rectángulos donde se visualizarán el rendererizado de la cámara.

Crearíamos ahora el listener que se encargará del renderizado de los frames:

MyFrameListener listener(window);
mRoot->addFrameListener(&listener);
mRoot->startRendering();

Es importante crear el listener antes de comenzar el renderizado de la aplicación o se nos colgará.

Ogre3D Paso a paso II
Ogre3D Paso a paso (y IV)

Lua: breve tutorial de integración con C++

Escrito por aserrano. Posteado en C++, Desarrollo, Juegos, Linux, Lua

Para poder acelerar y mejorar los tiempos de desarrollo de tu aplicación C++ tienes la posibilidad de integrar algún lenguaje de script en la misma.

Vamos por tanto a ver un breve tutorial de integración Lua, un lenguaje de script con una sintáxis bastante similar a C, y C++.

El método más directo es usar luabind, una librería que nos va a permitir dicha integración de una manera rápida y sin grandes dolores de cabeza.

Comentar que el tutorial ha sido desarrollado en Ubuntu 9.04. Ubuntu 9.04 viene con el paquete luabind versión 0.7 que es incompatible con lua 5.1, por tanto, deberemos descargar la última versión que a día de hoy es la 0.8.1 y compilarla.

Bajamos la última versión de luabind de aquí.

Luabind necesita de las librerías boost. Procedemos a instalarla:

sudo apt-get install libboost1.35-dev
 
sudo apt-get install boost-build

Si no estuviera instalada la herramienta de compilación bjam:

sudo apt-get install bjam

Descomprimimos el paquete de luabind y lo compilamos:

cd luabind-0.8.1
 
bjam
 
sudo bjam install

Luabind nos permite integrar en lua, casi de de forma integra cualquier elemento del lenguaje C++: clases, funciones, operadores, variables, etc.

Veamos como llamar una función desde un script LUA.

Incluimos las cabeceras de lua de la siguiente forma y definimos la función que formará parte de la librería:

extern "C" {
 
#include <lua5.1/lua.h>
 
}
 
#include <stdio.h>
 
#include <luabind/luabind.hpp>
 
void sayHelloWorld()
 
{
 
printf("Hello Worldn");
}

Añadimos también la función de inicialización de la librería:

extern "C" int init(lua_State* L)
{
using namespace luabind;
 
open(L);
 
module(L)
[
def("sayHelloWorld", &amp;amp;amp;amp;amp;amp;sayHelloWorld)
];
 
return 0;
}

Compilamos la librería:

gcc -I/usr/local/include -I/usr/include/lua5.1 -shared -fPIC -o sayhello.so sayhello.cpp -lluabindd -llua5.1

Ya sólo nos quedaría crear un programa en lua para usarlo. Mediante la función “loadlib” cargamos la librería y la inicializamos con la función C que hemos creado “init”:

package.loadlib('./sayhello.so','init')
 
sayHelloWorld()

De forma análoga podríamos definir clases, estructuras, funciones, operadores sobrecargados, etc.

Veamos un ejemplo más complejo que refleja una clase, un operador de suma y una función para obtener el total:

#include <luabind/luabind.hpp>
#include <luabind/operator.hpp>
 
class Prueba
{
int totalPrice;
public:
 
Prueba() {}
Prueba(int nume)
{
totalPrice=nume;
}
Prueba operator+(Prueba op2);
 
int getTotal() { return totalPrice; }
};
 
Prueba Prueba::operator+(Prueba op2)
{
Prueba temp;
 
temp.totalPrice=totalPrice+op2.totalPrice;
 
return temp;
}
 
extern "C" int init(lua_State* L)
{
 
using namespace luabind;
 
open(L);
module(L)
[
class_<Prueba>("Prueba")
.def(constructor<const int>())
.def("getTotal",&amp;amp;amp;amp;amp;Prueba::getTotal)
.def(self + other<Prueba>())
];
return 0;
}

Ya sólo nos queda ejecutarlo con Lua:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
package.loadlib("./prueba.so","init")()
 
a=Prueba(12)
b=Prueba(23)
c=a+b
print(c:getTotal())
35

Usando .net en Torque: ejemplo práctico (conexión a postgresql)

Escrito por aserrano. Posteado en C++, Desarrollo, Juegos, Motores 3D, Torque

Si te gusta usar .net, puedes hacer que haga algunas tareas en Torque.

Esto es sólo un ejemplo de como usar .net en Torque.

Todo el código fuente es gratis y lo puedes usar bajo tu responsabilidad.

Si necesitas más referencias ve a la página web de MSDN o GarageGames. Alguna información ha sido extraída de esas páginas.

Para este ejemplo se ha usado Visual C# 2005, Visual C++ 2008 y las librerías de Mono (ms 2.0) para la  conexión a PostgreSQL

Vamos a obtener la versión  de la base de datos  que es muy similar a hacer un “select” o un “insert”.

Como primer paso creamos una DLL (ClassLibrary) en C#.

Editamos el código fuente, añadimos el interface público y cambiamos su nombre. Este interface lo usaremos para exponer su métodos a través de COM.

Añadimos también la funcionalidad Postgres, en este caso, sólo un “select version()”.

[sourcecode lang=”cpp”]

using Npgsql;

namespace Database
{
public interface IPGDatabase
{
String pgVersion();
}

public class PGDatabase : IPGDatabase
{

conn = new NpgsqlConnection(“Server=192.168.11.150;Port=5432;User Id=user;Password=secret;Database=DBl;”);
conn.Open();

NpgsqlCommand command = new NpgsqlCommand(“select version()”, conn);
String serverversion;

[/sourcecode]

Para exponer el interface com debemos editar el fichero AssemblyInfo.cs y cambiar la línea”[assembly: ComVisible(false)]” por “[assembly: ComVisible(true)]”.

Creamos ahora un nombre fuerte a nuestra DLL. Desde el prompt de Visual Studio teclea “snk.exe -k database.snk”. Copia este fichero al proyecto, edita las propiedades del proyecto y ve a la pestaña de firmar. Pincha sobre “Firmar el ensamblado” y elige el fichero recien creado.

Compila el proyecto para crear la DLL Managed

Vamos a registrar la información de ensamblado de la DLL.

Desde un prompt de Visual Studio, ve al directorio donde esté la DLL y teclea

regasm database.dll /tlb:database.tlb /codebase


Copia este fichero al proyecto Torque

Crea una clase en Torque y prepárala para usarla en la consola como el ejemplo de abajo (si tienes dudas ve a la página web de GarageGames)

[sourcecode lang=”cpp”]

class DBVersion: public SimObject
{

public:

DECLARE_CONOBJECT( DBVersion );

IMPLEMENT_CONOBJECT( DBVersion );

ConsoleMethod(DBVersion,getVersion, const char*, 2, 2,”()Returns the postgresql.”)

[/sourcecode]
Importa el fichero .tlb añadiendo la línea “#import “..gamedatabase.tlb” raw_interfaces_only”, y usa el nuevo espacio de nombres recien creado “using namespace database

Si todo ha ido bien, tendremos acceso a nuestra dll managed

Creamos el puntero al interface y llamamos a nuestra función

[sourcecode lang=”cpp”]

HRESULT hr=CoInitialize(NULL);

IPGDatabasePtr pIDatabase(__uuidof(PGDatabase));

long lResult=0;

pIDatabase->pgVersion(&amp;bstrstring);

CoUninitialize();

[/sourcecode]

Como la DLL está devolviendo una cadena BSTR, necesitaremos hacer una pequeña conversion:

[sourcecode lang=”cpp”]

_bstr_t _bstrstring(bstrstring);
strcpy_s(version, (char *)_bstrstring);
return (StringTableEntry) &amp;version[0];
[/sourcecode]

Tiempo de probarlo. Compila el proyecto, ejecuta el motor de juegos torque, abre la consola y teclea:

$a=new DBVersion();
echo($a.getVersion());

Código fuente

¡Disfrútalo!

Notar que esto es sólo un ejemplo. No hay control de errores, el código se puede mejorar,…

Terrenos en Torque usando L3DT

Escrito por aserrano. Posteado en Blender, C++, Juegos, Linux, Motores 3D, Torque

Vamos a hablar de como generar rapidamente terrenos para Torque en Torque Game Engine Advanced 1.7.0.

TGEA 1.7.0 incluye ahora un nuevo sistema de megaterrenos llamado MegaTerrain. Megaterrain nos permite incluir varios terrenos individuales dentro de las misiones de Torque.

Pero nosotros vamos a ver como exportar un terreno para al anterior sistema Atlas 2 usando la herramienta Large 3D Terrain de bundysoft. Decir que la herramienta tiene dos versiones y la que se compra en GarageGames cuesta unos 35$ y lleva el plugin de exportación para Atlas.

Esta herramienta provee un tutorial muy interesante que nos hará un terreno en pocos minutos. Seguidlo y generar un terreno de 1024×1024 pixeles, como se ve en las imágenes.

Una vez finalizado el tutorial grabar el proyecto y usar la opción de exportación File–>Export–>To torque Atlas(garagegames plugin). Este plugin tiene todavia algunos bugs con terrenos grandes.

Con el terreno generado es hora de ponerlo en Torque en nuestro fichero de misión con el siguiente código:

new AtlasInstance(NewTerrain) {
canSaveDynamicFields = “1”;
Enabled = “1”;
position = “0 0 0”;
rotation = “1 0 0 0”;
scale = “1 1 1”;
atlasFile = “scriptsAndAssets/data/export/miterreno.atlas”;
lightmapDimension = “256”;
};

Truco: si no veis el terreno, seleccionadlo con “World Editor inspector” y haceis un drop selection.


Made in Cádiz

Escrito por aserrano. Posteado en Juegos

Por salirme un poco del tema central de mi blog, hablaré hoy brevemente de un pequeño grupo de desarrollo de Cádiz, CaninoStudios, que se dedica a la elaboración de videojuegos.

Decir que en este país no se potencia la industria del videojuego es quedarse corto y lograr sobrevivir en este mundo a títulos como crysis o WOW ya me parece un lujo, por eso me impresiona ver que hay gente que con esfuerzo y tesón, y supongo, que mas de una noche sin dormir, intenta hacerse un hueco en esta dura industria.

No voy a hablar sobre acabados del producto ni nada de eso, eso que cada cual se lo baje y juzgue por si mismo, simplemente quería dedicar esta líneas a dichos trabajos. Actualmente cuentan con dos juegos libres Supertirititran y Nimuh.

Desde aquí desearles suerte y a ver cuando nos deleitan con un nuevo juego. ¡Ánimo!

Aprendiendo de juegos comerciales

Escrito por aserrano. Posteado en C++, Desarrollo, Juegos, Linux, Motores 3D

Dicen que la experiencia es la madre de todas las ciencias.

Hoy voy a hablar sobre desarrollos comerciales cuyos códigos fuentes han sido liberados a toda la comunidad para su aprendizaje.

El primero de ellos es el simcity (micropolis).

En este blog tenéis toda la información y el código fuente disponible.

Además vamos a hablar de otro de los clásicos por excelencia: Quake III…ni horas que he pasado yo jugando al Quake III… El código fuente está disponible en la página oficial de ID Software en la siguiente URL

Parte de esta información ha sido extraída de una página web que os recomiendo a todos pues habla de Inteligencia Artifical aplicada al desarrollo de juegos.

¡Que lo disfrutéis!

Desarrollo de juegos: un poco de bibliografía

Escrito por aserrano. Posteado en C++, Desarrollo, Juegos, Motores 3D, Ogre, Torque

Debemos tener presente que el desarrollo de juegos, dentro de lo que a programación se refiere, es de los desarrollos software más exigentes.

Si encima hablamos de desarrollo de juegos 3D entonces nos vamos a unos perfiles muy altos en los que el desarrollador debe tener conocimientos muy fuertes de matemáticas 3D y posiblemente un alto nivel de C++ y algún que otro perfil que ahora veremos.

Voy a exponer los libros que me he leído o estoy leyendo, todos ellos en un perfecto inglés, lo que hace que sea otro requisito añadido a nuestro desarrollo.

Existir, existen muchos más, y desde luego cuantos más entendamos pues mejor…

Matemáticas:3D Math Primer for Graphics and Game Development (Fletcher Dunn and Ian Parberry)

Este libro de matemáticas puras orientado a la programación 3D y con algoritmos en C++ es un must-have en vuestra biblioteca. Yo no lo he leído completo, si lo hubiese hecho estaría en la Nasa o algo así… :)… pero desde luego lo tengo siempre encima de la mesa como referencia.

Bromas aparte este libro es simple de leer, me refiero al inglés, y si no sabéis lo que es un vector, una matriz o un quaternion, vais a tener complicado en lograr algo de éxito en vuestro proyecto, por lo que insisto, es un buen libro para tener en casa.

Inteligencia artificial: Programming AI Game by Example (Matt Buckland)

El título lo dice todo, después de un breve capítulo introductorio de matemáticas aborda temas como el ataque de un bot, algoritmos de trayectos, es decir, como un bot encuentra el camino para darte dos sopapos, o incluso temas de scripting en LUA.

Otro libro a tener en casa.

Ogre: Pro Ogre 3D Programming (Gregory Junker)

Un libro dedicado a la versión Eihort de Ogre que cubre todos los aspectos más destacados de este motor de renderizado 3D.

Este libro no es desarrollo de juegos en sí, sólo habla de todas las capacidades de Ogre y de como exprimirlas.

Como bien sabéis además Ogre se programa en C++ por lo que si sabéis C++ es lo primero que deberías aprender para poder afrontar este libro.

Desarrollo juegos: Game programming GEMS 6 (Varios autores, editado por Michael Dickheiser)

Toda la saga de estos libros, notad el 6, desarrollan en varios artículos y redactados por los mejores desarrolladores de juegos del mundo, cada uno los aspectos de un juego, matemáticas, sonido, inteligencia artificial, red, etc.

Decid que los artículos aparte de un must-have en nuestra biblioteca cubren apartados muy difíciles del desarrollo de  un juego.

Por tanto, ¿es recomendable?, sí, pero requiere un alto nivel que si no se tiene se debería alcanzar antes de meternos con él.

Torque: 3D Game Programming All in One, Second Edition (Kenneth C. Finney)

Este libro está entero dedicado a Torque y a como desarrollar un juego sólo con el scripting que lleva el motor Torque. Decir que el libro son 850 páginas y que es un buenísimo punto de partida para empezar con Torque ya que cubre absolutamente todos los aspectos del desarrollo de un juego con Torque, desde el modelado, pasando por la red, la parte cliente, etc.

Torque: The Game Programmer’s Guide to Torque: Under the Hood of the Torque Game Engine (GarageGames)

Esta es la guía oficial de GarageGames, los chicos de Torque, que hacen sobre su motor.

Decir que más que un libro de como afrontar cosas en Torque es una guía de referencia de su motor, por lo que os recomiendo que antes que comprar este libro comenceis con el anterior.

C++: Esto no es un libro, es un enlac, pero que mínimo que poneros una referencia a como podéis empezar con C++.

Deciros que todos estos libros han sido adquiridos en Amazon, aunque también se pueden adquirir en Agapea.

Sólo me queda mi recomendación de que si queréis afrontar un proyecto tan exigente como estos debéis de estudiar un montón y aquí tenéis un buen comienzo sólo para la parte de desarrollo.

El tema gráfico es otro tema con el que se deben pelear los diseñadores. 🙂

¡¡Feliz Año nuevo a todos!!

Blender: exportar modelos a Ogre

Escrito por aserrano. Posteado en Blender, Juegos, Linux, Motores 3D, Ogre

El objetivo de este artículo es aprender a exportar modelos 3D para su posterior uso con el motor de renderizado Ogre.

Blender, como bien sabéis es una herramienta de modelado 3D. Hay gente a la que le gusta mucho, y hay gente a la que no, pero hay que reconocer que una vez aprendes algunos comandos básicos, para ser una herramiente del mundo del software libre, es simplemente una pasada.

Yo como buen desarrollador, tengo la misma pericia dibujando y modelando que pueda tener un camello en mitad del desierto, pero al menos me defiendo con algunos comandos básicos.

Lo primero que debemos tener bien configurado es blender para su funcionamiento con python.

Python es un lenguaje de scripting usado en muchas aplicaciones y como base para los exportadores, importadores, modelados, etc. en blender.

A la hora de redactar este artículo el python que debemos instalar es el 2.5 y la versión 2.45 para blender. En el momento de la ejecución de blender, en la ventana de consola debe salir la siguiente frase que indica que blender ha sido capaz de reconocer la instalación de python:

” Compiled with Python version 2.5.

Checking for installed Python… got it!”

Una vez verificado que tenemos blender instalado y el lenguaje python es hora de descargar la herramienta de exportación de Ogre para blender de aquí.

El fichero que descarguemos lo descomprimimos en el directorio donde están los scripts python de blender, usualmente en: “C:Archivos de programaBlender FoundationBlender.blenderscripts”

Una vez elaboremos nuestro modelo, esta maravillosa columna con una textura de madera, para exportarla, usando el menú de blender file–>export–>ogre meshes, nos aparecerá el diálogo de exportación. Rellenamos el path donde queremos exportar el modelo, en mi caso c:temp, activamos la opción de copiar texturas, para que nos exporte también la textura y le damos a exportar.

Blender Export a ogre

Antes de que os cortéis las venas como yo casi hago, deciros que antes de exportar desde blender deberéis aplicar las transformaciones que hayáis hecho a vuestro modelo. Para ello, desde el menu objeto de blender pulsar sobre “Apply scale/rotation”, “Apply transformation”, etc. Sino hacéis esto, posiblemente se verá vuestro modelo inicial, en mi caso un cubo.

Si además hubiesemos tenido la precaución de configurar dentro de las preferencias de exportación, la herramienta que convierte el formato XML al formato mesh de Ogre, OgreXMLConverter.exe, nos hubiese exportado directamente dicho mesh. Como no es nuestro caso, nos queda un último paso que sería la exportación a mesh.

Sino tenemos instaladas las Ogre Command line tools, nos la bajamos de aquí y las instalamos.

Abrimos una línea de comandos en nuestro windows xp, y sólo tenemos que ejecutar la herramienta OgreXmlConverter.exe contra el fichero xml para que lo convierta en formato .mesh, tal y como se ve en el dibujo.

Conviertiendo el XML a mesh

Ya tenemos nuestro mesh, nuestro material y texturas preparado para su uso con Ogre.

Si tuvieramos un modelo con animaciones en blender, el proceso sería semejante, pero nos aparecerían más opciones de exportación que os dejo a todos lectores que probéis.

Nota legal

(C) Antonio Serrano 2012