find in group child mesh

This commit is contained in:
Kseninia Mikhaylova 2024-06-27 14:06:09 +03:00
parent 9248c99afa
commit 8c5feca661
2 changed files with 31 additions and 10 deletions

View File

@ -47,6 +47,8 @@ const loadModels = async () => {
shadows_and_pos(loaded_scene) shadows_and_pos(loaded_scene)
item.modelFile = loaded_scene item.modelFile = loaded_scene
item.name = element.name
models.value.push(item) models.value.push(item)
if (element.min_distance && element.min_distance > distance.min) distance.min = element.min_distance if (element.min_distance && element.min_distance > distance.min) distance.min = element.min_distance
@ -71,7 +73,19 @@ const loadModels = async () => {
for (let index = 0; index < clickable.value.length; index++) { for (let index = 0; index < clickable.value.length; index++) {
const element = clickable.value[index]; const element = clickable.value[index];
clickable_objects.value.push(seekByName(scene.value, element.object_name)) const find_element = seekByName(scene.value, element.object_name)
if (!find_element) continue
const res_array = find_element.isGroup ? find_element?.children : [find_element]
for (let index = 0; index < res_array.length; index++) {
const r = res_array[index];
let res = {
name: r.name,
target: element.id,
object: r,
}
clickable_objects.value.push(res)
}
console.log(clickable_objects)
} }
} }
onMounted(() => { onMounted(() => {
@ -93,17 +107,19 @@ const clickEvent = (event: MouseEvent) => {
pointer.y = y pointer.y = y
raycaster.value.setFromCamera(new Vector2(pointer.x, pointer.y), camera.value); raycaster.value.setFromCamera(new Vector2(pointer.x, pointer.y), camera.value);
const intersects = raycaster.value.intersectObjects(clickable_objects.value); const intersects = raycaster.value.intersectObjects(clickable_objects.value.map(el => el.object));
const names = intersects.map(el => el.object.name ?? false).filter(Boolean) const names = intersects.map(el => el.object.name ?? false).filter(Boolean)
if (names.length) { if (names.length) {
const clicks = clickable.value.find(el => names.includes(el.object_name)) const clicks = clickable_objects.value.find(el => names.includes(el.name))
if (!clicks) return if (!clicks) return
const target = clickable.value.find(el => el.id == clicks.target)
if (!target) return
const sidebar_data = { const sidebar_data = {
title: clicks.name, title: target.name,
description: clicks.description description: target.description
} as PromoSidebarData } as PromoSidebarData
if (clicks?.target) { if (target?.target) {
sidebar_data.target = clicks.target.toString() sidebar_data.target = target.target.toString()
} }
sidebar.open() sidebar.open()
sidebar.setData(sidebar_data) sidebar.setData(sidebar_data)
@ -119,7 +135,11 @@ watch(() => props.source, () => {
}) })
</script> </script>
<template> <template>
<TresGroup v-for="item in models" name="loaded"> <TresGroup name="loaded">
<TresObject3D v-bind="item.modelFile.clone()" /> <template v-for="item in models">
<TresGroup :name="item.name">
<TresObject3D v-bind="item.modelFile.clone()" />
</TresGroup>
</template>
</TresGroup> </TresGroup>
</template> </template>

View File

@ -25,7 +25,8 @@ interface element3DType {
} }
interface model3DType { interface model3DType {
modelUrl?: string, modelUrl?: string,
modelFile?: any modelFile?: any,
name: string
} }
interface clickableAreaType { interface clickableAreaType {
description: string; description: string;