some 3d fixes

This commit is contained in:
Kseninia Mikhaylova 2024-06-19 14:52:03 +03:00
parent f05b1391f0
commit 567ed8a888
3 changed files with 83 additions and 59 deletions

View File

@ -1,17 +1,11 @@
<script setup lang="ts">
import { getColorHexFromRal } from '@/components/ral'
import type { ralTypes } from '@/components/ral'
import { CanvasTexture } from 'three';
const props = defineProps(['index', 'models'])
const lamelles_count = useState<number>('lamelles_count')
const fence_section = useState<number>('fence_section')
const section_count = useState<number>('section_count')
const extra_section = useState<number>('extra_section')
const pillar_color = useState<ralTypes>('pillar_color')
const lamelle_color = useState<ralTypes>('lamelle_color')
const remove_pillar = useState<boolean>('remove_pillar')
const lamelles_count = use_lamelles_count()
const fence_section = use_fence_section()
const section_count = use_section_count()
const extra_section = use_extra_section()
const remove_pillar = use_remove_pillar()
const lSize = 0.115
const bSize = 0.0235
@ -59,58 +53,58 @@ watch([section_count, fence_section, extra_section], () => {
<TresGroup name="pillar_one" v-if="!remove_pillar && show_pillar_one" :position-x="pillar_one_pos"
:position-z="0">
<TresGroup :position-y="(lSize * -0.5)" :scale="[1, 0.5, 1]">
<ModelItem :model="props.models.fence" :color="getColorHexFromRal(pillar_color)" />
<ModelItem :model="props.models.fence" />
</TresGroup>
<template v-for="(n, i) in lamelles_count">
<TresGroup :position-y="(lSize * i)">
<ModelItem :model="props.models.fence" :color="getColorHexFromRal(pillar_color)" />
<ModelItem :model="props.models.fence" />
</TresGroup>
</template>
<TresGroup :position-y="(lSize * lamelles_count)" :scale="[1, 0.5, 1]">
<ModelItem :model="props.models.fence" :color="getColorHexFromRal(pillar_color)" />
<ModelItem :model="props.models.fence" />
</TresGroup>
</TresGroup>
<TresGroup name="pillar_two" v-if="!remove_pillar && show_pillar_two" :position-x="pillar_two_pos"
:position-z="0">
<TresGroup :position-y="(lSize * -0.5)" :scale="[-1, 0.5, 1]">
<ModelItem :model="props.models.fence" :color="getColorHexFromRal(pillar_color)" />
<ModelItem :model="props.models.fence" />
</TresGroup>
<template v-for="(n, i) in lamelles_count">
<TresGroup :position-y="(lSize * i)" :scale="[-1, 1, 1]">
<ModelItem :model="props.models.fence" :color="getColorHexFromRal(pillar_color)" />
<ModelItem :model="props.models.fence" />
</TresGroup>
</template>
<TresGroup :position-y="(lSize * lamelles_count)" :scale="[-1, 0.5, 1]">
<ModelItem :model="props.models.fence" :color="getColorHexFromRal(pillar_color)" />
<ModelItem :model="props.models.fence" />
</TresGroup>
</TresGroup>
<TresGroup name="lamelles">
<template v-for="(n, i) in lamelles_count">
<TresGroup :position="[pillar_size * 0.5, (lSize * i), 0.02]" :scale-x="(extra || fence_section) * 10">
<ModelItem :model="props.models.lamelle" :color="getColorHexFromRal(lamelle_color)" />
<TresGroup :position="[pillar_size * 0.5, (lSize * i), 0.02]"
:scale-x="((extra as number) || fence_section) * 10">
<ModelItem :model="props.models.lamelle" />
</TresGroup>
</template>
</TresGroup>
<TresGroup name="lamelles_fastening_one">
<TresGroup name="lam_fastening_one">
<template v-for="(n, i) in lamelles_count">
<TresGroup :position-y="(lSize * i)" :position-x="pillar_one_pos">
<ModelItem :model="props.models.fastening" :color="getColorHexFromRal(pillar_color)" />
<ModelItem :model="props.models.fastening" />
</TresGroup>
</template>
</TresGroup>
<TresGroup name="lamelles_fastening_two">
<TresGroup name="lam_fastening_two">
<template v-for="(n, i) in lamelles_count">
<TresGroup :position-y="(lSize * i)" :scale="[-1, 1, 1]" :position-x="pillar_two_pos">
<ModelItem :model="props.models.fastening" :remove-pos="true"
:color="getColorHexFromRal(pillar_color)" />
<ModelItem :model="props.models.fastening" :remove-pos="true" />
</TresGroup>
</template>
</TresGroup>
<TresGroup name="top_section" :scale-x="(extra || fence_section) * 10"
<TresGroup name="top_section" :scale-x="((extra as number) || fence_section) * 10"
:position="[pillar_size * 0.5, lamelles_count * lSize, 0]">
<ModelItem :model="props.models.top" :color="getColorHexFromRal(pillar_color)" />
<ModelItem :model="props.models.top" />
</TresGroup>
</TresGroup>
</template>

View File

@ -1,9 +1,9 @@
<script setup lang="ts">
import { useGLTF } from '@tresjs/cientos'
import { Box3, CanvasTexture, Color, DoubleSide, MeshStandardMaterial, Vector3 } from 'three';
import { Box3, Color, MeshStandardMaterial, Vector3 } from 'three';
const props = defineProps(['modelUrl', 'model', 'position', 'removePos', 'target', 'color', 'map'])
let scene
let scene: any
if (props.modelUrl) {
const { scene: model } = await useGLTF(props.modelUrl, { draco: true })
scene = model
@ -14,33 +14,14 @@ scene.receiveShadow = true
scene.castShadow = true
const target = ref(props.target ? new Vector3(...props.target) : new Vector3(0, 0, 0))
const box = new Box3();
box.expandByObject(scene.children[0]);
let size = new Vector3();
box.getSize(size)
const getMaterial = async () => {
return new MeshStandardMaterial({
color: new Color(props.color || '#9c9c9c'),
transparent: true,
opacity:1,
roughness: 0.3,
metalness: 0.3
})
}
const material = await getMaterial()
function shadows_and_pos(scene: any) {
scene.children.forEach((el: any) => {
if (el.isMesh) {
el.castShadow = true
el.receiveShadow = true
}
if (props.removePos) {
el.translateX(-el.position.x)
el.translateY(-el.position.y)
el.translateZ(-el.position.z)
}
if (el.material && props.color) el.material = material
shadows_and_pos(el)
})
}
@ -49,6 +30,7 @@ shadows_and_pos(scene)
const model = ref()
const { onLoop } = useRenderLoop()
let stepbase = 0.005
const axis = [
{ axis: 'x', func: 'translateX', },
@ -73,15 +55,6 @@ onLoop(() => {
})
watch(props, () => {
if (props.color && `#${material.color.getHexString()}` !== props.color) {
function set_material(scene: any) {
scene.children.forEach((el: any) => {
if (el.material && props.color) el.material.color = new Color(props.color)
set_material(el)
})
}
set_material(model.value)
}
if (props.target) {
target.value = new Vector3(...props.target)
}

View File

@ -2,11 +2,16 @@
import {
ReinhardToneMapping, PCFSoftShadowMap,
PMREMGenerator, Euler,
MeshStandardMaterial,
Color,
} from 'three';
import { EXRLoader } from 'three/examples/jsm/Addons.js';
import { useGLTF, } from '@tresjs/cientos'
import { getColorHexFromRal, type ralTypes } from '../ral';
const section_count = useState<number>('section_count')
const pillar_color = use_pillar_color()
const lamelle_color = use_lamelle_color()
const section_count = use_section_count()
const extra_section = use_extra_section()
const max_size = use_max_size()
@ -21,7 +26,58 @@ const { scene: fence } = await useGLTF('/models_one/fence.glb', { draco: true })
const { scene: fastening } = await useGLTF('/models_one/krepleniye_planok (1).glb', { draco: true })
const { scene: lamelle } = await useGLTF('/models_one/lamel_100.glb', { draco: true })
const { seek } = useSeek()
function set_material(scene: any, material: any) {
scene.children.forEach((el: any) => {
if (el.isMesh) {
el.castShadow = true
el.receiveShadow = true
}
if (el.material) el.material = material
set_material(el, material)
})
}
const lamelle_material = new MeshStandardMaterial({
color: new Color(getColorHexFromRal(lamelle_color.value as ralTypes)),
transparent: true,
opacity: 1,
roughness: 0.3,
metalness: 0.3
})
const pillar_material = new MeshStandardMaterial({
color: new Color(getColorHexFromRal(pillar_color.value as ralTypes)),
transparent: true,
opacity: 1,
roughness: 0.3,
metalness: 0.3
})
set_material(lamelle, lamelle_material);
[top, fence, fastening].map((el: any) => {
set_material(el, pillar_material)
})
const { seek, seekAll } = useSeek()
watch(lamelle_color, () => {
const items = seekAll(scene.value, 'name', "lamelles")
const m = lamelle_material
m.color = new Color(getColorHexFromRal(lamelle_color.value as ralTypes))
items.forEach(element => {
set_material(element, m)
});
})
watch(pillar_color, () => {
const items = [
...seekAll(scene.value, 'name', "pillar_one"),
...seekAll(scene.value, 'name', "pillar_two"),
...seekAll(scene.value, 'name', "lam_fastening_one"),
...seekAll(scene.value, 'name', "lam_fastening_two"),
...seekAll(scene.value, 'name', "top_section"),
]
const m = pillar_material
m.color = new Color(getColorHexFromRal(pillar_color.value as ralTypes))
items.forEach(element => {
set_material(element, m)
});
})
watch([section_count, extra_section], () => {
const base = seek(scene.value, 'name', 'base')
const n = (section_count.value as number) + ~~(!!extra_section.value)
@ -51,7 +107,8 @@ onMounted(() => {
<TresGroup name="base">
<template v-for="i in (section_count + ~~(!!extra_section))">
<template v-if="i <= max_size">
<ModelFence :index="i" :models="{ top, fence, fastening, lamelle }" />
<ModelFence :index="i"
:models="{ top: top.clone(), fence: fence.clone(), fastening: fastening.clone(), lamelle }" />
</template>
</template>
</TresGroup>