Retrieve texture coords when no UVW tag exists
-
On 21/05/2015 at 08:37, xxxxxxxx wrote:
Hi Andreas,
yep it is there , but the "example" is not there .
-
On 21/05/2015 at 09:27, xxxxxxxx wrote:
Ooopsy, the example slipped through our hands. Terribly sorry.
We'll add it with the next documentation update.
Thanks for pointing this out to us. -
On 21/05/2015 at 16:04, xxxxxxxx wrote:
I ended up using the example code from the TexData to generate my own UVs, but now have a small issue that I ended up understanding, but can't seem to find a solution.
For the Cylindrical projection, I'm getting an odd mapping on the last quad. Looking at the results from the ProjectPoint function, I noticed that the resulting UV values for the last 2 vertexes of my cylinder are 0 instead of 1. This is because the first 2 vertexes and the last 2 are the same and of course the function returns the same value (0).
This doesn't have that much to do with the SDK itself, but maybe someone knows a way to fix it. I'm new to UVs, I tried a lot of workarounds but none seem to be foolproof.
Here's my example, a cylinder with 8 sides (no caps), and the results of the projection a,b,c and d per line:
0.7500 0.7500 0.8750 0.8750 0.0000 0.0000 0.1250 0.1250 0.6250 0.6250 0.7500 0.7500 0.3750 0.3750 0.5000 0.5000 0.1250 0.1250 0.2500 0.2500 0.5000 0.5000 0.6250 0.6250 0.8750 0.8750 **0.0000 0.0000** 0.2500 0.2500 0.3750 0.3750
red lines are relative to the same vertex, and bold red is where I should get 1 instead of 0.
-
On 21/05/2015 at 17:27, xxxxxxxx wrote:
you are doing it wrong, UV data is per "face" , NOT per "vertex" , so a vertex sharing 2 faces like in Cylinder without caps will have 2 different UV coordinates, 1 for each face.
-
On 21/05/2015 at 17:37, xxxxxxxx wrote:
Originally posted by xxxxxxxx
you are doing it wrong, UV data is per "face" , NOT per "vertex" , so a vertex sharing 2 faces like in Cylinder without caps will have 2 different UV coordinates, 1 for each face.
Yes, exactly!
Maybe I forgot to mention some extra data on my previous post. Those numbers in that table are for U (X) only, I didn't mention V (Y), because there's no problem there.Also, each line is the UV data for 1 face, and of course if 1 face has 4 vertexes, I get 4 U's.
-
On 21/05/2015 at 17:54, xxxxxxxx wrote:
write the function that you use to produce them
-
On 21/05/2015 at 18:25, xxxxxxxx wrote:
Even better, here are the vertexes for my cylinder:
(0.000000 -100.000000 50.000000) (0.000000 100.000000 50.000000) (-35.355339 100.000000 35.355339) (-35.355339 -100.000000 35.355339) **(-50.000000 -100.000000 0.000000) (-50.000000 100.000000 0.000000) ** (-35.355339 100.000000 -35.355339) (-35.355339 -100.000000 -35.355339) (35.355339 -100.000000 35.355339) (35.355339 100.000000 35.355339) (0.000000 100.000000 50.000000) (0.000000 -100.000000 50.000000) (35.355339 -100.000000 -35.355339) (35.355339 100.000000 -35.355339) (50.000000 100.000000 -0.000000) (50.000000 -100.000000 -0.000000) (-35.355339 -100.000000 -35.355339) (-35.355339 100.000000 -35.355339) (-0.000000 100.000000 -50.000000) (-0.000000 -100.000000 -50.000000) (50.000000 -100.000000 -0.000000) (50.000000 100.000000 -0.000000) (35.355339 100.000000 35.355339) (35.355339 -100.000000 35.355339) (-35.355339 -100.000000 35.355339) (-35.355339 100.000000 35.355339) **(-50.000000 100.000000 0.000000) (-50.000000 -100.000000 0.000000)** (-0.000000 -100.000000 -50.000000) (-0.000000 100.000000 -50.000000) (35.355339 100.000000 -35.355339) (35.355339 -100.000000 -35.355339)
And now, how I calculate the UVs for a specific vertex, it's actually very similar to the function ProjectPoint:
This code is executed 4 times per face (for each vertex, a,b,c and d)if (p.x == 0.0 && p.z == 0.0) uvw.x = 0.0; else { **uvw.x = atan2(p.z, p.x) / PI2;** uvw.x -= projOffsetx; if (projLenx > 0.0 && uvw.x < 0.0) uvw.x += 1.0; else if (projLenx < 0.0 && uvw.x > 0.0) uvw.x -= 1.0; uvw.x *= projLenxInv; } uvw.y = -(p.y * 0.5 + projOffsety + 0.5) * projLenyInv;
The important part is in bold, all the rest is code to deal with offsets and repeats.
So now, if you look at the vertex table I posted above, you'll notice in bold, the same vertexes belonging to different faces, but applying my formula for uvw.x they will get the same U, because they have the same coords.Again, only U is shown in the image.
The smile face should be completely around the cylinder, but in my case, the last face has a repetition, because the last UV coordinates are wrong. -
On 21/05/2015 at 19:02, xxxxxxxx wrote:
what you are missing is a "direction" , so you have 4 points, a,b,c,d, get the normal of the uv polygon
so:
Vector normal = cross(c - a, d - b);
if(normal.z < 0) //do something -
On 21/05/2015 at 19:46, xxxxxxxx wrote:
Maybe this will help, but this math is the inverse of mapping a planar image onto a cylinder (so, it maps the cylinder onto the uv planar space). This math may assume that the origin is at the center of the cylinder.
Let say you have a rectangle image of length: L and height: H.
and a cylinder of radius : R and height H'
A(x,y,z) from the cylinderA'(u,v) in the image :
v = z*(H/H')
and u = L/(2Pi)* { arccos(x/R) *(sign(y)) (mod(2Pi)) }
-
On 22/05/2015 at 08:38, xxxxxxxx wrote:
Originally posted by xxxxxxxx
what you are missing is a "direction" , so you have 4 points, a,b,c,d, get the normal of the uv polygon
so:
Vector normal = cross(c - a, d - b);
if(normal.z < 0) //do somethingHey! You nailed it!
Just for the completion of the answer, I will say that I needed to add 1.0 (InverseLength) to the U coordinate C and
Vector normal = Cross(uvw.c - uvw.a, uvw.d - uvw.b); if (normal.z < 0 && projType == TEXTURETAG_PROJECTION_CYLINDRICAL) { uvw.c.x += projLenxInv; uvw.d.x += projLenxInv; }
So, thanks for the help!