加载大量 .obj 三纤维和 React 时出现问题

发布于 2025-01-12 05:35:36 字数 3089 浏览 4 评论 0原文

我正在尝试在三纤维和反应(@react-三/纤维)中创建一个由六边形组成的星球。我设法生成了 N 个六边形,每个六边形存储在 React 应用程序内的文件夹(/src 文件夹中)中的一个单独的 .obj 文件(当前名称为 0 到 4001)中。我像这样加载它们:

const obj = useLoader(OBJLoader, require('./planetParts/' + fileID + '.obj'));

    const geometry = useMemo(() => {
        let g;
        obj.traverse((c) => {
            if (c.type === "Mesh")
                g = c.geometry;
        });
        return g;
    }, [obj]);

const edges = useMemo(() => new THREE.EdgesGeometry(geometry, 15), [geometry])

    const color = isOwnedByMe ? myLandColor() : isOwnedByOther ? getOwnedColor() : getNotOwnedColor();

    return (
        <group>

            <mesh
                ref={ref}
                geometry={geometry}
                onClick={() => selectPlot(fileID)}
                onPointerOver={() => setIsHovered(true)}
                onPointerOut={() => setIsHovered(false)}
            >
                <meshBasicMaterial
                    color={!isHovered ? color : getHoverColor()}
                    opacity={!isHovered ? 0.05 : 0.3}
                    // opacity={1}
                    transparent={true}
                    toneMapped={false}
                />
            </mesh>

            <lineSegments geometry={edges} renderOrder={1}>
                <lineBasicMaterial
                    color={isOwnedByMe ? myLandColor() : new THREE.Color('rgb(0,0,0)')}
                    opacity={isOwnedByMe ? getOwnOpacityLinesHexagon() : getOpacityLinesHexagons()}
                    transparent={true}
                />
            </lineSegments>
        </group>
    );

我在 chrome 浏览器上看到了奇怪的行为。当我加载六边形时,有时会收到有关资源不足的错误 (net::ERR_INSUFFICIENT_RESOURCES),然后出现有关无法加载某些特定 .obj 文件(从 2700+ 到 4000)的错误。

我认为这是我加载的大量文件的原因。因此,我将它们分成 500 个块,如下面的代码,但仍然出现相同的错误。有人可以帮助我提供一种机制或解决方案来加载这么多文件,也许是异步的吗?在 Firefox 和 Safari 上,我没有看到同样的问题。它们按照预期完美加载。

块的代码:

const chunk1 = useRef(<ChunkHexagons startFrom={0} endAt={501} />);
const chunk2 = useRef(<ChunkHexagons startFrom={501} endAt={1001} />);
const chunk3 = useRef(<ChunkHexagons startFrom={1001} endAt={1501} />);
const chunk4 = useRef(<ChunkHexagons startFrom={1501} endAt={2001} />);
const chunk5 = useRef(<ChunkHexagons startFrom={2001} endAt={2501} />);
const chunk6 = useRef(<ChunkHexagons startFrom={2501} endAt={3001} />);
const chunk7 = useRef(<ChunkHexagons startFrom={3001} endAt={3501} />);
const chunk8 = useRef(<ChunkHexagons startFrom={3501} endAt={4001} />);
const chunk9 = useRef(<ChunkHexagons startFrom={4000} endAt={tilesSize()} />);

return (
    <Suspense fallback={null}>
        <group ref={ref}>
            {chunk1.current}
            {chunk2.current}
            {chunk3.current}
            {chunk4.current}
            {chunk5.current}
            {chunk6.current}
            {chunk7.current}
            {chunk8.current}
            {chunk9.current}
        </group>
    </Suspense>
);

I am trying to create a planet made out of hexagons within Three Fiber and React (@react-three/fiber). I managed to generate N numbers of hexagons, each stored in a separate .obj file (named from 0 to 4001, currently) on a folder inside the react app (in /src folder). I load them like this:

const obj = useLoader(OBJLoader, require('./planetParts/' + fileID + '.obj'));

    const geometry = useMemo(() => {
        let g;
        obj.traverse((c) => {
            if (c.type === "Mesh")
                g = c.geometry;
        });
        return g;
    }, [obj]);

const edges = useMemo(() => new THREE.EdgesGeometry(geometry, 15), [geometry])

    const color = isOwnedByMe ? myLandColor() : isOwnedByOther ? getOwnedColor() : getNotOwnedColor();

    return (
        <group>

            <mesh
                ref={ref}
                geometry={geometry}
                onClick={() => selectPlot(fileID)}
                onPointerOver={() => setIsHovered(true)}
                onPointerOut={() => setIsHovered(false)}
            >
                <meshBasicMaterial
                    color={!isHovered ? color : getHoverColor()}
                    opacity={!isHovered ? 0.05 : 0.3}
                    // opacity={1}
                    transparent={true}
                    toneMapped={false}
                />
            </mesh>

            <lineSegments geometry={edges} renderOrder={1}>
                <lineBasicMaterial
                    color={isOwnedByMe ? myLandColor() : new THREE.Color('rgb(0,0,0)')}
                    opacity={isOwnedByMe ? getOwnOpacityLinesHexagon() : getOpacityLinesHexagons()}
                    transparent={true}
                />
            </lineSegments>
        </group>
    );

I have seen a weird behaviour on the chrome browser. When I am loading the hexagons, sometimes, I get an error about insufficient resources (net::ERR_INSUFFICIENT_RESOURCES) and then about not being possible to load some certain .obj files (from 2700+ to 4000).

I think that it is the large number of files that I load. Therefore, I split them into chunks of 500 like the code below, but still the same error. Can someone help me out with a mechanism or a solution to load that much of files, maybe with something async? On Firefox and Safari, I have not seen the same issue. They load perfectly, as intended.

The code for chunks:

const chunk1 = useRef(<ChunkHexagons startFrom={0} endAt={501} />);
const chunk2 = useRef(<ChunkHexagons startFrom={501} endAt={1001} />);
const chunk3 = useRef(<ChunkHexagons startFrom={1001} endAt={1501} />);
const chunk4 = useRef(<ChunkHexagons startFrom={1501} endAt={2001} />);
const chunk5 = useRef(<ChunkHexagons startFrom={2001} endAt={2501} />);
const chunk6 = useRef(<ChunkHexagons startFrom={2501} endAt={3001} />);
const chunk7 = useRef(<ChunkHexagons startFrom={3001} endAt={3501} />);
const chunk8 = useRef(<ChunkHexagons startFrom={3501} endAt={4001} />);
const chunk9 = useRef(<ChunkHexagons startFrom={4000} endAt={tilesSize()} />);

return (
    <Suspense fallback={null}>
        <group ref={ref}>
            {chunk1.current}
            {chunk2.current}
            {chunk3.current}
            {chunk4.current}
            {chunk5.current}
            {chunk6.current}
            {chunk7.current}
            {chunk8.current}
            {chunk9.current}
        </group>
    </Suspense>
);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文