Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





tilemap isometrico: Picking

Iniciado por Manu343726, 15 de Febrero de 2013, 09:09:46 PM

« anterior - próximo »

Manu343726

Buenas

Estoy implementando tilemaps isometricos del estilo de sim city 3000. Ahora estoy empezando con el tema de picking. El mayor problema es que el tilemap no tiene por que ser plano, de manera que no puedo aplicar cosas como las de éste estilo: http://www.cocos2d-iphone.org/forum/topic/21591.

Lo mas decente que se me ha ocurrido es calcular las coordenandas baricentricas del ratón en todos los tiles que pasan el test de culling.
Que os parece?

Manu343726

Acabo de terminar de implementarlo, y parece que funciona bastante bien. Sigue sin bajar de los 110-120FPS.



Pero aún así, si tenéis alguna sugerencia, optimización, etc; por favor no os cortéis.

adrigm

http://razonartificial.com/ - Blog personal sobre desarrollo de videojuegos

Manu343726

Gracias, ya conocía el segundo tutorial :).

El problema como te digo, es que no puedo seguir esa aproximación, ya que el tilemap no tiene por que ser plano (Como en la foto de antes, por ejemplo). De manera que no hay una correspondencia directa con la rejilla rectangular. Es mas, aunque la hubiera, puede ser que varios tiles se superpongan, porque hay una colina por ejemplo.

blau

Podrias generar un bitmap cuyos pixels contengan el identificador del tile... y hasta ahí puedo leer...  :D

Manu343726

Eso tambien lo había pensado, en plan picking 3D de OpenGL de toda la vida. El problema es que hay que dibujar dos veces... Además tendría que cambiar el render entero...

A la larga me planteo implementarlo, para que dx_lib32 tenga soporte de picking de todas las primitivas que hayas dibujado.

Pero por ahora, para este caso concreto, las coordenadas abrí céntricas van bastante rápido. De hecho, en el ejemplo de picking del sdk de directx lo hace con baricentricas, recorriendo todo el mesh que esta usando.

Manu343726

Ahora que lo mencionas, sabéis de algún ejemplo de esa técnica usando direct3d9? No hago más que buscar y no veo nada...

blau

Puedes pintarlo una sóla vez..

1) a los vertices les añades un campo identificador, total una vez que esten en el vertexbuffer no va a cambiar... por gastar un poco de espacio extra no pasa nada
2) o si usas  instancing, la informacion para las intancias ademas de la posicion contenga el identificador.


Y luego en el pixel shader puedes sacar informacion para dos rendertargets distintos en uno la informacion visual, y en el otro la lógica (altura logica, identificador del tile)

Manu343726

Mmmm vale, que a cada verted le meto un campo más que sea el identificador del objeto. Y eso encaja bien con la fixed pipeline? Es decir, sin usar shaders ni nada, hay alguna manera de hacerlo? Y en caso de que si, que FVF le específico? Ahora estoy usando xyz | diffuse | specular.


blau

Fixed pipeline? pues ni idea... pero estoy viendo que te las vas a tener que implementar en cpu...

1) simulando los volumenes y trazando un rayo desde el raton a las escena y buscando la interseccion de este con ellos...
2) haciendo lo que te proponia de hacer con un shader en memoria ram.. total solo lo vas calcular una vez si el suelo es estático...

Yo estoy con un juego en isométrico, pero lo tengo todo en 3D puro, y hacer el picking es bastante inmediato...






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.