我有一张要作为纹理加载的大图像。 然后,我尝试将这个纹理应用于多个多维数据集。 问题在于,当应用纹理时,它会将图像缩放到立方体的宽度和高度。 我要做的是确保没有缩放发生,然后可以移动纹理的“偏移”以选择要显示的部分。
谁能指出我正确的方向?
例如,如果我的纹理是800x2000。 我有一个100x100的立方体,我想显示该大纹理的100x100部分,偏移为300x400。 所以像:
tex = THREE.ImageUtils.loadTexture('texture.png');
tex.left = 300
tex.top = 400
var pictureMaterial = new THREE.MeshBasicMaterial({map: tex});
为此,我需要利用画布纹理吗?
好的,我到了那里,但是我需要找到有关如何使用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 。
最有用的评论
啊,是的。
Texture
没有.scale
,它有.repeat
。 尝试这个: