gpt4 book ai didi

javascript - 防止点击 React-Fiber Three.js 中的对象

转载 作者:行者123 更新时间:2023-12-04 17:08:45 25 4
gpt4 key购买 nike

这是我可以点击的平面立方体

到目前为止,这个问题的主要问题是当我只想单击鼠标悬停的平面时,单击平面会点击。我在 Three.js 平面上缺少什么?

我曾尝试在 three.js 中搜索与 collision 相关的内容,但到目前为止无济于事。

进一步研究,我认为与RayCasting有关?

import React, { useState, useRef } from "react";
import { OrbitControls, Plane } from "@react-three/drei";
import { Canvas, useFrame, useThree, extend } from "@react-three/fiber";
import styles from "../styles/game.module.css";
import { DoubleSide } from "three";

const Cell = (props) => {
const [hovered, hover] = useState(false);
const [checked, setChecked] = useState(false);

const colorStyle = () => {
if (hovered) return "hotpink";
if (checked) return "lightblue";
return "orange";
};
return (
<Plane
scale={1}
onClick={() => setChecked(!checked)}
onPointerEnter={() => hover(true)}
onPointerLeave={() => hover(false)}
position={props.position}
rotation={props.rotation}
>
<meshPhongMaterial side={DoubleSide} color={colorStyle()} />
</Plane>
);
};

const Cube = () => {
useFrame((state, delta) => {
});

return (
<>
{/* Back Face */}
<Cell position={[-1, 1, -1.5]} rotation={[0, 0, 0]} />
// other cells here

{/* Front Face */}
<Cell position={[-1, 1, 1.5]} rotation={[0, 0, 0]} />
// other cells here

{/* Left Face */}
<Cell position={[-1.5, 1, 1]} rotation={[0, Math.PI / 2, 0]} />
// other cells here

{/* Right Face */}
<Cell position={[1.5, 1, 1]} rotation={[0, Math.PI / 2, 0]} />
// other cells here

{/* Bottom Face */}
<Cell position={[1, -1.5, 1]} rotation={[Math.PI / 2, 0, 0]} />
// other cells here

{/* Top */}
<Cell position={[1, 1.5, 1]} rotation={[Math.PI / 2, 0, 0]} />
// other cells here
</>
);
};

const SceneItems = () => {
return (
<>
<OrbitControls minDistance={7.5} maxDistance={15} />
<ambientLight intensity={0.5} />
<spotLight position={[10, 15, 10]} angle={0.3} />
<Cube position={[1, 1, 1]} />
</>
);
};

const CompleteScene = () => {
return (
<div id={styles.scene}>
<Canvas>
<SceneItems />
</Canvas>
</div>
);
};

最佳答案

看来,要防止这种点击发生,我所需要做的就是将 event.stopPropagation() 添加到我的 Plane 上的事件监听器中。现在我不再点击 Plane


const Cell = (props) => {
const [hovered, hover] = useState(false);
const [checked, setChecked] = useState(false);

useCursor(hovered);

const colorStyle = () => {
if (hovered) return "hotpink";
if (checked) return "lightblue";
return "orange";
};
return (
<Plane
scale={1}
onClick={(e) => {
e.stopPropagation();
setChecked(!checked);
}}
onPointerEnter={(e) => {
e.stopPropagation();
hover(true);
}}
onPointerLeave={(e) => {
e.stopPropagation();
hover(false);
}}
position={props.position}
rotation={props.rotation}
>
<meshPhongMaterial side={DoubleSide} color={colorStyle()} />
</Plane>
);
};

此处有更多详细信息:https://docs.pmnd.rs/react-three-fiber/api/events#pointer-capture

关于javascript - 防止点击 React-Fiber Three.js 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69938046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com