Minor improvements to camera, effects and phantoms

master
Ian Mancini 4 years ago
parent 34f563f376
commit 61ab08e13c

@ -12,13 +12,18 @@ const Effects: React.FC = () => {
<EffectComposer> <EffectComposer>
<DepthOfField <DepthOfField
focusDistance={0} focusDistance={0}
focalLength={0.15} focalLength={0.55}
bokehScale={2.5} bokehScale={1.25}
width={window.innerWidth / 2} width={window.innerWidth / 2}
height={window.innerHeight / 2} height={window.innerHeight / 2}
/> />
<Vignette eskil={false} offset={0.1} darkness={0.8} /> <Vignette eskil={false} offset={0.1} darkness={0.8} />
<Bloom luminanceThreshold={0.7} luminanceSmoothing={0.5} height={300} opacity={3} /> <Bloom
luminanceThreshold={0.7}
luminanceSmoothing={0.5}
height={300}
opacity={2.2}
/>
</EffectComposer> </EffectComposer>
) )
} }

@ -1,5 +1,7 @@
// @ts-nocheck // @ts-nocheck
import React, { useEffect, useRef } from 'react' import React, { useEffect, useRef } from 'react'
import { extend } from 'react-three-fiber'
import { Vector3, Euler } from 'three'
import api, { Transform } from '../store' import api, { Transform } from '../store'
@ -19,7 +21,7 @@ const Phantom: React.FC<PhantomProps> = ({ id }) => {
} }
ref.current?.position.fromArray([ ref.current?.position.fromArray([
state.position[0], state.position[0],
state.position[1] + 1.25, state.position[1] + 0.25,
state.position[2], state.position[2],
]) ])
ref.current?.rotation.fromArray(state.rotation) ref.current?.rotation.fromArray(state.rotation)
@ -30,10 +32,21 @@ const Phantom: React.FC<PhantomProps> = ({ id }) => {
}, [ref.current]) }, [ref.current])
return ( return (
<mesh ref={ref}> <group ref={ref}>
<sphereBufferGeometry args={[1, 16, 16]} /> <mesh scale={new Vector3(0.5, 0.5, 0.5)}>
<sphereBufferGeometry />
<meshStandardMaterial color="hotpink" /> <meshStandardMaterial color="hotpink" />
<meshBasicMaterial color="white" emmisive="white" opacity={0.8} transparent />
</mesh> </mesh>
<mesh
scale={new Vector3(0.15, 0.15, 0.15)}
position={new Vector3(0, 0, -0.8)}
rotation={new Euler(-Math.PI / 2, 0, 0)}
>
<coneBufferGeometry args={[1, 2, 4]} />
<meshBasicMaterial color="yellow" emmisive="yellow" opacity={0.8} transparent />
</mesh>
</group>
) )
} }

