bx-865-apps #1

Merged
ksenia_mikhailova merged 140 commits from bx-865-apps into main 2024-06-27 15:03:27 +03:00
2 changed files with 28 additions and 27 deletions
Showing only changes of commit f984a9749c - Show all commits

View File

@ -23,7 +23,7 @@ const onChange = (e: any) => {
const cameraPosition = [-6, 4, 25] as unknown as Vector3 const cameraPosition = [-6, 4, 25] as unknown as Vector3
const controlsState = reactive({ const controlsState = reactive({
minDistance: 5, minDistance: 2,
maxDistance: 30, maxDistance: 30,
maxPolarAngle: (Math.PI / 2) - 0.02, maxPolarAngle: (Math.PI / 2) - 0.02,
maxZoom: 1, maxZoom: 1,
@ -43,8 +43,9 @@ interface element3DType {
description: string description: string
parent?: number parent?: number
} }
interface model3DType extends element3DType { interface model3DType {
modelUrl?: string modelUrl?: string,
modelFile?: any
} }
const models = ref<model3DType[]>([]) const models = ref<model3DType[]>([])
const loadModels = async () => { const loadModels = async () => {
@ -52,8 +53,12 @@ const loadModels = async () => {
const data = await res.json() as element3DType[] const data = await res.json() as element3DType[]
for (let index = 0; index < data.length; index++) { for (let index = 0; index < data.length; index++) {
const element = data[index]; const element = data[index];
const item = { ...element } as model3DType const item = {} as model3DType
item.modelUrl = `${IMAGE_URL}/${item.model_file}`
item.modelUrl = `${IMAGE_URL}/${element.model_file}`
let { scene: loaded_scene } = await useGLTF(item.modelUrl)
item.modelFile = loaded_scene
models.value.push(item) models.value.push(item)
} }
} }
@ -74,7 +79,7 @@ onMounted(() => {
</Suspense> </Suspense>
<Suspense> <Suspense>
<TresGroup v-for="item in models"> <TresGroup v-for="item in models">
<ModelItem :model-url="item.modelUrl" /> <ModelItem v-bind="item" />
</TresGroup> </TresGroup>
</Suspense> </Suspense>
<TresMesh> <TresMesh>

View File

@ -1,31 +1,27 @@
<script setup lang="ts"> <script setup lang="ts">
import { Box3, Vector3 } from 'three';
import { useGLTF, } from '@tresjs/cientos' import { useGLTF, } from '@tresjs/cientos'
const props = defineProps(['modelUrl', 'onClick']) const props = defineProps(['modelUrl', 'modelFile', 'onClick'])
const { scene } = await useGLTF(props.modelUrl) let scene: any
const box = new Box3(); if (props.modelUrl) {
box.expandByObject(scene.children[0]); let { scene: loaded_scene } = await useGLTF(props.modelUrl)
let center = new Vector3(); scene = loaded_scene
box.getCenter(center) } else if (props.modelFile) {
let size = new Vector3(); scene = props.modelFile
box.getSize(size)
const box_size = [size.x, size.y, size.z]
const show_alert = () => {
alert(props.modelUrl)
} }
scene.receiveShadow = true function shadows_and_pos(scene: any) {
scene.castShadow = true scene.children.forEach((el: any) => {
el.receiveShadow = true
el.castShadow = true
shadows_and_pos(el)
})
}
shadows_and_pos(scene)
</script> </script>
<template> <template>
<TresGroup :posiion="[0, 0, 0]"> <TresGroup >
<TresMesh :position="center" @click="show_alert" cast-shadow receive-shadow>
<TresBoxGeometry :args="box_size" />
<TresMeshPhysicalMaterial :opacity="0" color="pink" :transparent="true" />
</TresMesh>
<TresMesh cast-shadow receive-shadow> <TresMesh cast-shadow receive-shadow>
<primitive :object="scene" /> <primitive :object="scene" />
</TresMesh> </TresMesh>