在一个几何体的不同面上使用多个纹理
Using multiple textures on different faces of one geometry
我对Three.js很陌生,所以我不确定是否可以这样做:
我想在一个平面几何体上显示多个图像(其中一些图像会出现多次)。想象一下下一个简化的案例:
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 1 | 6 |
+---+---+---+
| 1 | 1 | 9 |
+---+---+---+
我正在创建带有其分割的平面,并将MeshBasicMaterial(包含在MeshFaceMaterial中)应用于其面。每对人脸都分配了一个可用的图像,即:
- image1应用于面{0,1}、{8,9}、{12,13}、}14,15}
- 图像2应用于面{2,3}
图像"正确"地出现在正确的位置,但它们的大小不正确。每个瓦片正方形是256x256像素大小,并且要显示的每个图像也是256x256。我的问题是纹理大小被拉伸到几何体的边缘。
我尝试过使用纹理wrapS/wrapT属性,但没有成功,因为它总是延伸到768x768(在本例中)。
我当前的代码:
// TEXTURE LOADING LOOP
// canvas contains a 256x256 image
var texture = new THREE.Texture(canvas);
//My last test was trying to clamp to the edge of the face -> failed
texture.wrapS = texture.wrapT = THREE.ClampToEdgeWrapping;
texture.needsUpdate = true;
this.materials.push(
new THREE.MeshBasicMaterial({
map: texture
})
);
// LATER, we generate the geometry to display the images
var geometry = new THREE.PlaneGeometry( 256*3, 256*3, 3, 3 );
// assign a material to each face (each face is 2 triangles)
var l = geometry.faces.length;
for( var i = 0; i < l; i+=2 ) {
// assigned_material contains the index of the material texture to display
// on each "square"
geometry.faces[ i ].materialIndex = assigned_material[i];
geometry.faces[ i+1 ].materialIndex = assigned_material[i];
}
// mesh
mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( this.materials ) );
this.scene.add( mesh );
是否可以将相同的材质纹理指定给不同的面并保持其当前大小,以便在每个平铺上显示其当前大小的纹理?
为了更清楚地说明这个问题,在这个结果图像上,我们可以看到,相同的纹理应用于中央、左下和右下瓦片,每个瓦片都应该显示256x256像素图像的完整版本。http://angelraposo.appspot.com/images/result.jpg
平面几何体的尺寸无关紧要——只有纵横比才重要,因此图像不会被拉伸。
你有几个选择:
-
可以根据需要将平面几何体的每个三角形的UV更改为
(0,0)
、(0,1)
、(1,0)
或(1,1)
。 -
可以为每个纹理设置适当的
texture.offset
和texture.repeat
属性。例如texture.offset.set( 0, 1/3 )
和texture.repeat.set( 3, 3 )
。 -
最后一个简单的选择是只有9个平面几何体,每个几何体有2个三角形面。
three.js r.66
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- jQuery:循环一个具有不同超时值的循环
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 从javascript创建一个列表
- 节点导出返回一个空对象
- 使用clickToggle并在单击另一个元素时关闭元素
- 我可以在json对象中添加一个函数吗
- 使用javascript将动态表从一个html页面打印到另一个html页
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 表追加而不附加最后一个元素
- 我如何找到一个句子中的所有空格并替换忽略它们
- D3在一个调用中绘制不同的SVG形状,没有可见性
- webgl在一个正方形上操纵两个纹理
- “没有VBO绑定到启用的顶点属性索引0”试图在WebGL中绘制一个简单的纹理
- 用MeshDepthMaterial绘制一个透明纹理
- 在three.js中渲染一个带有纹理的动画fbx模型
- 我想加载一个.obj文件,并在运行时通过按钮点击使用three.js改变它的纹理/材料
- three.js r81:我如何做一个立方体与不同的纹理在每个面
- 在一个立方体上使用纹理和颜色
- 在一个几何体的不同面上使用多个纹理