Three.js-模型无法接收任何阴影

可爱的羊角面包

我目前是新手,正在学习three.js。我一直在用react-three-fiberReact实现它,但是我偶然发现了一个问题。但是,该模型无法从其他模型接收任何阴影。我尝试过使用父对象和子对象上的接收阴影模型对象obj.castShadow = true以及obj.receiveShadow = true其中之一,但是显示没有区别。有什么办法给另一个模型蒙上阴影吗?

和阴影..似乎很粗糙。有什么方法可以使它平滑吗?

1个

这是我的沙箱:https :
//codesandbox.io/s/modest-newton-np1sw

码:

import React, { Suspense, useMemo, useState } from "react";
import { Canvas } from "react-three-fiber";
import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader";
import { OrbitControls} from "drei";
import { Mesh } from "three";

import billboard from "../assets/models/billboard.obj";
import bridge from "../assets/models/bridge.obj";

const Model = ({ modelPath }) => {
  const [obj, setObj] = useState();
  useMemo(() => new OBJLoader().load(modelPath, setObj), [modelPath]);
  if (obj) {
    obj.castShadow = true;
    obj.traverse((children) => {
      if (children instanceof Mesh) {
        children.castShadow = true;
      }
    });
  }
  return obj ? <primitive object={obj} /> : null;
};

const ShadowedModel = ({ modelPath }) => {
  const [obj, setObj] = useState();
  useMemo(() => new OBJLoader().load(modelPath, setObj), [modelPath]);
  if (obj) {
    obj.castShadow = true;
    obj.receiveShadow = true;
    obj.traverse((children) => {
      if (children instanceof Mesh) {
        children.castShadow = true;
        children.receiveShadow = true;
      }
    });
  }
  return obj ? <primitive object={obj} /> : null;
};

const Lights = () => {
  return (
    <>
      <ambientLight intensity={0.1} />
      <spotLight
        castShadow
        position={[-50, 50, 20]}
        intensity={0.5}
        shadow-mapSize-shadowMapWidth={2048}
        shadow-mapSize-shadowMapHeight={2048}
        shadow-camera-left={-50}
        shadow-camera-right={50}
        shadow-camera-top={-50}
        shadow-camera-bottom={50}
      />
      <pointLight position={[10, -10, -20]} intensity={0.3} />
      <pointLight position={[0, 10, 5]} intensity={0.3} />
      <spotLight intensity={1} position={[0, 1000, 0]} />
    </>
  );
};

const Billboard = () => {
  return (
    <mesh
      castShadow
      position={[-15, 5, -35]}
      scale={[0.05, 0.05, 0.05]}
      rotation={[0, 20, 0]}
    >
      <Model modelPath={billboard} />
    </mesh>
  );
};

const Bridge = () => {
  return (
    <mesh
      castShadow
      receiveShadow
      position={[10, -40, -80]}
      // position={[-80, -40, -150]}
      scale={[0.15, 0.15, 0.15]}
      rotation={[0, 10.2, 0]}
    >
      <ShadowedModel modelPath={bridge} />
    </mesh>
  );
};

const Shadow = () => {
  return (
    <group>
      <mesh
        receiveShadow
        rotation={[-Math.PI / 2, 0, 0]}
        position={[-20, -32, -40]}
      >
        <planeBufferGeometry attach="geometry" args={[500, 500]} />
        <meshLambertMaterial attach="material" color={"lightblue"} />
      </mesh>
    </group>
  );
};

const MegatronModel = () => {
  return (
    <>
      <Canvas
        shadowMap
        colorManagement
        camera={{ position: [0, 0, 5], fov: 60 }}
      >
        <OrbitControls
          enablePan={Boolean("Pan", true)}
          enableZoom={Boolean("Zoom", true)}
          enableRotate={Boolean("Rotate", true)}
        />
        <Shadow />
        <Suspense fallback={null}>
          <Bridge />
        </Suspense>
        <Billboard />
        <Lights />
      </Canvas>
    </>
  );
};

export default MegatronModel;

任何帮助,将不胜感激。
非常感谢你。

马奎佐

您的模型确实存在阴影。问题在于,您有几个PointLight全强度的s将所有东西冲洗成白色。甚至阴影区域也被吹成白色。看到这里,我禁用了所有PointLight,只保留了聚光灯和环境光,以便您可以再次看到阴影:

在此处输入图片说明

我建议您使用尽可能少的光源,以减少渲染的资源消耗。添加如此多的灯可能会降低帧速率,使笔记本电脑过热并消耗更多手机电池。对于一个非常逼真的照明设置,我喜欢使用单半球灯和定向灯,如本演示中所示半球使人感觉好像大气层的光线来自顶部,反射的地面光来自底部。

就像素化阴影而言,您使用的是2048x2048大型地图,但它分布在太大的区域。我看到您正在尝试设置left, right, top, bottom距离,但是这些距离仅适用于使用正交摄影机的DirectionalLight左,右,顶部和底部属性不适用于使用透视相机的SpotLight。如果要缩小Spotlight阴影贴图,请使用.angle属性

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章