mns-mini-zabor/components/expDiagram.vue

86 lines
3.5 KiB
Vue

<script setup lang="ts">
import { TresCanvas } from '@tresjs/core'
import { OrbitControls, Environment } from '@tresjs/cientos'
const controlsState = reactive({
minDistance: 1,
maxDistance: 10,
enablePan: false,
// enableZoom: false,
maxPolarAngle: (Math.PI / 2) - 0.2,
})
const explosion_state = useState<boolean>('explosion_state', () => false)
const toggleExpState = () => {
explosion_state.value = !explosion_state.value
}
const back_light = ref()
const key_light = ref()
const secondary_light = ref()
const loadAll = async () => {
const { scene: back } = await useGLTF('/models_light/back_exp.glb')
const { scene: key } = await useGLTF('/models_light/key_exp.glb')
const { scene: secondary } = await useGLTF('/models_light/secondary_exp.glb')
const k = 1
back_light.value = back.children[0]
// back_light.value.intensity = back_light.value.intensity * k
back_light.value.intensity = 250
key_light.value = key.children[0]
// key_light.value.intensity = key_light.value.intensity * k
key_light.value.intensity = 250
key_light.value.cast_shadow = true
secondary_light.value = secondary.children[0]
// secondary_light.value.intensity = secondary_light.value.intensity * k
secondary_light.value.intensity = 50
}
onMounted(() => {
loadAll()
})
</script>
<template>
<div class="h-96 relative">
<ClientOnly fallback-tag="div" fallback="Загрузка 3D модели">
<TresCanvas preset="realistic" heoght="600">
<TresPerspectiveCamera :position="[-7, 2, 4]" />
<OrbitControls v-bind="controlsState" make-default />
<Suspense v-if=false>
<Environment files='/hdrmaps/kiara_1_dawn_4k.hdr' :background="false" />
</Suspense>
<ModelDiagram />
<TresPointLight v-bind="back_light" v-if="back_light":position="[back_light.position.x, back_light.position.y, back_light.position.z]" />
<TresPointLight v-bind="key_light" v-if="key_light":position="[key_light.position.x, key_light.position.y, key_light.position.z]" />
<TresPointLight v-bind="secondary_light" v-if="secondary_light"
:position="[secondary_light.position.x, secondary_light.position.y, secondary_light.position.z]" />
</TresCanvas>
</ClientOnly>
<span class="cursor-pointer absolute text-3xl top-0 left-0" @click="toggleExpState">
<Icon name="mdi:checkbox-outline" v-if="explosion_state" />
<Icon name="mdi:square-outline" v-else />
</span>
<div class="grid grid-cols-3 bg-slate-400">
<template v-for="(value, key) in { back: back_light, key: key_light, secondary: secondary_light }">
<div v-if="value">
<strong>{{ key }}</strong><br />
<label>decay</label><input type="number" step="0.1" v-model="value.decay" /><br />
<label>intensity</label><input type="number" step="0.1" v-model="value.intensity" /><br />
<label>position x</label><input type="number" step="0.1" v-model="value.position.x" /><br />
<label>position y</label><input type="number" step="0.1" v-model="value.position.y" /><br />
<label>position z</label><input type="number" step="0.1" v-model="value.position.z" /><br />
</div>
</template>
</div>
</div>
</template>
<style scoped>
.container {
height: 600px;
display: block;
}
</style>