javascript - Three.js 中的圆柱体纹理

标签 javascript html webgl three.js

我已经关注了很长时间了。 我在任何地方都找不到任何解决方案。 我正在尝试在圆柱体上应用 3 种不同的纹理(2 个盖帽和侧面) 但我完全不知道如何实现这一目标。 你能给我定位吗? 这是我现在正在做的事情:

var coin1_geo = new THREE.CylinderGeometry( 100, 100, 10, 100, 100, false );
var coin1_texture = THREE.ImageUtils.loadTexture("./assets/avers.png");
var coin1_mat = new THREE.MeshLambertMaterial({map:coin1_texture});
var coin1 = new THREE.Mesh( coin1_geo, coin1_mat );
coin1.rotation.x = 20;
coin1.position.set(0,0,0);
coin1.castShadow = true;
coin1.receiveShadow = false;
scene.add( coin1 );

正如您在这里看到的,我只在所有面上应用了一种纹理。 但即使在帽子上,它也不是真正的展示,我只有一 block 完整的圆圈。 请帮忙,如果你不明白的话,我正在获得一枚硬币。 即使你只是给我一个教程的链接,我也会非常感激。 我找不到任何东西,而且我在 3D/OpenGL 编程方面的知识非常有限。 非常感谢。

最佳答案

[edit] 三缸不工作,因为 cap UVs 是伪造的。 您需要推出自己的上限几何形状。没有太多的工作,只是烦人。以下是如何制作带有自定义瓶盖的无盖气缸:

var coin_sides_geo =
  new THREE.CylinderGeometry( 10.0, 10.0, 1.0, 100.0, 10.0, true );
var coin_cap_geo = new THREE.Geometry();
var r = 10.0;
for (var i=0; i<100; i++) {
  var a = i * 1/100 * Math.PI * 2;
  var z = Math.sin(a);
  var x = Math.cos(a);
  var a1 = (i+1) * 1/100 * Math.PI * 2;
  var z1 = Math.sin(a1);
  var x1 = Math.cos(a1);
  coin_cap_geo.vertices.push(
    new THREE.Vertex(new THREE.Vector3(0, 0, 0)),
    new THREE.Vertex(new THREE.Vector3(x*r, 0, z*r)),
    new THREE.Vertex(new THREE.Vector3(x1*r, 0, z1*r))
  );
  coin_cap_geo.faceVertexUvs[0].push([
    new THREE.UV(0.5, 0.5),
    new THREE.UV(x/2+0.5, z/2+0.5),
    new THREE.UV(x1/2+0.5, z1/2+0.5)
  ]);
  coin_cap_geo.faces.push(new THREE.Face3(i*3, i*3+1, i*3+2));
}
coin_cap_geo.computeCentroids();
coin_cap_geo.computeFaceNormals();

var coin_sides_texture =
  THREE.ImageUtils.loadTexture("./coin_sides.png");
var coin_cap_texture =
  THREE.ImageUtils.loadTexture("./coin_face.png");

var coin_sides_mat =
  new THREE.MeshLambertMaterial({map:coin_sides_texture});
var coin_sides =
  new THREE.Mesh( coin_sides_geo, coin_sides_mat );

var coin_cap_mat = new THREE.MeshLambertMaterial({map:coin_cap_texture});
var coin_cap_top = new THREE.Mesh( coin_cap_geo, coin_cap_mat );
var coin_cap_bottom = new THREE.Mesh( coin_cap_geo, coin_cap_mat );
coin_cap_top.position.y = 0.5;
coin_cap_bottom.position.y = -0.5;
coin_cap_top.rotation.x = Math.PI;

var coin = new THREE.Object3D();
coin.add(coin_sides);
coin.add(coin_cap_top);
coin.add(coin_cap_bottom);

关于javascript - Three.js 中的圆柱体纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8315546/

相关文章:

javascript - 如何在选中复选框时使用纯 JavaScript 禁用文本框并清除值

javascript - Angular2 不起作用

html - CSS 布局 : Firefox vs. Chrome

opengl-es - 如何增加台面驱动程序的 GL_MAX_TEXTURE_SIZE?

javascript - WebGL 无效操作缓冲区大小不足

javascript - Three.js/WebGL - 透明平面将其他平面隐藏在它们后面

javascript - Webgl 纹理水平翻转

javascript - 返回 promise 时忽略 Ajax 失败?

jquery - html5 进度元素的动画背景颜色

javascript - 从边缘删除元素符号点