Tu risque d'être déçu pour le morph, c'étais juste un exemple pour tester la CPU...
Par contre voici le script python pour lire les .obj avec texture et normales.....
Testyé avec import meshLab, mais je crois que c'est différent sous blender (f 1//2//3 pour l'attrib des faces donc à changer dans le script si différent)
+
ArNO
Hors ligne
ok je regarde la compat 'normales'
pour le morphing, ci dessous un quote de l'orange book (et j'avais vu une version avec des .geom aussi mais je retrouve pas...) :
orange book a écrit:
You can blend between the geometry of two objects to create a tweened (inbetween) version or
do a linear blend between two colors, two textures, two procedural patterns, and so on. All it
takes is a shader that uses a control value that is the ratio of the two items being blended and
that is updated each frame by the application. In some cases, a linear blend is sufficient. For an
oscillating effect, you'll probably want to have the application compute the interpolation factor
by using a spline function to avoid jarring discontinuities in the animation. (You could have the
shader compute the interpolation value, but it's better to have the application compute it once
per frame rather than have the vertex shader compute it once per vertex or have the fragment
shader compute it needlessly at every fragment.)
For instance, using generic vertex attributes, you can actually pass the geometry for two
objects at a time. The geometry for the first object would be passed through the usual OpenGL
calls (glVertex, glColor, glNormal, etc.). A second set of vertex information can be passed by
means of generic vertex attributes 0, 1, 2, etc. The application can provide a blending factor
through a uniform variable, and the vertex shader can use this blending factor to do a weighted
average of the two sets of vertex data. The tweened vertex position is the one that actually
gets transformed, the tweened normal is the one actually used for lighting calculations, and so
on.
16.4.1. Sphere Morph Vertex Shader
The shader in Listing 16.2, developed by Philip Rideout, morphs between two objectsa square
that is generated by the application and a sphere that is procedurally generated in the vertex
shader. The sphere is defined entirely by a single valueits radiusprovided by the application
through a uniform variable. The application passes the geometry defining the square to the
vertex shader with the standard built-in attributes gl_Normal and gl_Vertex. The vertex shader
computes the corresponding vertex and normal on the sphere with a subroutine called sphere.
The application provides a time-varying variable (Blend) for morphing between these two
objects. Because we are using the two input vertex values to compute a third, inbetween,
value, we cannot use the ftransform function. We'll transform the computed vertex directly within
the vertex shader.
Listing 16.2. Vertex shader for morphing between a plane and a sphere
varying vec4 Color; uniform vec3 LightPosition; uniform vec3 SurfaceColor; const float PI = 3.14159; const float TWO_PI = PI * 2.0; uniform float Radius; uniform float Blend; vec3 sphere(vec2 domain) { vec3 range; range.x = Radius * cos(domain.y) * sin(domain.x); range.y = Radius * sin(domain.y) * sin(domain.x); range.z = Radius * cos(domain.x); return range; } void main() { vec2 p0 = gl_Vertex.xy * TWO_PI; vec3 normal = sphere(p0);; vec3 r0 = Radius * normal; vec3 vertex = r0; normal = mix(gl_Normal, normal, Blend); vertex = mix(gl_Vertex.xyz, vertex, Blend); normal = normalize(gl_NormalMatrix * normal); vec3 position = vec3(gl_ModelViewMatrix * vec4(vertex, 1.0)); vec3 lightVec = normalize(LightPosition - position); float diffuse = max(dot(lightVec, normal), 0.0); if (diffuse < 0.125) diffuse = 0.125; Color = vec4(SurfaceColor * diffuse, 1.0); gl_Position = gl_ModelViewProjectionMatrix * vec4(vertex,1.0);
Hors ligne
Autre chose pour le morphing :
- le but est d'interpoler entre 2 valeurs, ça on peut le faire en glsl avec mix(), donc pas de soucis de ce côté la.
- reste à savoir comment passer 2 positions différentes pour un même vertex. Un début de piste est qu'apparemment on peut se servir des coordonnées de textures pour fournir les coordonnées d'un deuxième point... (stu vois cque jveux dire...)
Hors ligne
bien sur, on utilise une texture externe et on récupère les coordonées couleur; le principe qu heightMap, ou bien dans les exemples de pureData fetching...
Hors ligne
Mmm l'exemple fetching, c'est lequel ?
Sinon effectivement y'a bien des distorsions liées à des textures dans les exemples mais ici le truc c'est qu'il faudrait exporter ces coodonnées en coordonnées de texture et c'est la que je bloque un peu à vrai dire... (faut que je re-regarde ton script d'export des normales/coordonnéesTexture)
Le but ultime étant bien entendu de transformer le singe en dindon.
Hors ligne
c'est l'exemple 6 de GLSL.
Sinon, pour faire apparaitre le dindon, si tu as le .obj, j'ai deux petites idées :
la première est de créer un .frag qui auraient pour valeur de gl_FragColor les valeurs des gl_Vertex du dindon, enregistrer l'image, et faire une interpolation entre les coordonées texture du 'heightMap" (bien que ce n'est plus vraiment une heightMap) du dindon et celle du singe.
sinon il suffit de faire l'interpolation en CPU par la formule [x * ( 1 − a ) + y * a] entre les tableaux de coordonées vertex (même chose que mix en glsl)
Bref pas simple mais faisable!
Hors ligne
SingeDindon!
Bon, le dindon est en fait un poulet, et un peu petit par rapport au singe...
Mais le principe y est!
+
Dernière modification par nononononono (2012-12-29 11:00:24)
Hors ligne
Ouaips!
Ici c'est une ébauche :
C'est possible de l'améliorer en faisant la même avec les coordonnées de normales et de textures,
puis en rajoutant un mix dans un fichier .frag avec les textures préchargées...
//Je m'y colle un autre jour
Hors ligne
Bon ben c'est malin, du coup j'ai compilé Gem 0.93.3 pour ubuntu 12.10 x64 exprès pour tester ce patch (backend vlc en bonus :p )
Joli !
Hors ligne