Cómo crear una pelota de rugby 3D con 2 imágenes diferentes en sus caras

Crear una pelota de rugby 3D utilizando ThreeJS y RTF puede ser un desafío, especialmente cuando se trata de aplicar diferentes imágenes en las caras de la esfera. A continuación, resumiremos los problemas comunes y proporcionaremos una solución para crear una pelota de rugby con imágenes específicas en caras adyacentes.

Problemas comunes

  1. Aplicación de materiales: Muchos desarrolladores encuentran dificultades al tratar de aplicar múltiples materiales a la geometría de la esfera.
  2. Visualización de imágenes: Las imágenes no se muestran correctamente en las diferentes caras de la pelota, lo que puede deberse a la falta de grupos definidos en la geometría.
  3. Configuración de geometría: La configuración inadecuada de la geometría puede llevar a que los materiales no se distribuyan correctamente.

Solución

Para crear una pelota de rugby 3D con dos imágenes diferentes en caras adyacentes, puedes seguir el siguiente código de ejemplo. En este código, se definen dos materiales diferentes para las imágenes y se asocia cada material a un grupo específico dentro de la geometría de la esfera.

import React, { Suspense } from "react";
import { Canvas, useLoader } from "@react-three/fiber";
import { OrbitControls, useProgress, Html } from "@react-three/drei";
import * as THREE from "three";

const RugbyBall: React.FC = () => {
  // Cargar texturas
  const one = useLoader(THREE.TextureLoader, "/images/one.jpg");
  const two = useLoader(THREE.TextureLoader, "/images/two.jpg");
  const texture = useLoader(THREE.TextureLoader, "/images/texture.jpg");

  // Crear materiales
  const oneMaterial = new THREE.MeshPhysicalMaterial({
    map: one,
    bumpMap: texture,
    bumpScale: 1,
    roughness: 1,
    metalness: 0,
  });

  const twoMaterial = new THREE.MeshPhysicalMaterial({
    map: two,
    bumpMap: texture,
    bumpScale: 1,
    roughness: 1,
    metalness: 0,
  });

  // Crear geometría de esfera
  const radius = 50;
  const widthSegments = 64;
  const heightSegments = 64;
  const sphereGeometry = new THREE.SphereGeometry(radius, widthSegments, heightSegments);

  // Escalar la esfera para darle forma de pelota de rugby
  sphereGeometry.scale(1, 1.8, 1);
  sphereGeometry.clearGroups();

  if (sphereGeometry.index && sphereGeometry.index.count) {
    const middle = Math.floor(sphereGeometry.index.count / 2);

    // Agrupar la geometría para aplicar materiales diferentes
    for (let i = 0; i < middle; i++) {
      sphereGeometry.addGroup(i * 3, 3, 0); // Aplicar el primer material
    }
    for (let i = middle; i < sphereGeometry.index.count; i++) {
      sphereGeometry.addGroup(i * 3, 3, 1); // Aplicar el segundo material
    }
  }

  // Crear el mesh y aplicar los materiales
  const materials = [oneMaterial, twoMaterial];
  const rugbyBall = new THREE.Mesh(sphereGeometry, materials);

  return <primitive object={rugbyBall} position={[0, 0, 0]} scale={2.5} rotation={[-(Math.PI / 2), 0, 0]} />;
};

const Loader = () => {
  const { progress } = useProgress();
  return <Html center>{Math.round(progress)}% cargado</Html>;
};

// Componente principal de la escena
const Scene = () => {
  return (
    <Canvas camera={{ position: [0, 0, 500], fov: 75 }} style={{ width: "100vw", height: "30vh", backgroundColor: "red" }}>
      <Suspense fallback={<Loader />}>
        <ambientLight intensity={1} />
        <directionalLight position={[0, 1, 0]} intensity={2} />
        <RugbyBall />
        <OrbitControls autoRotate autoRotateSpeed={2} enableDamping dampingFactor={0.1} />
      </Suspense>
    </Canvas>
  );
};

export default Scene;

Conclusión

Siguiendo el ejemplo anterior, puedes crear una pelota de rugby tridimensional con diferentes imágenes en sus caras. Asegúrate de revisar la asignación de grupos y la correcta carga de texturas para que imágenes aparezcan correctamente en su superficie. Este enfoque no solo soluciona los problemas más comunes, sino que también proporciona una base sólida para experimentar y personalizar más el modelo 3D según tus necesidades.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *