Three.js: escalado y compensación de texturas de imagen

Creado en 1 may. 2012  ·  10Comentarios  ·  Fuente: mrdoob/three.js

Tengo una imagen grande que estoy cargando como textura. Luego tengo varios cubos a los que estoy tratando de aplicar esta textura. El problema es que cuando se aplica la textura, escala la imagen al ancho y alto del cubo. Lo que quiero hacer es asegurarme de que no ocurra ninguna escala, luego puedo mover el "desplazamiento" de la textura para elegir la parte que quiero mostrar.

¿Alguien puede señalarme en la dirección correcta?

Por ejemplo, si mi textura es 800x2000. Y tengo un cubo de 100x100, quiero mostrar una porción de 100x100 de esa gran textura, compensada como 300x400. Entonces algo como:

tex = THREE.ImageUtils.loadTexture('texture.png');
tex.left = 300
tex.top = 400

var pictureMaterial = new THREE.MeshBasicMaterial({map: tex});

¿Necesito aprovechar las texturas del lienzo para esto?

Question

Comentario más útil

Ah, verdad. Texture no tiene .scale , tiene .repeat . Prueba esto:

tex.repeat.x = 100 / 800;
tex.repeat.y = 100 / 2000;
tex.offset.x = ( 300 / 100 ) * tex.repeat.x;
tex.offset.y = ( 400 / 100 ) * tex.repeat.y;

Todos 10 comentarios

Ok, estoy llegando allí, pero necesito encontrar documentación sobre cómo usar los parámetros de desplazamiento y repetición. Parece que necesitan estar entre 0 y 1, y no están seguros de cómo obtener un valor que se convierta en píxeles.

tex = THREE.ImageUtils.loadTexture('texture.png');

tex.offset.x = ?
tex.offset.y = ?
tex.repeat.x = ?
tex.repeat.y = ?

Publicando mi solución en caso de que sea útil para alguien más. Terminé usando lienzo para la textura y cargando / recortando la imagen allí. Parece que funciona bien hasta ahora.


canvas = document.createElement('canvas');
canvas.height=200;
canvas.width=200;

ctx = canvas.getContext('2d');
ctx.fillStyle = '#FFFFFF';  
ctx.fillRect(0, 0, 200, val.200);

//this is where we set the "offset"
offx = -1 * 200;
offy = -1 * 200;

//img is a standard loaded image object
ctx.drawImage(img,offx,offy);

tex = new THREE.Texture(canvas);

Esa es una forma de hacerlo, pero si desea usar la GPU, puede hacer esto:

tex.scale.x = 800 / 100;
tex.scale.y = 2000 / 100;
tex.offset.x = ( 300 / 100 ) * tex.scale.x;
tex.offset.y = ( 400 / 100 ) * tex.scale.y;

O algo por el estilo :)

¡Frio! Gracias por el seguimiento

Hacer esto en la gpu es sin duda más eficaz. Sin embargo, cuando intento establecer la propiedad scale.x de la textura, sigo obteniendo errores de "no se puede establecer la propiedad de x". ¿Algunas ideas? Lo probé usando el método tex.scale.set (w, h) también con el mismo resultado.

tex = THREE.ImageUtils.loadTexture(img.src);

scalex = img.width / 100;
scaley = img.height / 100;

tex.scale.x = scalex;
tex.scale.y = scaley;
tex = THREE.ImageUtils.loadTexture(img.src);

Eso es extraño, si la imagen ya tiene un src, significa que ya se ha cargado. ¿Por qué cargarlo de nuevo?

Creo que quieres hacer esto en su lugar:

tex = new THREE.Texture( img );

Gracias, sí, el simple hecho de usar THREE.Texture () directamente en el objeto img parece haber acelerado las cosas. Sin embargo, todavía aparece un error en las operaciones tex.scale. De todos modos, ¿traducir la escala usando tex.repeat? Puedo modificar esos valores sin problema.

Ah, verdad. Texture no tiene .scale , tiene .repeat . Prueba esto:

tex.repeat.x = 100 / 800;
tex.repeat.y = 100 / 2000;
tex.offset.x = ( 300 / 100 ) * tex.repeat.x;
tex.offset.y = ( 400 / 100 ) * tex.repeat.y;

Vine aquí para descubrir cómo escalar una textura solo para aprender sobre las propiedades de repetición y compensación ... pero ¿cómo puedo escalarlas?

@nightlifelover Como se indica en las pautas , las solicitudes de ayuda deben dirigirse a stackoverflow .

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

filharvey picture filharvey  ·  3Comentarios

clawconduce picture clawconduce  ·  3Comentarios

jlaquinte picture jlaquinte  ·  3Comentarios

Horray picture Horray  ·  3Comentarios

ghost picture ghost  ·  3Comentarios