Cercar en aquest blog

dijous, 11 de març del 2010

Selecció de cares (2)

Finalment el mètode que havia plantejat no ha resultat satisfactori. Segur que el problema era meu, però els resultats són els que acaben manant.

Després de remanar bastant per internet, he descobert un mètode diferent i bastant més simple que sí que he sabut aplicar.
Consisteix en, donat un triangle ABC i un punt P, per a saber si P cau dins o fora del triangle, mirar el sentit de gir en la generació dels triangles ABC, ABP, BCP i APC. Si els sentits de tots els girs són idèntics, vol dir que el punt cau dins el triangle.

Matemàticament, això es comprova mirant els productes vectorials de dos vectors de cada triangle. Aquests vectors seran normals a cada un dels triangles. Si després els normalitzem, assegurem que el mòdul de cadascun d'aquests sigui unitari. Llavors, per a saber si tots els sentits de gir són iguals, o saber que el sentit de tots els vectors és el mateix (evidentment la direcció serà igual), podem anar sumant els vectors en parelles. Si el resultat d'una suma dóna (0,0,0) voldrà dir que els vectors eren oposats i per tant la direcció dels triangles que els han generat diferents.

Llavors, el cost de comprovar si un punt pertany a un triangle vindrà donat per:

Calcular 2 vectors pels triangles ABC, ABP, BCP i APC.
Calcular la normal de cada un d'aquests triangles fent el producte creu dels dos vectors corresponents (sent coherents a l'hora de posar el primer i el segon en ordre)
Normalitzar cada una de les 4 normals.
Sumar normal(ABC)+normal(ABP) ; normal(ABC)+normal(BCP) ; normal(ABC)+normal(APC) i comprovar que cap dels resultats és (0,0,0).

dimecres, 10 de març del 2010

Selecció de cares

M'he adonat que l'algorisme que estava utilitzant per a determinar quina cara es seleccionava no era del tot correcte.
Per a trobar la cara seleccionada, per a cada cara pertanyent al cos, cal calcular el pla que aquesta formava. Llavors trobava el punt d'intersecció entre aquest pla i el raig que es genera al fer el click amb el ratolí (això ja ho explicaré en un altre punt, si cal; només ens hem d'imaginar un raig des de l'origen de l'observador fins allà on fem clic).
Un cop obtenim aquest punt, hem de determinar si forma part o no del polígon.

El que estava fent fins ara era mirar les x,y,z mínimes i màximes dels vèrtexs dels polígons, i si les coordenades del punt d'intersecció amb el pla queien dins aquest marge, considerava que el punt pertanyia al polígon.

Ara bé, això només funcionarà per a polígons quadrilàters amb forma de rectangle!
A la que treballo amb polígons triangulars i paral·lelograms no rectangulars, l'algorisme falla.

El que necessito, doncs, és un algorisme que donat un triangle i un punt, em digui si aquest punt forma part del triangle. Un cop sàpiga trobar això, serà aplicable directament pels polígons triangulars. Quan als quadrilàters, hauré de dividir-los en dos triangles per a fer aquesta comprovació en cada una de les dues meitats triangulars.

Buscant per internet, m'he trobat amb aquesta pàgina web:
http://mathforum.org/library/drmath/view/54503.html

Explica com saber si un punt forma part d'un triangle. El que passa és que ho explica amb equacions en el pla, no a l'espai.
Bé a dir que donat un triangle ABC i un punt P, per a saber si P està dins l'àrea d'ABC hem de fer les següents comprovacions:
- Donada la recta AB, l'equació d'aquesta recta pel punt C ha de donar un resultat de símbol igual que pel punt P. Altrament podem assegurar que P no forma part d'ABC, ja que voldria dir que P cau a l'altra banda de la recta AB que C.
- Fer el mateix càlcul per a les rectes AC (amb els punts B i P) i BC (amb els punts A i P).

Treballant amb 3 coordenades, he pensat que el millor serà trobar les equacions de les rectes de la forma
(x-x0) / (v_x) = (y-y0) / (v_y) = (z-z0) / (v_z)

D'aquesta manera, trobaré les 3 rectes AB, AC i BC.
Pel cas AB, haurè de comprovar que els numeradors de les 3 expressions tinguin el mateix signe pel punc C que pel punt P; així mateix faré les comprovacions per les altres dues rectes.




Bé, aquest és el problema que he estat resolent avui. Quan el tingui acabat, penjaré la nova versió del programa, que ja ha estat restructurat tal i com vaig dir que faria.

dilluns, 1 de març del 2010

Programa (01/03/2010)


Aquí deixo la versió fins a dia 1 de març.



Coses que es poden fer:

- Moure la càmera mitjançant la UI
- Col·locar la càmera de manera automàtica a una vista frontal/lateral/superior (mitjançant 3 botons)
- Moure el llum mitjançant la UI
- Generar un cub de manera automàtica
- Seleccionar un objecte entre els que s'hagi
n creat
- Seleccionar una cara de l'objecte que s'hagi seleccionat
- Seleccionar un vèrtex de l'objecte que s'hagi seleccionat
- Moure el cos/cara/vèrtex que s'hagi seleccionat (tecles 'a', 'd', 'w', 's', 'e', 'q')
- Eliminar el cos/vertex seleccionat (tecla '.')
- Crear un nou vèrtex al cos seleccionat
- Crear cares a partir de 3 vèrtexs que caldr
à seleccion
ar
- Crear cares a partir de 4 vèrtexs que caldrà seleccionar
- Guardar l'escena al disc (format .c3d)
- Carregar una escena del disc (format .c3d)


Notes:
Quan seleccionem un objecte, ens hauria d'aparèixer un conjunt d'operacions possibles per a aplicar sobre el cos seleccionat (seleccionar vèrtex, seleccionar cara, crear vèrtex...), mentre que quan no en seleccionem cap, aquest menú hauria de desaparèixer. Per a alguna raó, l'aparició i desaparició d'aquest submenú no funciona massa alhora, pel que de vegades cal insistir amb la selecció d'un objecte per a fer que el menú aparegui.

Quan esborrem un vèrtex, no es pot assgurar què passarà amb les cares que el contenien. Estic pendent de corregir això.

Els paths de guardar i carregar s'hauran de modificar des del codi font abans de compilar, ja que encara no he decidit com demanar a l'usuari que entri el paràmetre. Caldrà modificar la constant C3d_PATH_SAVE_LOAD del fitxer main.cpp
amb el path on volguem que es guardi/carregui el fitxer.

Quan seleccionem un cos, una de les opcions del menú que apareixerà serà "Assigna textura" (o una cosa similar). Aquesta opció li assignarà a totes les cares del cos seleccionat la textura que
hi hagi escollida als radio-buttons del formulari "Seleccio textura".

Si compileu el projecte en Linux, la mida de les finestres serà de 301*301 px, mentre que en MacOS seran de 601*601 px. Si voleu modificar-ho, haureu d'anar a canviar les variables SCREEN_WIDTH i SCREEN_HEIGHT del fitxer main.cpp. Si esteu treballant amb Linux, haureu de modificar la branca #ifdef __UNX__, mentre que si treballeu amb MacOs haureu de tocar la branca de #else.

Queda pendent col·locar tots aquests paràmetres en un fitxer de propietats, ho sé...

En principi això és tot.

Captura de pantalla:


Propers canvis:

Els canvis que em dedicaré a fer ara seran interns (tot i que puntualment podria corregir quelcom).
L'estructura del main necessita ser replantejada, ja que hi ha moltes funcionalitats que haurien d'estar englobades en altres classes per a fer que la cosa es simplifiqui una mica.


Bé, fins aviat!

Programació gràfica (c++, OpenGL)

Desrpés de molt temps d'inactivitat al blog, m'he decidit de reprendre'l.

Actualment estic treballant amb un programa en c++ i OpenGL d'edició 3d.
Pretenc crear un programa amigable a l'usuari que li permeti modelar de manera fàcil objectes en 3d. Utilitzo la llibreria GLUI com a interfície gràfica, que tot i no ser del tot "agradable", funciona prou bé i és molt fàcil d'integrar.

Per a anar penjant els avanços així com mostres del que es pot fer amb el programa, he generat una nova pàgina dins el blog. S'anomena "Creador3d".

divendres, 14 d’agost del 2009

(C i OpenGL) Creació i visualització d'una esfera de fils

He fet una esfera de fils a base de dibuixar arcs.
La funció bàsica és de dibuixar mitja circumeferència (arc).

A partir d'això he creat els meridians rotant cada arc un angle diferent anant des de 0 fins a 360º.

Per fer els paral·lels, he hagut de fer una funció cercle(), que faci un arc, roti 180º i en dibuixi un altre. Amb això, he dibuixat cercles d'un extrem a l'altre de l'esfera i els he anat reescalant convenientment segons la distància fins al centre.

A l'inicialitzar el programa se'ns demana quants slides (meridians) i stacks (paral·lels) volem per a l'esfera.
Si el número de stacks és parell diferent de 0, se li suma 1.

Per compilar el programa, utilitzar el Makefile que està adjunt:
make Esfera

Això crea un executable de nom Esfera.


Temps de feina: dos dies.
Link de descàrrega: http://www.megaupload.com/?d=H5BJ9YDH

dijous, 2 d’octubre del 2008

Cotxe


De moment el deixo així...
Més endevant potser el continu-ho

dilluns, 29 de setembre del 2008

citroen C4

Està en procés...













Ja només falten els llums i després posar-li una bona textura!



Proves...