Blender (jusqu'à 2.49)
Python: 
Copy the UV coordinates of a mesh 
instead of it's 3D coordinates
(Last update : 21/10/2005)
Version Française
    Main   Index
Previous  Import "SVG" format 
Explosion script Next
Objective
Méthod
Means
modifiable options
UV layout, exporting the fill/raster of the simple uv coordinates
      Caution : IMAGESIZE
Recording the local lighting
Recording a map of the radiosity
      Caution : boundaries of the UVs coordinates
      Caution : List of the materials and option [vCol paint]
      Trying the example file(7zip format, 443 kos)
Update for version 2.40 of Blender: from absolute to relative
Downloading the script .
Thread on Elysiun 

Objective

The procedurals textures can't be preserved in the Blender game system. However it is posssible to keep a certain appearance passing through  Vertex colors . This method duplicate the number of vertices and weigh down themesh  object wich becames unusable if you want to have sufficient details.

Thus this script allows to keep a trace of all the textures assigned to a mesh,  including the uvmapped textures and the vertex colors under the guise of a picture that represents the unfolding of the uv coordinates as they appear in the UVeditor window

Method
a) Select the mesh. Switch toward the FaceSelect mode, F key, for this operation use  the 3d window or the menu you can find in the taskbar of this window.  Define uv coordinates for your mesh (it imply that your going to use the U key to choose a type of projection in the menu that will appear).

b) Define the materials and textures.

c) Launch the script using the menu "Scripts/UV/Texture Baker" you have in the Scripts window or using the menu "UVs/Texture Baker" wich is located in the task bar of the UVeditor window.

Means
The script is based on a particularity of the Relatives Vertex Keys . These RVKs not only distort the geometry of the mesh on wich they are applied but also the procedurals textures that are in use in the mesh. 
Modifiables options 
1/ re-framing

The script can partially take care of the re-framing of the UV coordinates when these ones go beyond the limit 0.0 and 1.0.  However,  this imposed re-framing put the coordinates out of phase when the farthest limits aren't the one of a square. This fact seems to annoy the users. Thus by default this option is not activated. If, in spite of that, someone want to try it,  this person will have to :
 
 

New Method : in Blender 2.43 version CVS 

push the  limit button,  when the dialog box appears, 

Old Method (up to Bender 2.42)
edit the script, find the variable named "LIMIT" and assign it the value 1 .

2/ Save or not the  picture 

The new script lets  the resulting image in   the render window but if you toggle the Replace Img  button, it will try to save if it does not exist already a file with the same name . 

UV layout, exporting the fill/raster of the simple uv coordinates.
The whole trick consist in selecting the Wire option of the material, after having prepared a color contrasting ...

(click on the picture to zoom out)

...with the background. Prepare a World in accordance with, for example white if the color tends toward a dark sepia.


(click on the picture to zoom out)

Launch the script. The first dialog ask if there is a need to change the name of the picture. Choose t No Replace .

Choose the size :


Caution : IMAGESIZE
By default the maximal size of the image is limited to 2048 but if you wish to increase or modify this value just do a text resurch on the variable TAILLEIMAGE and suppress the "#"
Do not forget to do the same on the code routine if that is placed just below .
   #...
   TAILLEIMAGE='TEXTURE OUT RESOLUTION : %t |'
   TAILLEIMAGE+='256 %x1 |'
   TAILLEIMAGE+='512 %x2 |'
   TAILLEIMAGE+='768 %x3 |'
   TAILLEIMAGE+='1024 %x4 |'
   TAILLEIMAGE+='2048 %x5 '
   #TAILLEIMAGE+='| 4096 %x6 ' 
   tres = Draw.PupMenu(TAILLEIMAGE)

   if (tres) == 1: res = 256
   elif (tres) == 2: res = 512
   elif (tres) == 3: res = 768
   elif (tres) == 4: res = 1024
   elif (tres) == 5: res = 2048
   # elif (tres) == 6: res = 4096
   else: res = 512
   #...

The script will do the "settings" and will keep the "render window" displayed :

You take charge of the saving. Go to the F10 window, Render, pannel Format :
:

Select the format : 

Push on the F3 key and record. The image is still available for display with the short keyF11

Recording the local lighting

To obtain a copy of the local lighting on the mesh, we can use this script :
import Blender
MESH=Blender.Object.GetSelected()[0].getData()
MESH.update(0,0,1)
That operation has the same result than attributing new vertex colors to the mesh .
Then, we must absolutely activate the option vcolpaint on the material assigned to this object .


Cauion : 
If the uvmapping coordinates haven't still yet been assigned, this process can be replaced by a handly made operation passing through the Vertex Paint mode.


(cliquez l'image pour l'agrandir)

We apply the UVs coordinates : 


(cliquez l'image pour l'agrandir)

We launch the script :

(cliquez l'image pour l'agrandir)
Recording a map of the radiosity
The script "Texture Baker" does not allow to see the falling shadows  of a lighting (spot or others); But we can make appear usable shadows passing by the calculation of a radiosity lighting, because this one works with the Vertex colors .

1/ Classical Radio procedure :

               -> Select a few meshes, (do not forget to assign to at least one of them, a material with a high 'emit' value). Use the [Collect Meshes] button.

               -> Launch the calculation : with the button [go] (wich has not the color as here below)

               -> button [Add new mesh], to avoid loosing the original data
               -> button [free radio data], to reset all in order

    2/ Put the new mesh in another layer, touche M, selection

    3/ -> Select the new mesh, Right Mouse Button
        -> Enter the edit mode, with the TAB key
        -> Select each part of the whole 'blocky' mesh , for example, a cube will be made of 6 separated parts. Thus, you have to place the mouse cursor over each part, select one of the vertex, then push  Maj-RightMouseButton and use the L key to recover the selection of all the vertices linked with the first you have selected.

    4/ When all the parts are selected.
       -> do a  separate, with the P key

       -> go out of the edit mode, with "TAB" key
       -> Select the mesh you've just created,

    5/ Go to Faceselect mode, with F key
    6/ Select all, with the A key
    7/ Choose the type of unfolding, with the U key


    (click on the picture to zoom out)


    Caution : The bounderies of the UVs coordinates.

    According to the type of unfolding, the uv coordinates can go beyond the standards limits. This overrun is not annoying in itself but it will pervert the final viewing angle. The script is not previously made to deal with this overrun,  recalculate and re-attribute correct coordinates. But it can do a correct camera viewing angle of the whole scene without touching the original mesh, if the LIMIT variable is equal to1.


    (click on the picture to zoom out)

    To check if the coordinates are going beyond the limits, you need to contrast  the UVmapEditor Background a bit more, it is done by the attribution of a new Theme in the User preferences window


    (click on the picture to zoom out)

    8/ Go out of the Faceselect mode, with F key

    9/ Go in the materials window ,  F5 key

      -> Check if the [vcol paint] option is activated in the material settings.
       
         
        You could test the vertexpaint map with the the uvpainter script click on the pictureto zoom out but it is not obliged  

     
    Caution : List of materials and option [vCol paint]

    If each of the original meshes was assigned a different material, these materials will be gathered in the mesh produced by the radiosity calculation . This can generate a mix-up, because the "vertex paints" won't probably be located on the first material of the list. 
    To check wich is the active material, we can use the material index  that you can find in the edition window, in the part  "Link and Material". We must apply this procedure to each of the material :

    Edit Mode
    a Key to remove the selection on the whole
    Select button
    a Key to remove the selection on the whole
    Go on through the list of materials
    The active material should color all the vertices in yellow . 

      -> decrease the emit value to zero (unless the emit belongs to the texture project you want to export ).

    10/ Go to the text window, shift-f11
    11/ Load the last version of the script :
        http://jmsoler.free.fr/util/blenderfile/py/3d2uvbakerv034.py
    12/ Do Alt-p in the text window, choose "no replace", the size,
        and so on...

Update for version 2.40 of Blender: from absolute to relative
Since this delivery, December 23, 2005,  the software does not take in charge the absolute keys of morphing in an automatic way any more. This modification of management poses a rather heavy problem with the script, which cannot carry out the unfolded UV map correctly any more . 
This need a short explanation : the principle of the script consists in creating two keys: one of reference, which is really needed to obtain a management of the texture deformation, and another, modified, totally flat, which must be used as a model for the final shoot . But in the new system of Shape key, the first key remains visible because it is the one selected by default and seen by the software. 
To make pass the second key ahead, one must add an ipo curve with maximum values.  The procedure is relatively simple : one have to add a bezier knot to the coordinates at  the variable named FRAME (defined at the beginning of the script and  which corresponds to the last image calculated for animation in the currently running file) and 1.0, which corresponds to 100% of the transformation for this key. This manner makes it appear perfectly flat in front of the camera. 

The following function was added to carry out these operations: 

#----------------------------------- 
# release : 0.3.2 ,  2005/12/28 , 13h00
#----------------------------------- 
def Blender240update(MESH2,FRAME):
         """ 
# ---------------------------
# Function  Blender240update

#  IN : MESH2   a mesh data bloc
#       FRAME , the animation frame limit

#  ADD : an ipo curve to the shape key
#        named "Key 1" 

#  OUT : nothing
# --------------------------- 
         """
         # --------------------------- 
         #  Get the morphing keys  for this mesh
         # --------------------------- 
         key = MESH2.getKey()
         # --------------------------- 
         #  Try to get the ipo
         # --------------------------- 
         ipo = key.ipo
         # --------------------------- 
         #  if  ipo does not exist, create it 
         # --------------------------- 
         if ipo == None:
            noipo = Blender.Ipo.New("Key","keyipo")
            key.ipo = noipo
         # --------------------------- 
         # shorter variable name
         # --------------------------- 
         ipo = key.ipo
         # --------------------------- 
         #  identify the morphing key 
         # --------------------------- 
         keyidentity = "Key 1"
         # --------------------------- 
         #   get the curve linked to "Key 1" 
         #  It is always the curve 0
         # --------------------------- 
         ipocurve = ipo.getCurve(0)
         # --------------------------- 
         # this curve should not exist so we 
         # creates it.
         # --------------------------- 
         if ipocurve == None:
            ipocurve = ipo.addCurve(keyidentity)
         # --------------------------- 
         #  we set a linear interpolation
         # attribute to have a real flat line
         # --------------------------- 
         ipocurve.setInterpolation("Linear")
         # --------------------------- 
         #  we remove all the curve's knots 
         #  normally there is no knot on a new
         #  curve but  ..
         # --------------------------- 
         while len(ipocurve.getPoints()) > 0:
            ipocurve.delBezier(0)
            ipocurve.recalc()
         # --------------------------- 
         #  the we add the necessary knots...
         # --------------------------- 
         ipocurve.addBezier((-1,1))
         # --------------------------- 
         #   ... and this one too by security .
         # --------------------------- 
         ipocurve.addBezier((FRAME+1,1))
#----------------------------------- 
# release : 0.3.2 ,  2005/12/28 , end
#----------------------------------- 

Try the example file (7zip format, 443 kos updated with the 0.2.9 version)

Thread on Elysiun 

Changelog 
0.3.3
     blender 2.40 update to deal with the object module refactory
     some probleme with the relatif render directory
 
 0.3.2
     blender 2.40 update to deal with the new shape  
     key system . 

 0.3.1 
     stupid bug correction    

0.3.0
    -- adding of the variable "TAILLEIMAGE/IMAGESIZE"

0.2.9

    -- Suppression of a test on an unused variable 

  0.2.8

     -- added the forgotten image property in face data. A little longer but gives a better result.  ( a Rem Double in the resulting mesh may be useful .) 
     -- the data.update() function problem is corrected too
    -- no more layers problem . CAM and MESH objects are localised in layer 20. This layer is the active one for the image rendering .
     -- mesh creation is cleaner, loop in double was removed and the absolute key is set in frame 1  only. This solves another deform problem.
     -- if user does not want an autosaved image,  the "no replace" option leaves the render window on the screen 

0.2.7

     -- minor correction on line 147: "!=-1" added 

0.2.6

     -- Creation of LAMP object is removed and replaced  by the use of the Shadeless option  in material object

     -- helpmsg corrected : the aim of the script  is to bake any type of textures so we are not obliged to mapinput its textures on UV .

     --'pers' camera was replaced by an 'ortho' one. 

0.2.5

     -- if an image file  with the same name exits the system returns an error 

0.2.4

    -- a LIMIT variable is added to unlock the uvcoords autoframing 

0.2.3

    Great thanks for Apollux  who saw a lot of these problems
    -- Everytime you run the script a new set of objects is created. File size and memory consumption can go pretty high if you are not aware of that.  Now it ONLY creates 3 objects: a flattened  mesh, a camera and a lamp. 
    -- all the 3 objects was placed on layer 1, but if  that layer was not visible while you used the script  all you will get a is an empty render. Now the layer is activated before the shoot 
    --The flattened mesh was really flattened only after frame 100 (if you playbacked the animation, you can  actually see the mesh becoming flat on the first 100  frames). No more.
    -- When the script is running, it changes temporary to  the new camera, set the render output to a square  (i.e. 1024 x 1024 or else), does the render, and then resets the render output and the active camera to the original one. But if no original camera was found  this produces an error. 

 0.2.2

     If the uv mesh object exist it is used, no creation of a new one. As well as for the lamp and  the camera

 0.2.1

    This script automatically frames and shoots the new uv mesh. The image file is saved in the "/render" directory.

previous Script SVG import 
 Explosion script Next
To the  Top of the page

Questions concerning this page can be asked on  :
 news://news.zoo-logique.org/3D.Blender


 

 

Les questions concernant cette page  peuvent être posées sur  :
news://news.zoo-logique.org/3D.Blender

Livre en français
Blender : apprenez, pratiquez, Créez, livre, Ed. Campus Press, coll. Starter Kit
Blender Starter Kit

Forum
FAQ
Lexique
Didacticiels
Compilations
Blender2KT
Débuter
Modelage
Blender python
Materiaux
Lumière
Animation
API python (eng)
Archives nzn
Statistiques
Doc flash Sculptris
Galerie Sculptris

mon site de démos sur youtube