【发布时间】:2026-02-21 23:25:02
【问题描述】:
我想用水创建 3D 场景,就像这个例子中的 three.js shader ocean 或 water 但我必须在 react-three-fiber 库中创建它。我已经在互联网上搜索了这个案例的一些很好的工作示例,但没有结果。
我可以寻求帮助以弄清楚如何将上述示例实施到 react-three-fiber 方法中吗?
这是我目前所提到的水成分:
import React from "react";
import waterNormal from "./waternormals.jpg";
//import { useLoader } from "react-three-fiber";
import * as THREE from "three";
import { Water } from "three/examples/jsm/objects/Water.js";
const WaterObject = () => {
//const mapNormalWater = useLoader(TextureLoader, waterNormal);
return (
<mesh>
<planeBufferGeometry attach="geometry" args={[100, 100]} />
<Water
options={{
textureWidth: 512,
textureHeight: 512,
waterNormals: new THREE.TextureLoader().load(
waterNormal,
function (texture) {
texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
}
),
sunDirection: new THREE.Vector3(),
sunColor: 0xffffff,
waterColor: 0x001e0f,
distortionScale: 3.7,
// fog: scene.fog !== undefined
}}
></Water>
</mesh>
);
};
export default WaterObject ;
【问题讨论】:
-
三个 jsm 有一个水着色器 codesandbox.io/s/water-shader-1b40u 但它在 srgb 中坏了所以颜色很糟糕
-
ps。我没看错,你已经在尝试使用同样的东西了。所以,你不能像那样把任何东西都转储到 jsx 中。 jsx 用于组件(大写)和原生元素(网格、材质……)。如果你有第三方三类并且你想在 jsx 中使用它,你必须使用扩展函数,就像我发布的框中一样。
-
你知道怎么做吗?我遇到了一个问题,它告诉我 Water 不是有效的 jsx 元素。 @hpalu 我查看了另一个使用
extend({ Water });的示例,但仍然没有弄清楚它实际上在做什么。我在这里问了一个类似的问题:*.com/questions/70642162/… -
codesandbox.io/s/… 我发现这个例子很好地解释了
extend(以及为什么<Water>变成<water>,但它仍然无法正常工作:( -
@timhc22 关于为什么
更改为 我认为它与类有关(如果我错了,请有人纠正我)。 Water 是 Class(第一个大写字母),您不能将它用作 JSX 元素,但是当您使用 extend 时,它会创建一个对象实例,并且可以在此处用作标准 JSX 元素,您可以在此处找到此组件 github.com/pmndrs/react-three-fiber/blob/master/packages/fiber/…。当您编写自定义着色器示例时也会发生同样的事情:codesandbox.io/s/shadermaterials-1g4qq?file=/src/App.js:721-738
标签: javascript reactjs three.js shader react-three-fiber