Pregunta

Estoy cuidando esto por mucho tiempo. Simplemente no puedo encontrar ninguna solución, en ningún lado. Estoy tratando de aplicar 3 texturas diferentes en un cilindro (2 tapas y laterales), pero no tengo absolutamente ninguna idea de cómo lograr esto. ¿Puedes orientarme? Esto es lo que estoy haciendo por ahora:

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

Como puede ver aquí, solo aplico una textura en todas las caras. Pero incluso en las gorras, no se muestra realmente, solo tengo una pieza del círculo completo. Por favor, ayuda, estoy logrando una moneda, si no lo descubriste. Incluso si solo me das un enlace a un tutorial, sería realmente gracias. No puedo encontrar nada, y mi conocimiento en la programación 3D/OpenGL es bastante limitado. Muchas gracias.

¿Fue útil?

Solución

Editar] Tres cilindros no funcionaron ya que los UV de Cap son falsos. Necesitas enrollar tu propia gorra geometrías. No mucho trabajo, solo molesto. Aquí le mostramos cómo hacer un cilindro sin límite con tapas personalizadas:

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

Otros consejos

Variante de la función TypeScript, que crea Object3D con 3 mallas: lado, Topcap y Bottom -Cap.
Funciona con la versión lib:
"Tres": "0.102.1"

 import capTop from './textures/capTopTexture.png';
 import capBottom from './textures/capBottomTexture.png';
 import capSide from './textures/sideTexture.png';

 function createCylinder (
        radiusTop: number,
        radiusBottom: number,
        height: number,
        radialSegments: number,
        heightSegments: number,
    ): Object3D {
        const cylinder = new THREE.Object3D();

        const sidesGeo = new THREE.CylinderGeometry(
            radiusTop,
            radiusBottom,
            height,
            radialSegments,
            heightSegments,
            true,
        );
        const sideTexture = new THREE.TextureLoader().load(capSide, this.reRender);
        const sidesMat =
            new THREE.MeshLambertMaterial({map: sideTexture});
        const sidesMesh =
            new THREE.Mesh( sidesGeo, sidesMat );
        cylinder.add(sidesMesh);

        const capTopGeo = new THREE.CircleGeometry(radiusTop, radialSegments);
        const capTopTexture = new THREE.TextureLoader().load(capTop, this.reRender);
        const capTopMat =
            new THREE.MeshLambertMaterial({map: capTopTexture});
        const capTopMesh =
            new THREE.Mesh( capTopGeo, capTopMat );
        capTopMesh.position.y = height / 2;
        capTopMesh.rotation.x = - Math.PI / 2;
        cylinder.add(capTopMesh);

        const capBottomGeo = new THREE.CircleGeometry(radiusBottom, radialSegments);
        const capBottomTexture = new THREE.TextureLoader().load(capBottom, this.reRender);
        const capBottomMat =
            new THREE.MeshLambertMaterial({map: capBottomTexture});
        const capBottomMesh =
            new THREE.Mesh( capBottomGeo, capBottomMat );
        capBottomMesh.position.y = -height / 2;
        capBottomMesh.rotation.x = Math.PI / 2;
        cylinder.add(capBottomMesh);

        return cylinder;
    };


Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top