Modify UVs without messing them up

Hey guys.

I feel completely stupid now and am very close to breaking my keyboard.
I need to modify UVs of a hemisphere so that only half of the texture is visible (for vr purposes).

Here’s what it looks like before any modifications:
image

I apply this code to the hemisphere:

function setUV(geom, uv) {
        for (let i = 0; i < geom.faceVertexUvs.length; i++) {

            var layer = geom.faceVertexUvs[i];

            for (let j = 0; j < layer.length; j++) {

                var uvset = layer[j];

                for (let k = 0; k < uvset.length; k++) {
                    var c = uvset[k];
                    c.x = uv.umin + (uv.umax - uv.umin) * c.x;
                    c.y = uv.vmin + (uv.vmax - uv.vmin) * c.y;
                }

            }     
            
        }
        geom.uvsNeedUpdate = true;
    }

setUV(hemisphere, {
            umin: 0,
            umax: 0.5,
            vmin: 0,
            vmax: 1
        })

And here’s what I get:
image

Basically, i’m trying to scale initial UV set to some area on the texture.
What am I doing wrong?

Let’s say your initial range of values is [a, b]. And the new range is [c, d]. You can transform a value x like this:

( ( d − c )( x − a ) / b − a ) + c

Demo: https://jsfiddle.net/f2Lommf5/4685/

Isn’t it what I am doing right now? (with initial range [a,b] = [0,1])

I’m not sure your calculation is equivalent. Please try it out.

Here’s a fiddle using my geometry and your scaling formula:

https://jsfiddle.net/6jf4c89a/13/

Still, without scaling it look perfectly good (you can check it yourself in this fiddle), but after scaling it turns into mess. The only difference is that i am using Geometry instead of BufferGeometry, but as far as i know it shouldn’t cause such behaviour (I mean, it’s still plain UV coordinates, right?)

Since you are using a half sphere, maybe we can’t linearly scale the uvs like with a plane? Any chances you alter the uv coodinates in Blender or another modeling tool?

No, I don’t think that’s the problem, this formula should work on all shapes.

To confirm my words:
I converted half sphere from Geometry to BufferGeometry and copied the code from your fiddle, not it works as it should:

image

Though I can continue my work now, I would really like to know why it doesn’t work with Geometry.
Is there a possibility that when I iterate over faceVertexUvs, i modify UV of the same vertex multiple times?

I’m out of ideas. I really don’t know why i does not work with Geometry

I guess I was right in my prev. post.

Here’s a fiddle with a (dirty) hack, which shows, where I was wrong in the first place.
https://jsfiddle.net/6jf4c89a/50/

Anyway, thanks for your time.

I see. Thanks for the feedback :+1:

In any event, this unpredictable behavior of Geometry is anything but good. One reason more to deprecated Geometry and focus on BufferGeometry.

3 Likes

Where is the button for 1000 likes? :slight_smile:

1 Like

:laughing: