Three.js: 缩放和偏移图像纹理

创建于 2012-05-01  ·  10评论  ·  资料来源: mrdoob/three.js

我有一张要作为纹理加载的大图像。 然后,我尝试将这个纹理应用于多个多维数据集。 问题在于,当应用纹理时,它会将图像缩放到立方体的宽度和高度。 我要做的是确保没有缩放发生,然后可以移动纹理的“偏移”以选择要显示的部分。

谁能指出我正确的方向?

例如,如果我的纹理是800x2000。 我有一个100x100的立方体,我想显示该大纹理的100x100部分,偏移为300x400。 所以像:

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

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

为此,我需要利用画布纹理吗?

Question

最有用的评论

啊,是的。 Texture没有.scale ,它有.repeat 。 尝试这个:

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;

所有10条评论

好的,我到了那里,但是我需要找到有关如何使用offset和repeat参数的文档。 它们似乎需要在0到1之间,并且不确定如何获取转换为像素的值。

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

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

发布我的解决方案,以防对其他人有帮助。 我最终将画布用作纹理,然后在该画布上加载/裁剪图像。 到目前为止似乎工作正常。


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);

这是一种方法,但是如果要使用GPU,可以执行以下操作:

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;

或类似的东西:)

凉! 感谢您的跟进

在gpu上执行此操作当然可以提高性能。 但是,当我尝试设置纹理的scale.x属性时,我不断收到“无法设置x的属性”错误。 有任何想法吗? 我也使用tex.scale.set(w,h)方法进行了尝试,并得到了相同的结果。

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);

奇怪的是,如果映像已具有src,则意味着它已被加载。 为什么要再次加载?

我认为您想改为这样做:

tex = new THREE.Texture( img );

谢谢,是的,仅在img对象上直接使用THREE.Texture()似乎加快了速度。 虽然仍然在tex.scale操作上出现错误。 无论如何要使用tex.repeat转换缩放比例? 我可以调整这些值没问题。

啊,是的。 Texture没有.scale ,它有.repeat 。 尝试这个:

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;

我来这里只是想了解如何缩放纹理,以便仅了解重复和偏移属性。但是如何缩放它们?

@nightlifelover指南中所述,帮助请求应定向到stackoverflow

此页面是否有帮助?
0 / 5 - 0 等级