通过更改对象在 useFrame 中的位置来移动对象不起作用
Moving an object by changing its position in useFrame does not work
我有如下代码。虽然我用每一帧更新球体位置 (useFrame),但它并没有反映在我的场景中。谁能帮我理解为什么它不起作用。
PS:我是新手,正在尝试快速证明概念。
function Marble() {
const controls = useControls()
const [sphereRef, sphereApi] = useSphere(() => ({
type: "Dynamic",
mass: 1,
position: [0, 2, 0]
}));
//sphereApi.position.set([0,0,0])
//console.log("SHM sphereAPI position", sphereRef.current.position);
useFrame(() => {
const { forward, backward, left, right, brake, reset } = controls.current
if (forward == true) {
console.log("sphereRef position", sphereRef.current.position);
console.log("sphereAPI position", sphereApi.position);
//console.log("model position", model.current.position)
// sphereApi.velocity.set(2,2,2);
sphereApi.position.set(5,0,0)
// sphereRef.current.position.set(5,0,0);
}
})
return (
<mesh ref={sphereRef} castShadow>
<sphereBufferGeometry attach="geometry" args={[1, 32, 32]}></sphereBufferGeometry>
<meshStandardMaterial color="white" />
</mesh>
);
})
(网上看:Stackblitz)
在每一帧上执行 sphereApi.position.set(5,0,0)
,只需在每一帧上将球体位置设置为 x=5
。
所以你应该先创建一个状态来存储x位置,然后在每一帧更新它到+=5
,然后将球体位置设置到它:
const [sphereX, setSphereX] = useState(0);
useFrame(() => {
setSphereX((sphereX) => sphereX + 0.05); // set state x position to +0.05 (5 is fast)
sphereApi.position.set(sphereX, 0, 0); // apply the state to the sphere position
});
还要确保使用allowSleep={false}
,因为直接改变位置不是物理运动,所以物理场景可能会睡眠。
在线:Stackblitz
我有如下代码。虽然我用每一帧更新球体位置 (useFrame),但它并没有反映在我的场景中。谁能帮我理解为什么它不起作用。
PS:我是新手,正在尝试快速证明概念。
function Marble() {
const controls = useControls()
const [sphereRef, sphereApi] = useSphere(() => ({
type: "Dynamic",
mass: 1,
position: [0, 2, 0]
}));
//sphereApi.position.set([0,0,0])
//console.log("SHM sphereAPI position", sphereRef.current.position);
useFrame(() => {
const { forward, backward, left, right, brake, reset } = controls.current
if (forward == true) {
console.log("sphereRef position", sphereRef.current.position);
console.log("sphereAPI position", sphereApi.position);
//console.log("model position", model.current.position)
// sphereApi.velocity.set(2,2,2);
sphereApi.position.set(5,0,0)
// sphereRef.current.position.set(5,0,0);
}
})
return (
<mesh ref={sphereRef} castShadow>
<sphereBufferGeometry attach="geometry" args={[1, 32, 32]}></sphereBufferGeometry>
<meshStandardMaterial color="white" />
</mesh>
);
})
(网上看:Stackblitz)
在每一帧上执行 sphereApi.position.set(5,0,0)
,只需在每一帧上将球体位置设置为 x=5
。
所以你应该先创建一个状态来存储x位置,然后在每一帧更新它到+=5
,然后将球体位置设置到它:
const [sphereX, setSphereX] = useState(0);
useFrame(() => {
setSphereX((sphereX) => sphereX + 0.05); // set state x position to +0.05 (5 is fast)
sphereApi.position.set(sphereX, 0, 0); // apply the state to the sphere position
});
还要确保使用allowSleep={false}
,因为直接改变位置不是物理运动,所以物理场景可能会睡眠。
在线:Stackblitz