mylingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
43 lines (35 loc) • 1.32 kB
text/typescript
import CharacterCamera from "../core/CharacterCamera"
import { Reactive } from "@lincode/reactivity"
import getWorldPosition from "../utils/getWorldPosition"
import getWorldQuaternion from "../utils/getWorldQuaternion"
import { onBeforeRender } from "../../events/onBeforeRender"
export default class FirstPersonCamera extends CharacterCamera {
public static componentName = "firstPersonCamera"
public constructor() {
super()
const cam = this.camera
this.watch(
onBeforeRender(() => {
cam.position.copy(getWorldPosition(this.object3d))
cam.quaternion.copy(getWorldQuaternion(this.object3d))
})
)
this.createEffect(() => {
const target = this.targetState.get()
const innerYSet = this.innerYSetState.get()
if (!target || !("height" in target) || innerYSet) return
super.innerY = target.height * 0.4
return () => {
super.innerY = 0
}
}, [this.targetState.get, this.innerYSetState.get])
}
private innerYSetState = new Reactive(false)
public override get innerY() {
return super.innerY
}
public override set innerY(val) {
super.innerY = val
this.innerYSetState.set(true)
}
}