@ -12,7 +12,11 @@ const keys: Record<string, string> = {
KeyS: 'backward', KeyS: 'backward',
KeyA: 'left', KeyA: 'left',
KeyD: 'right', KeyD: 'right',
ShiftLeft: 'running', ArrowUp: 'forward',
ArrowDown: 'backward',
ArrowLeft: 'left',
ArrowRight: 'right',
ShiftLeft: 'run',
Space: 'jump', Space: 'jump',
} }
const moveFieldByKey = (key: string) => keys[key] const moveFieldByKey = (key: string) => keys[key]
@ -26,15 +30,16 @@ const usePlayerControls = () => {
backward: false, backward: false,
left: false, left: false,
right: false, right: false,
running: false, run: false,
jump: false, jump: false,
}) })
useEffect(() => { useEffect(() => {
const handleKeyDown = (e: Event) => { const handleKeyDown = (e: Event) => {
setMovement((m) => ({ ...m, [moveFieldByKey(e.code)]: true })) setMovement((m) => ({ ...m, [moveFieldByKey(e.code)]: true }))
} }
const handleKeyUp = (e: Event) => const handleKeyUp = (e: Event) => {
setMovement((m) => ({ ...m, [moveFieldByKey(e.code)]: false })) setMovement((m) => ({ ...m, [moveFieldByKey(e.code)]: false }))
}
document.addEventListener('keydown', handleKeyDown) document.addEventListener('keydown', handleKeyDown)
document.addEventListener('keyup', handleKeyUp) document.addEventListener('keyup', handleKeyUp)
return () => { return () => {
@ -48,30 +53,32 @@ const usePlayerControls = () => {
// TODO Improve physics in player // TODO Improve physics in player
const Player = (props: SphereProps) => { const Player = (props: SphereProps) => {
const socket = useStore((state) => state.socket) const socket = useStore((state) => state.socket)
const { forward, backward, left, right, running } = usePlayerControls() const pointerLocked = useStore((state) => state.pointerLocked)
const { forward, backward, left, right, run } = usePlayerControls()
const { camera } = useThree() const { camera } = useThree()
const [ref, api] = useSphere(() => ({ const [ref, api] = useSphere(() => ({
type: 'Dynamic', type: 'Dynamic',
fixedRotation: true, fixedRotation: true,
position: [0, 1.5, 0], position: [0, 2, 0],
args: 0.2, args: 1,
mass: 9, mass: 5,
linearDamping: 0, linearDamping: 0,
angularDamping: 0, angularDamping: 0,
material: { friction: 0, restitution: 0 }, material: { friction: 10, restitution: 0 },
...props, ...props,
})) }))
useEffect(() => { useEffect(() => {
const socketEmitTransformInterval = setInterval(() => { const socketEmitTransformInterval = setInterval(() => {
if (socket && ref.current && camera) { if (socket && ref.current && camera) {
const cameraRotation = camera.rotation.toArray()
socket.emit('transform', { socket.emit('transform', {
position: [ position: [
ref.current.position.x, ref.current.position.x,
ref.current.position.y, ref.current.position.y,
ref.current.position.z, ref.current.position.z,
], ],
rotation: [camera.rotation.x, camera.rotation.y, camera.rotation.z], rotation: [cameraRotation[0], cameraRotation[1], cameraRotation[2]],
}) })
} }
}, 16) }, 16)
@ -87,7 +94,7 @@ const Player = (props: SphereProps) => {
if (!ref.current) return if (!ref.current) return
camera.position.set( camera.position.set(
ref.current.position.x, ref.current.position.x,
ref.current.position.y + 1, ref.current.position.y + 0.4,
ref.current.position.z, ref.current.position.z,
) )
frontVector.set(0, 0, Number(backward) - Number(forward)) frontVector.set(0, 0, Number(backward) - Number(forward))
@ -95,10 +102,10 @@ const Player = (props: SphereProps) => {
direction direction
.subVectors(frontVector, sideVector) .subVectors(frontVector, sideVector)
.normalize() .normalize()
.multiplyScalar(running ? SPEED * 2 : SPEED) .multiplyScalar(run ? SPEED * 2 : SPEED)
.applyEuler(camera.rotation) .applyEuler(camera.rotation)
if (forward || backward || left || right) { if (pointerLocked && (forward || backward || left || right)) {
api.velocity.set(direction.x, -SPEED / 2, direction.z) api.velocity.set(direction.x, -SPEED / 2, direction.z)
} else { } else {
api.velocity.set(0, 0, 0) api.velocity.set(0, 0, 0)

@ -1,5 +1,6 @@
import React, { Suspense } from 'react' import React, { Suspense } from 'react'
import { Physics } from '@react-three/cannon' import { Physics } from '@react-three/cannon'
import { Stats } from '@react-three/drei'
import World from './models/World' import World from './models/World'
import WorldCollisions from './models/WorldCollisions' import WorldCollisions from './models/WorldCollisions'
@ -12,14 +13,18 @@ import Users from './Users'
const Scene: React.FC = () => { const Scene: React.FC = () => {
return ( return (
<> <>
<Stats />
<Lighting /> <Lighting />
<Suspense fallback={null}> <Suspense fallback={null}>
<World /> <World />
<Physics <Physics
gravity={[0, 0, 0]} gravity={[0, 0, 0]}
tolerance={0}
iterations={2} iterations={2}
size={2} size={2}
broadphase="SAP"
axisIndex={1}
defaultContactMaterial={{ defaultContactMaterial={{
friction: 0, friction: 0,
restitution: 0, restitution: 0,

@ -38,7 +38,15 @@ const Museo: React.FC = () => {
) : ( ) : (
<> <>
<MenuOverlay /> <MenuOverlay />
<Canvas colorManagement concurrent> <Canvas
colorManagement
concurrent
camera={{
fov: 45,
near: 0.25,
far: 200,
}}
>
<Scene /> <Scene />
</Canvas> </Canvas>
</> </>

Loading…
Cancel
Save