diff --git a/src/components/InteractiveObjects/GenericObject.vue b/src/components/InteractiveObjects/GenericObject.vue index cf2fa39..89e5d1c 100644 --- a/src/components/InteractiveObjects/GenericObject.vue +++ b/src/components/InteractiveObjects/GenericObject.vue @@ -3,7 +3,7 @@ - +
{{ modelValue.title }}
diff --git a/src/lib/CharacterControls.js b/src/lib/CharacterControls.js index adb168a..3204726 100644 --- a/src/lib/CharacterControls.js +++ b/src/lib/CharacterControls.js @@ -2,13 +2,18 @@ import * as THREE from 'three' import { QueryFilterFlags } from '@dimforge/rapier3d'; export class CharacterControls { - - // temporary data walkDirection = new THREE.Vector3() rotateAngle = new THREE.Vector3(0, 1, 0) - rotateQuarternion = new THREE.Quaternion() - cameraTarget = new THREE.Vector3() cameraY = 3 + #cameraZ = 5 + + get cameraZ(){ + return this.#cameraZ; + } + + set cameraZ(v){ + this.#cameraZ = Math.min(Math.max(v, 2), 10); + } // constants fadeDuration = 0.2 @@ -39,7 +44,6 @@ export class CharacterControls { this.orbitControl = engine.orbitControls this.camera = engine.camera - //this.updateCameraTarget(new THREE.Vector3(0,1,5)) this.direction = this.model.rotation.y; this.directionVelocity = 0; @@ -149,9 +153,9 @@ export class CharacterControls { let cameraPosition = new THREE.Vector3().copy(this.camera.position) let cameraDesiredPosition = new THREE.Vector3( - this.model.position.x + 5* Math.sin(this.model.rotation.y + Math.PI + this.cameraDelta + this.cameraIdleDelta), + this.model.position.x + this.#cameraZ* Math.sin(this.model.rotation.y + Math.PI + this.cameraDelta + this.cameraIdleDelta), this.cameraY, - this.model.position.z + 5* Math.cos(this.model.rotation.y + Math.PI + this.cameraDelta + this.cameraIdleDelta) + this.model.position.z + this.#cameraZ* Math.cos(this.model.rotation.y + Math.PI + this.cameraDelta + this.cameraIdleDelta) ) cameraPosition.lerp(cameraDesiredPosition, delta*2) diff --git a/src/lib/GameEngine.js b/src/lib/GameEngine.js index 59ec452..dc9c2ad 100644 --- a/src/lib/GameEngine.js +++ b/src/lib/GameEngine.js @@ -170,10 +170,14 @@ class GameEngine extends THREE.EventDispatcher{ scene.background = new THREE.Color(1, 1, 1); //console.log('GameEngine started') renderer.domElement.addEventListener('wheel', (event) => { - gameEngine.camera.zoom -= event.deltaY / 1000; - gameEngine.camera.zoom = Math.max(gameEngine.camera.zoom, .4); - controls.rotateSpeed = 1 / gameEngine.camera.zoom; - gameEngine.camera.updateProjectionMatrix(); + if (gameEngine.hero){ + gameEngine.hero.characterControls.cameraZ += event.deltaY / 33; + }else{ + gameEngine.camera.zoom -= event.deltaY / 1000; + gameEngine.camera.zoom = Math.max(gameEngine.camera.zoom, .4); + controls.rotateSpeed = 1 / gameEngine.camera.zoom; + gameEngine.camera.updateProjectionMatrix(); + } }) await this.initPhysics(); diff --git a/src/lib/Physics.js b/src/lib/Physics.js index 0a59e96..4263c86 100644 --- a/src/lib/Physics.js +++ b/src/lib/Physics.js @@ -1,4 +1,5 @@ import * as RAPIER from '@dimforge/rapier3d' +import { Vector3 } from 'three'; class Physics{ constructor(engine){ this.engine = engine @@ -51,10 +52,20 @@ class Physics{ break default:{ - colliderDesc = RAPIER.ColliderDesc.trimesh( - mesh.geometry.attributes.position.array, - mesh.geometry.index?.array - ) + const vertices = []; + const vertex = new Vector3(); + const position = mesh.geometry.getAttribute( 'position' ); + for ( let i = 0; i < position.count; i ++ ) { + vertex.fromBufferAttribute( position, i ); + vertices.push( vertex.x, vertex.y, vertex.z ); + } + + // if the buffer is non-indexed, generate an index buffer + const indices = mesh.geometry.getIndex() === null + ? Uint32Array.from( Array( parseInt( vertices.length / 3 ) ).keys() ) + : mesh.geometry.getIndex().array; + + colliderDesc = RAPIER.ColliderDesc.trimesh( vertices, indices ); } break }