How to get UV seams from existing UV islands
As 3fingeredfrog mentioned, you can mark the UV seams from your current UV islands. For this, go in the UV editor while in edit mode, select all your mesh in the viewport, all the UVs in the UV editor, and use the menu UV > Seams From Islands:
Why UV islands don't always have seams
As to why some models can have UVs without seams, "seams" or any form of edge-marking for UVs are only useful for the process of making UVs manually. They are useless to storing or even describing the UV data.
Primitive objects in Blender don't have seams. And it is possible in Blender to make UVs without seams. In fact, all the unwrapping methods you see in the viewport's UV Mapping menu (shortcut U) make no use of edge seams, except the "Unwrap" at the top that flattens your mesh and splits it at the edges marked as seams:
Hence, it's possible to have UV-unwrapped models with no seams in Blender.
Furthermore, it is almost systematic to have no edge seams on models that were imported from outside of Blender.
I say almost, because some formats do support explicit UV seams {FBX, Collada (.dae)}, and as you can see above you can always make seams from existing islands. But even if a data can be sometimes exported by some specific formats, it's also not a very frequent one to export, not every import/export tools exposes it as an option, so it's safe to assume you won't have UV seams even from meshes stored in formats that does support it.
How UV data are stored
UVs are simply coordinates stored per vertex. Here's an example with Blender's default cube in OBJ format:
# Blender 4.2.1 LTS
# www.blender.org
o Cube
v 1.000000 1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 1.000000 -1.000000
v -1.000000 -1.000000 -1.000000
v -1.000000 1.000000 1.000000
v -1.000000 -1.000000 1.000000
vt 0.625000 0.500000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.125000 0.500000
vt 0.375000 0.500000
vt 0.125000 0.750000
s 0
f 1/1 5/2 7/3 3/4
f 4/5 3/4 7/6 8/7
f 8/8 7/9 5/10 6/11
f 6/12 2/13 4/5 8/14
f 2/13 1/1 3/4 4/5
f 6/11 5/10 1/1 2/13
In an OBJ file, UVs are described using the vt
(vertex texture) lines, and they correspond to texture coordinates in 2D space. Here's how it works:
o
defines the name of the object that follows
v
contains three 32-bit floats x
y
and z
corresponding to the coordinates of the mesh's vertices.
vt
contains two 32-bit floats u
and v
that defines a UV coordinate, where u
is the horizontal axis (0 to 1) and v
is the vertical axis (0 to 1).
- For example,
vt 0.625000 0.500000
means that one of the vertices maps to the UV coordinates (0.625, 0.5).
s
defines the shade smoothing state. 0
makes the whole mesh flat shaded, 1
Would make the whole mesh smooth shaded. If you exported a smooth shaded object with some sharp edges, you would also have vn
lines after the v
lines, describing vertex normals in the form of 32-bit floats x
y
and z
to make up the vector of the vertex orientation.
f
defines faces, by associating vertices to UV coordinates. It contains one A/B
pairing for each vertex making up the face. Where A and B are respectively the indexes of vertices (v
lines) and UV coordinates (vt
lines) as they are described in the file.
In our example, we have a cube, which is six faces of 4 vertices, so we have six f
lines with four A/B
pairing.
The first line f 1/1 5/2 7/3 3/4
means that:
- the first vertex of the face associates
1/1
, aka the 1st vertex of the list (v 1.000000 1.000000 -1.000000
) to the 1st UV of the list (vt 0.625000 0.500000
)
- the second vertex of the face associates
5/2
, aka the 5th vertex of the list (v -1.000000 1.000000 -1.000000
) to the 2nd UV (vt 0.875000 0.500000
)
- so on
As you can see, no seams represented here, just 2d/3d math coordinates and associations.