@react-three/cannon 挂钩将 matrixAutoUpdate 的值更改为 false
@react-three/cannon hooks changing value of matrixAutoUpdate to false
我在让相机跟随物体时遇到了一些困难。该对象正在使用来自 @react-three/cannon 的钩子 useSphere。我的球体移动得很好,但相机没有跟随。我将它缩小到我的球体位置没有被更新,因为 matrixAutoUpdate 被设置为 false。我不确定为什么会这样,因为在我测试过的其他 Cannon 示例中,matrixAutoUpdate 保持正确。任何想法都会很棒,我被困了一段时间,在互联网上找不到任何东西。下面是一些代码
import React from "react";
import {useFrame, useThree} from "@react-three/fiber";
import {useKeyboardControls} from "../hooks/useKeyboardControls";
import {FPVControls} from "./FPVControls";
import {Vector3} from "three";
import {useSphere} from "@react-three/cannon";
const SPEED = 6
export const Player = (props) => {
const {camera} = useThree()
//sphere movement controls
const {
moveForward,
moveBackward,
moveLeft,
moveRight,
jump
} = useKeyboardControls()
const [ref, api] = useSphere(() => ({
mass: 1,
type: 'Dynamic',
...props
}))
useFrame(() => {
camera.position.copy(ref.current.position)
const direction = new Vector3()
const frontVector = new Vector3(
0,
0,
(moveBackward ? 1 : 0) - (moveForward ? 1 : 0)
)
const sideVector = new Vector3(
(moveLeft ? 1 : 0) - (moveRight ? 1 : 0),
0,
0
)
direction
.subVectors(frontVector, sideVector)
.normalize()
.multiplyScalar(SPEED)
.applyEuler(camera.rotation)
api.velocity.set(direction.x, 0, direction.z)
})
console.log("ref position", ref)
return (
<>
<FPVControls/>
<mesh ref={ref}>
<sphereGeometry />
<meshStandardMaterial color={"#f30707"} />
</mesh>
</>
)
}
我发现这对类似的问题很有帮助也许它可以帮助你:
a conversation about a similar issue
这个类似的问题是关于一个位置没有被使用 cannon hooks 更新,关键是订阅 api 位置并将其存储在我理解的 ref 中。
这里有一个AI组件中更精确的例子(第69行,你可以在第79行找到ref):
我在让相机跟随物体时遇到了一些困难。该对象正在使用来自 @react-three/cannon 的钩子 useSphere。我的球体移动得很好,但相机没有跟随。我将它缩小到我的球体位置没有被更新,因为 matrixAutoUpdate 被设置为 false。我不确定为什么会这样,因为在我测试过的其他 Cannon 示例中,matrixAutoUpdate 保持正确。任何想法都会很棒,我被困了一段时间,在互联网上找不到任何东西。下面是一些代码
import React from "react";
import {useFrame, useThree} from "@react-three/fiber";
import {useKeyboardControls} from "../hooks/useKeyboardControls";
import {FPVControls} from "./FPVControls";
import {Vector3} from "three";
import {useSphere} from "@react-three/cannon";
const SPEED = 6
export const Player = (props) => {
const {camera} = useThree()
//sphere movement controls
const {
moveForward,
moveBackward,
moveLeft,
moveRight,
jump
} = useKeyboardControls()
const [ref, api] = useSphere(() => ({
mass: 1,
type: 'Dynamic',
...props
}))
useFrame(() => {
camera.position.copy(ref.current.position)
const direction = new Vector3()
const frontVector = new Vector3(
0,
0,
(moveBackward ? 1 : 0) - (moveForward ? 1 : 0)
)
const sideVector = new Vector3(
(moveLeft ? 1 : 0) - (moveRight ? 1 : 0),
0,
0
)
direction
.subVectors(frontVector, sideVector)
.normalize()
.multiplyScalar(SPEED)
.applyEuler(camera.rotation)
api.velocity.set(direction.x, 0, direction.z)
})
console.log("ref position", ref)
return (
<>
<FPVControls/>
<mesh ref={ref}>
<sphereGeometry />
<meshStandardMaterial color={"#f30707"} />
</mesh>
</>
)
}
我发现这对类似的问题很有帮助也许它可以帮助你:
a conversation about a similar issue
这个类似的问题是关于一个位置没有被使用 cannon hooks 更新,关键是订阅 api 位置并将其存储在我理解的 ref 中。
这里有一个AI组件中更精确的例子(第69行,你可以在第79行找到ref):