mirror of
https://github.com/anatolykopyl/vue-three-d-mockup.git
synced 2026-03-26 12:55:08 +00:00
Added a mouse follow animation
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
ref="container"
|
ref="container"
|
||||||
@mouseenter="handleMouseEnter"
|
@mouseenter="handleMouseEnter"
|
||||||
@mouseleave="handleMouseLeave"
|
@mouseleave="handleMouseLeave"
|
||||||
|
@mousemove="handleMouseMove"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -33,6 +34,8 @@ export default {
|
|||||||
let scene;
|
let scene;
|
||||||
let phone;
|
let phone;
|
||||||
let renderer;
|
let renderer;
|
||||||
|
let mouseX = 0;
|
||||||
|
let mouseY = 0;
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
const environmentInit = () => {
|
const environmentInit = () => {
|
||||||
@@ -141,6 +144,10 @@ export default {
|
|||||||
phone.rotateAnim();
|
phone.rotateAnim();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'lookAt':
|
||||||
|
phone.lookAtAnim(mouseX, mouseY, camera);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
phone.floatAnim();
|
phone.floatAnim();
|
||||||
}
|
}
|
||||||
@@ -150,7 +157,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function handleMouseEnter() {
|
function handleMouseEnter() {
|
||||||
animation.value = 'rotate';
|
animation.value = 'lookAt';
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleMouseLeave() {
|
function handleMouseLeave() {
|
||||||
@@ -158,6 +165,12 @@ export default {
|
|||||||
animation.value = 'float';
|
animation.value = 'float';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handleMouseMove(event) {
|
||||||
|
const rect = container.value.getBoundingClientRect();
|
||||||
|
mouseX = event.clientX - rect.left - rect.width / 2;
|
||||||
|
mouseY = -(event.clientY - rect.top - rect.height / 2);
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
init();
|
init();
|
||||||
animate();
|
animate();
|
||||||
@@ -168,6 +181,7 @@ export default {
|
|||||||
container,
|
container,
|
||||||
handleMouseEnter,
|
handleMouseEnter,
|
||||||
handleMouseLeave,
|
handleMouseLeave,
|
||||||
|
handleMouseMove,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Group } from 'three';
|
import { Group, Vector3 } from 'three';
|
||||||
|
|
||||||
export default class MockupModel extends Group {
|
export default class MockupModel extends Group {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -35,4 +35,12 @@ export default class MockupModel extends Group {
|
|||||||
rotateAnim() {
|
rotateAnim() {
|
||||||
this.rotation.y += 0.02;
|
this.rotation.y += 0.02;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lookAtAnim(x, y, camera) {
|
||||||
|
const target = new Vector3();
|
||||||
|
target.x = x;
|
||||||
|
target.y = y;
|
||||||
|
target.z = camera.position.z;
|
||||||
|
this.lookAt(target);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user