Add audio and obras with video projections

master
Ian Mancini 4 years ago
parent b744f1c545
commit b002521261

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -9,25 +9,25 @@ import Carolina from './models/obras/Carolina'
import Julian from './models/obras/Julian' import Julian from './models/obras/Julian'
import Mateo from './models/obras/Mateo' import Mateo from './models/obras/Mateo'
import Gaston from './models/obras/Gaston' import Gaston from './models/obras/Gaston'
// import Daniela from './models/obras/Daniela' import Daniela from './models/obras/Daniela'
// import Pedro from './models/obras/Pedro' import Pedro from './models/obras/Pedro'
// import DiegoGuido from './models/obras/DiegoGuido' import DiegoGuido from './models/obras/DiegoGuido'
const models: (JSX.Element | null)[] = [ const models: (JSX.Element | null)[] = [
null, // <Daniela />, <Daniela key="daniela" />, // <Daniela />,
null, // Juan cruz null, // Juan cruz
null, // Lucia cordoba null, // Lucia cordoba
null, // Camila null, // Camila
<Julieta />, <Julieta key="julieta" />,
null, // Lucia Novello null, // Lucia Novello
<Santiaga />, <Santiaga key="santiaga" />,
<Carolina />, <Carolina key="carolina" />,
null, // Edu null, // Edu
<Julian />, <Julian key="julian" />,
<Mateo />, <Mateo key="mateo" />,
<Gaston />, <Gaston key="gaston" />,
null, //<Pedro />, <Pedro key="pedro" />,
null, //<DiegoGuido />, <DiegoGuido key="diego_guido" />,
] ]
function ArtworkCollection(props: JSX.IntrinsicElements['group']) { function ArtworkCollection(props: JSX.IntrinsicElements['group']) {

@ -6,14 +6,14 @@ import ParkCollisions from './models/Park_collisions'
import StreetCollisions from './models/Street_collisions' import StreetCollisions from './models/Street_collisions'
import MuseumCollisions from './models/Museum_collisions' import MuseumCollisions from './models/Museum_collisions'
import EntranceCollsions from './models/Entrance_collisions' import EntranceCollsions from './models/Entrance_collisions'
import { Mesh, MeshBasicMaterial } from 'three' import { Mesh } from 'three'
const Model = forwardRef( const Model = forwardRef(
(props: JSX.IntrinsicElements['group'], ref: ForwardedRef<Mesh>) => { (props: JSX.IntrinsicElements['group'], ref: ForwardedRef<Mesh>) => {
const material = new MeshBasicMaterial({ // const material = new MeshBasicMaterial({
wireframe: true, // wireframe: true,
color: 0xffff00, // color: 0xffff00,
}) // })
return ( return (
<group ref={ref} {...props} dispose={null}> <group ref={ref} {...props} dispose={null}>
@ -26,4 +26,6 @@ const Model = forwardRef(
}, },
) )
Model.displayName = 'collisions'
export default Model export default Model

@ -14,7 +14,6 @@ const Controls: React.FC = () => {
const onLock = () => setPointerLockStatus(true) const onLock = () => setPointerLockStatus(true)
const onUnlock = () => { const onUnlock = () => {
setPointerLockStatus(false) setPointerLockStatus(false)
console.log('unlock')
} }
ref.current.addEventListener?.('lock', onLock) ref.current.addEventListener?.('lock', onLock)

@ -0,0 +1,36 @@
import React, { useEffect, useRef } from 'react'
import { PositionalAudio, Box } from '@react-three/drei'
import { PositionalAudio as PositionalAudioImpl } from 'three'
import useStore from '../store'
type Props = JSX.IntrinsicElements['positionalAudio'] & {
url: string
distance?: number
loop?: boolean
}
const ObraAudio: React.FC<Props> = ({ position, url, loop = true, ...props }) => {
const pointerLocked = useStore((state) => state.pointerLocked)
const audioRef = useRef<PositionalAudioImpl>()
useEffect(() => {
if (audioRef.current) {
if (!pointerLocked && audioRef.current.isPlaying) {
audioRef.current.pause()
} else if (pointerLocked && !audioRef.current.isPlaying) {
audioRef.current.play()
}
audioRef.current.setDirectionalCone(35, 60, 0.1)
audioRef.current.setRefDistance(0.5)
}
}, [audioRef.current, pointerLocked])
return (
<group rotation={[0, -Math.PI / 2, 0]} position={[14, 1.6, 0]}>
<PositionalAudio ref={audioRef} url={url} loop={loop} autoplay={false} {...props} />
</group>
)
}
export default ObraAudio

@ -1,6 +1,5 @@
// @ts-nocheck // @ts-nocheck
import React, { useEffect, useRef } from 'react' import React, { useEffect, useRef } from 'react'
import { Vector3, Euler } from 'three'
import Human from './models/Human' import Human from './models/Human'
import api, { Transform } from '../store' import api, { Transform } from '../store'

@ -144,7 +144,7 @@ const Player = () => {
const socketEmitTransformInterval = setInterval(() => { const socketEmitTransformInterval = setInterval(() => {
if (socket && groupRef.current && camera) { if (socket && groupRef.current && camera) {
const cameraRotation = camera.quaternion.toArray() const cameraRotation = camera.quaternion.toArray()
const [x, y, z] = direction.current.toArray() const [x, , z] = direction.current.toArray()
let anim = animations.idle let anim = animations.idle

@ -29,7 +29,6 @@ type ComputerProps = {
export default function Model(props: ComputerProps & JSX.IntrinsicElements['group']) { export default function Model(props: ComputerProps & JSX.IntrinsicElements['group']) {
const pointerLockControls = useStore((state) => state.pointerLockControls) const pointerLockControls = useStore((state) => state.pointerLockControls)
const setPointerLockStatus = useStore((state) => state.setPointerLockStatus)
const setModalObra = useStore((state) => state.setModalObra) const setModalObra = useStore((state) => state.setModalObra)
const group = useRef<THREE.Group>() const group = useRef<THREE.Group>()
@ -54,15 +53,17 @@ export default function Model(props: ComputerProps & JSX.IntrinsicElements['grou
ref={group} ref={group}
{...props} {...props}
dispose={null} dispose={null}
onPointerOver={(e) => { onPointerOver={() => {
setCurrentMaterial(true) setCurrentMaterial(true)
}} }}
onPointerOut={() => setCurrentMaterial(false)} onPointerOut={() => setCurrentMaterial(false)}
onClick={() => { onClick={() => {
setModalObra(props.obraId) if (pointerLockControls) {
setTimeout(() => { setModalObra(props.obraId)
pointerLockControls.unlock() setTimeout(() => {
}, 500) pointerLockControls.unlock?.()
}, 500)
}
}} }}
> >
<mesh material={materials.keyboard} geometry={nodes.computer_mesh.geometry} /> <mesh material={materials.keyboard} geometry={nodes.computer_mesh.geometry} />

@ -27,7 +27,7 @@ type GLTFResult = GLTF & {
export default function Model(props: JSX.IntrinsicElements['group']) { export default function Model(props: JSX.IntrinsicElements['group']) {
const group = useRef<THREE.Group>() const group = useRef<THREE.Group>()
const { scene, materials } = useGLTF('/model/entrance.glb') as GLTFResult const { scene } = useGLTF('/model/entrance.glb') as GLTFResult
return ( return (
<group ref={group} {...props} dispose={null}> <group ref={group} {...props} dispose={null}>
<primitive object={scene} dispose={null} matrixAutoUpdate={false} /> <primitive object={scene} dispose={null} matrixAutoUpdate={false} />

@ -14,8 +14,7 @@ import { FrontSide } from 'three/src/constants'
import { HEIGHT } from '../Player' import { HEIGHT } from '../Player'
import api, { State, Transform } from '../../store' import api, { Transform } from '../../store'
import { Color } from 'three/src/math/Color'
import { MeshNormalMaterial } from 'three/src/materials/MeshNormalMaterial' import { MeshNormalMaterial } from 'three/src/materials/MeshNormalMaterial'
import { Object3D } from 'three/src/core/Object3D' import { Object3D } from 'three/src/core/Object3D'
import { SkinnedMesh } from 'three/src/objects/SkinnedMesh' import { SkinnedMesh } from 'three/src/objects/SkinnedMesh'

@ -0,0 +1,14 @@
import * as THREE from 'three'
import Proyector from './Proyector'
import React, { useRef } from 'react'
import ObraAudio from '../../ObraAudio'
export default function Model(props: JSX.IntrinsicElements['group']) {
const group = useRef<THREE.Group>()
return (
<group ref={group} {...props} dispose={null}>
<Proyector videoSrc="/video/daniela.mp4" />
<ObraAudio url="/audio/daniela.ogg" loop distance={0.5} position={[1, 1, 1]} />
</group>
)
}

@ -0,0 +1,14 @@
import * as THREE from 'three'
import Proyector from './Proyector'
import React, { useRef } from 'react'
import ObraAudio from '../../ObraAudio'
export default function Model(props: JSX.IntrinsicElements['group']) {
const group = useRef<THREE.Group>()
return (
<group ref={group} {...props} dispose={null}>
<Proyector wide videoSrc="/video/diego_guido.mp4" />
<ObraAudio position={[0, 0, -10]} url="/audio/diego_guido.ogg" loop distance={2} />
</group>
)
}

@ -5,6 +5,7 @@ Auto-generated by: https://github.com/pmndrs/gltfjsx
import * as THREE from 'three' import * as THREE from 'three'
import React, { useRef } from 'react' import React, { useRef } from 'react'
import { useGLTF } from '@react-three/drei/useGLTF' import { useGLTF } from '@react-three/drei/useGLTF'
import ObraAudio from '../../ObraAudio'
import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader'
@ -23,6 +24,13 @@ export default function Model(props: JSX.IntrinsicElements['group']) {
return ( return (
<group ref={group} {...props} dispose={null} scale={[0.99, 0.99, 0.99]}> <group ref={group} {...props} dispose={null} scale={[0.99, 0.99, 0.99]}>
<mesh material={materials.gaston} geometry={nodes.logs002.geometry} /> <mesh material={materials.gaston} geometry={nodes.logs002.geometry} />
<ObraAudio position={[0, 0, 0]} url="/audio/gaston_base.ogg" loop distance={1} />
<ObraAudio
position={[0, 0, -7]}
url="/audio/gaston_movimiento.ogg"
loop
distance={0.2}
/>
</group> </group>
) )
} }

@ -0,0 +1,14 @@
import * as THREE from 'three'
import Proyector from './Proyector'
import React, { useRef } from 'react'
import ObraAudio from '../../ObraAudio'
export default function Model(props: JSX.IntrinsicElements['group']) {
const group = useRef<THREE.Group>()
return (
<group ref={group} {...props} dispose={null}>
<Proyector wide videoSrc="/video/sagasti.mp4" />
<ObraAudio url="/audio/sagasti.ogg" loop distance={2} />
</group>
)
}

@ -3,40 +3,89 @@ Auto-generated by: https://github.com/pmndrs/gltfjsx
*/ */
import * as THREE from 'three' import * as THREE from 'three'
import React, { useRef } from 'react' import React, { useRef, useEffect } from 'react'
import { useGLTF } from '@react-three/drei/useGLTF' import { useGLTF } from '@react-three/drei/useGLTF'
import {
Mesh,
Color,
MeshBasicMaterial,
MeshStandardMaterial,
VideoTexture,
DoubleSide,
} from 'three'
import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader' import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader'
type GLTFResult = GLTF & { type GLTFResult = GLTF & {
nodes: { nodes: {
Cube013: THREE.Mesh Cube013: Mesh
['Cube.013_1']: THREE.Mesh ['Cube.013_1']: Mesh
['Cube.013_2']: THREE.Mesh ['Cube.013_2']: Mesh
Cube001: THREE.Mesh
['Cube.001_1']: THREE.Mesh
['Cube.001_2']: THREE.Mesh
} }
materials: { materials: {
['VrHeadset cuerpo.002']: THREE.MeshStandardMaterial plastic: MeshStandardMaterial
['light.001']: THREE.MeshStandardMaterial projection_light: MeshStandardMaterial
['projection.001']: THREE.MeshStandardMaterial projection: MeshStandardMaterial
} }
} }
export default function Model(props: JSX.IntrinsicElements['group']) { export default function Model(
props: JSX.IntrinsicElements['group'] & { videoSrc: string; wide?: boolean },
) {
const { nodes, materials } = useGLTF(
`/model/obras/proyector${props.wide ? '_wide' : ''}.glb`,
) as GLTFResult
const group = useRef<THREE.Group>() const group = useRef<THREE.Group>()
const { nodes, materials } = useGLTF('/model/obras/proyector.glb') as GLTFResult const videoRef = useRef<HTMLVideoElement>(document.createElement('video'))
const projectionMaterial = useRef<MeshBasicMaterial>(
new MeshBasicMaterial({ color: new Color('white') }),
)
const videoTexture = useRef<VideoTexture>()
useEffect(() => {
if (videoRef.current && projectionMaterial) {
videoRef.current.src = props.videoSrc
videoRef.current.load()
videoRef.current.loop = true
videoRef.current.muted = true
videoRef.current.autoplay = true
videoRef.current.play()
videoTexture.current = new VideoTexture(videoRef.current)
projectionMaterial.current.map = videoTexture.current
projectionMaterial.current.needsUpdate = true
}
}, [videoRef.current, projectionMaterial.current])
return ( return (
<group ref={group} {...props} dispose={null}> <group ref={group} {...props} dispose={null}>
<group position={[-55.28, 2.67, 85.99]} rotation={[0, Math.PI / 2, 0]}> {!props.wide ? (
<mesh <>
material={materials['VrHeadset cuerpo.002']} <mesh material={materials.plastic} geometry={nodes.Cube013.geometry} />
geometry={nodes.Cube013.geometry} <mesh
/> material={materials.projection_light}
<mesh material={materials['light.001']} geometry={nodes['Cube.013_1'].geometry} /> geometry={nodes['Cube.013_1'].geometry}
<mesh />
material={materials['projection.001']} <mesh
geometry={nodes['Cube.013_2'].geometry} material={projectionMaterial.current}
/> geometry={nodes['Cube.013_2'].geometry}
</group> />
</>
) : (
<>
<mesh material={materials.plastic} geometry={nodes.Cube001.geometry} />
<mesh
material={materials.projection_light}
geometry={nodes['Cube.001_1'].geometry}
/>
<mesh
material={projectionMaterial.current}
geometry={nodes['Cube.001_2'].geometry}
/>
</>
)}
</group> </group>
) )
} }

@ -0,0 +1,36 @@
/*
Auto-generated by: https://github.com/pmndrs/gltfjsx
*/
import * as THREE from 'three'
import React, { useRef } from 'react'
import { useGLTF } from '@react-three/drei/useGLTF'
import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader'
type GLTFResult = GLTF & {
nodes: {
Cube001: THREE.Mesh
['Cube.001_1']: THREE.Mesh
['Cube.001_2']: THREE.Mesh
}
materials: {
plastic: THREE.MeshStandardMaterial
projection_light: THREE.MeshStandardMaterial
projection: THREE.MeshStandardMaterial
}
}
export default function Model(props: JSX.IntrinsicElements['group']) {
const group = useRef<THREE.Group>()
const { nodes, materials } = useGLTF('/proyector_wide.glb') as GLTFResult
return (
<group ref={group} {...props} dispose={null}>
<mesh material={materials.plastic} geometry={nodes.Cube001.geometry} />
<mesh material={materials.projection_light} geometry={nodes['Cube.001_1'].geometry} />
<mesh material={materials.projection} geometry={nodes['Cube.001_2'].geometry} />
</group>
)
}
useGLTF.preload('/proyector_wide.glb')

@ -46,7 +46,6 @@ const MenuOverlay: React.FC = () => {
pointerLockControls.lock?.() pointerLockControls.lock?.()
} }
} }
console.log(modalObra)
return ( return (
<> <>

Loading…
Cancel
Save