position
This commit is contained in:
parent
6f925167f2
commit
d7dcbafce7
2
app.vue
2
app.vue
|
@ -129,7 +129,9 @@ const { scrollToAnchor, scrollToTop } = useAnchorScroll({
|
||||||
</div>
|
</div>
|
||||||
<div class="siteblock siteblock_calc bg-white">
|
<div class="siteblock siteblock_calc bg-white">
|
||||||
<CalcValues />
|
<CalcValues />
|
||||||
|
<Suspense>
|
||||||
<CalcModels />
|
<CalcModels />
|
||||||
|
</Suspense>
|
||||||
</div>
|
</div>
|
||||||
<div class="siteblock bg-white" :id="delivery?.slug" v-if="deliveryText">
|
<div class="siteblock bg-white" :id="delivery?.slug" v-if="deliveryText">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
|
@ -1,15 +1,16 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { TresCanvas } from '@tresjs/core'
|
import { RepeatWrapping, FrontSide, } from 'three';
|
||||||
import { OrbitControls, Environment, vLightHelper } from '@tresjs/cientos'
|
import { TresCanvas, useTexture } from '@tresjs/core'
|
||||||
|
import { OrbitControls, Environment, useGLTF } from '@tresjs/cientos'
|
||||||
|
|
||||||
|
const section_count = useState<number>('section_count')
|
||||||
|
const fence_section = useState<number>('fence_section')
|
||||||
|
|
||||||
const controlsState = reactive({
|
const controlsState = reactive({
|
||||||
minDistance: 5,
|
minDistance: 5,
|
||||||
maxDistance: 12,
|
maxDistance: 12,
|
||||||
enablePan: false,
|
enablePan: false,
|
||||||
// enableZoom: false,
|
|
||||||
maxPolarAngle: (Math.PI / 2) - 0.2,
|
maxPolarAngle: (Math.PI / 2) - 0.2,
|
||||||
// maxZoom: 2,
|
|
||||||
// minZoom: 1,
|
|
||||||
})
|
})
|
||||||
const cameraStat = reactive({
|
const cameraStat = reactive({
|
||||||
position: [-4, 2, 8],
|
position: [-4, 2, 8],
|
||||||
|
@ -17,8 +18,51 @@ const cameraStat = reactive({
|
||||||
fov: 40,
|
fov: 40,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const pointLight = ref()
|
||||||
|
|
||||||
|
const groundMaterial = ref({
|
||||||
|
color: "#555",
|
||||||
|
roughness: 0.25,
|
||||||
|
metalness: 0,
|
||||||
|
side: FrontSide
|
||||||
|
})
|
||||||
|
const loadAll = async () => {
|
||||||
|
const { scene: light } = await useGLTF('/models_light/zabor_so_svetom.glb')
|
||||||
|
pointLight.value = light.children[2]
|
||||||
|
pointLight.value.color = '#f0dea9'
|
||||||
|
pointLight.value.shadow.camera.near = 50
|
||||||
|
pointLight.value.shadow.bias = -0.001
|
||||||
|
|
||||||
|
const pbrTexture = await useTexture({
|
||||||
|
map: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_Color.png',
|
||||||
|
displacementMap: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_Displacement.png',
|
||||||
|
roughnessMap: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_Roughness.png',
|
||||||
|
normalMap: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_NormalDX.png',
|
||||||
|
aoMap: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_AmbientOcclusion.png',
|
||||||
|
})
|
||||||
|
const repeat = 10
|
||||||
|
for (const key in pbrTexture) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(pbrTexture, key)) {
|
||||||
|
const key_p = key as keyof typeof pbrTexture
|
||||||
|
const element = pbrTexture[key_p]
|
||||||
|
if (element && element.wrapS) {
|
||||||
|
element.wrapS = RepeatWrapping
|
||||||
|
element.wrapT = RepeatWrapping
|
||||||
|
element.repeat.x = repeat
|
||||||
|
element.repeat.y = repeat
|
||||||
|
element.flipY = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
groundMaterial.value = Object.assign(groundMaterial.value, {
|
||||||
|
map: pbrTexture.map,
|
||||||
|
displacementMap: pbrTexture.displacementMap,
|
||||||
|
normalMap: pbrTexture.normalMap,
|
||||||
|
})
|
||||||
|
}
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
cameraStat.aspect = window.innerWidth / 600
|
cameraStat.aspect = window.innerWidth / 600
|
||||||
|
loadAll()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
|
@ -31,9 +75,21 @@ onMounted(() => {
|
||||||
<Suspense v-if="false">
|
<Suspense v-if="false">
|
||||||
<Environment files='/hdrmaps/kloppenheim_06_4k.hdr' :background="true" />
|
<Environment files='/hdrmaps/kloppenheim_06_4k.hdr' :background="true" />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
|
<TresGroup :position-x="Math.min(section_count, 20) * fence_section * -1" :position-y="-3">
|
||||||
<Suspense>
|
<Suspense>
|
||||||
<ModelParametric />
|
<ModelParametric />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
|
</TresGroup>
|
||||||
|
<TresMesh receive-shadow :position-y="-3.65" name="ground">
|
||||||
|
<TresCircleGeometry :args="[100, 32]" :rotate-x="-Math.PI * 0.5" />
|
||||||
|
<TresMeshStandardMaterial v-bind="groundMaterial" />
|
||||||
|
</TresMesh>
|
||||||
|
<template v-if="pointLight">
|
||||||
|
<TresPointLight v-bind="pointLight" :intensity="pointLight.intensity * 0.5"
|
||||||
|
:position="Object.values(pointLight.position).map((el: any) => el * 3)" cast-shadow />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<TresAmbientLight color="rgb(191,231,255)" :intensity="5" />
|
||||||
</TresCanvas>
|
</TresCanvas>
|
||||||
</ClientOnly>
|
</ClientOnly>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -10,17 +10,18 @@ const lamelle_color = useState<ralTypes>('lamelle_color', () => '3004')
|
||||||
const section_count = useState('section_count', () => 10)
|
const section_count = useState('section_count', () => 10)
|
||||||
const extra_section = useState('extra_section', () => 0)
|
const extra_section = useState('extra_section', () => 0)
|
||||||
const total_length = useState('total_length', () => (2000 * 8 - 100) * 0.001)
|
const total_length = useState('total_length', () => (2000 * 8 - 100) * 0.001)
|
||||||
|
const min_length = useState('min_length', () => 1000)
|
||||||
|
|
||||||
const parametric = {
|
const parametric = {
|
||||||
length: {
|
length: {
|
||||||
min: 1000,
|
min: min_length.value,
|
||||||
max: 2400,
|
max: 2400,
|
||||||
step: 1,
|
step: 1,
|
||||||
},
|
},
|
||||||
total_length: {
|
total_length: {
|
||||||
min: 1,
|
min: min_length.value * 0.001,
|
||||||
max: undefined,
|
max: undefined,
|
||||||
step: 0.01,
|
step: 0.5,
|
||||||
},
|
},
|
||||||
height: {
|
height: {
|
||||||
min: 675,
|
min: 675,
|
||||||
|
@ -92,7 +93,7 @@ const changeParametres = () => {
|
||||||
form_state.total_length = parametric.total_length.min
|
form_state.total_length = parametric.total_length.min
|
||||||
form_state.length = parametric.length.min
|
form_state.length = parametric.length.min
|
||||||
}
|
}
|
||||||
}, 300)
|
}, 600)
|
||||||
|
|
||||||
total_length.value = form_state.total_length
|
total_length.value = form_state.total_length
|
||||||
lamelles_count.value = lamelles
|
lamelles_count.value = lamelles
|
||||||
|
|
|
@ -7,6 +7,7 @@ const props = defineProps(['index', 'models'])
|
||||||
|
|
||||||
const lamelles_count = useState<number>('lamelles_count')
|
const lamelles_count = useState<number>('lamelles_count')
|
||||||
const fence_section = useState<number>('fence_section')
|
const fence_section = useState<number>('fence_section')
|
||||||
|
const section_count = useState<number>('section_count')
|
||||||
const pillar_color = useState<ralTypes>('pillar_color')
|
const pillar_color = useState<ralTypes>('pillar_color')
|
||||||
const lamelle_color = useState<ralTypes>('lamelle_color')
|
const lamelle_color = useState<ralTypes>('lamelle_color')
|
||||||
const remove_pillar = useState<boolean>('remove_pillar')
|
const remove_pillar = useState<boolean>('remove_pillar')
|
||||||
|
@ -27,13 +28,8 @@ const show_pillar_one = ref(props.index == 1)
|
||||||
const show_pillar_two = ref(true)
|
const show_pillar_two = ref(true)
|
||||||
|
|
||||||
const make_translate_to_section = () => {
|
const make_translate_to_section = () => {
|
||||||
let r = ((props.index - 1) / 2) * (fence_section.value + pillar_size + bSize) * scale_koef
|
const one_s = (fence_section.value + pillar_size + bSize)
|
||||||
if (props.index % 2 == 0) {
|
let r = (props.index - 1) * one_s * scale_koef
|
||||||
show_pillar_two.value = false
|
|
||||||
show_pillar_one.value = true
|
|
||||||
r += (fence_section.value * 0.5 + bSize) * scale_koef
|
|
||||||
return -1 * r
|
|
||||||
}
|
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
const translate_to_section = ref(make_translate_to_section())
|
const translate_to_section = ref(make_translate_to_section())
|
||||||
|
@ -41,6 +37,7 @@ const translate_to_section = ref(make_translate_to_section())
|
||||||
watch(fence_section, () => {
|
watch(fence_section, () => {
|
||||||
translate_to_section.value = make_translate_to_section()
|
translate_to_section.value = make_translate_to_section()
|
||||||
})
|
})
|
||||||
|
|
||||||
const s = 512
|
const s = 512
|
||||||
const canvas = document.createElement('canvas')
|
const canvas = document.createElement('canvas')
|
||||||
canvas.width = s
|
canvas.width = s
|
||||||
|
@ -51,6 +48,7 @@ ctx.font = "512px serif"
|
||||||
ctx.textAlign = "center"
|
ctx.textAlign = "center"
|
||||||
ctx.textBaseline = 'middle'
|
ctx.textBaseline = 'middle'
|
||||||
ctx.fillText(props.index, s * 0.5, s * 0.5)
|
ctx.fillText(props.index, s * 0.5, s * 0.5)
|
||||||
|
|
||||||
const textures = []
|
const textures = []
|
||||||
for (let index = 0; index < lamelles_count.value; index++) {
|
for (let index = 0; index < lamelles_count.value; index++) {
|
||||||
const element = document.createElement('canvas')
|
const element = document.createElement('canvas')
|
||||||
|
@ -61,12 +59,17 @@ for (let index = 0; index < lamelles_count.value; index++) {
|
||||||
0, (s / lamelles_count.value) * index, s, s / lamelles_count.value,
|
0, (s / lamelles_count.value) * index, s, s / lamelles_count.value,
|
||||||
0, 0, s, s / lamelles_count.value
|
0, 0, s, s / lamelles_count.value
|
||||||
);
|
);
|
||||||
// console.log(element.toDataURL())
|
|
||||||
textures.push(new CanvasTexture(element))
|
textures.push(new CanvasTexture(element))
|
||||||
}
|
}
|
||||||
|
const fenceRotate = { x: 0, y: 0 }
|
||||||
|
if (props.index > 3) {
|
||||||
|
// fenceRotate.x = -Math.PI * 0.25
|
||||||
|
// fenceRotate.y = -Math.PI * 0.5
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<TresGroup :scale="scale_koef" :position-x="translate_to_section" :name="`fence ${index}`">
|
<TresGroup :scale="scale_koef" :position-x="translate_to_section" :name="`fence ${index}`" :rotate-y="fenceRotate.y"
|
||||||
|
:rotate-x="fenceRotate.x">
|
||||||
<TresGroup name="pillar_one" v-if="!remove_pillar && show_pillar_one" :position-x="pillar_one_pos"
|
<TresGroup name="pillar_one" v-if="!remove_pillar && show_pillar_one" :position-x="pillar_one_pos"
|
||||||
:position-z="0">
|
:position-z="0">
|
||||||
<TresGroup :position-y="(lSize * -0.5)" :scale="[1, 0.5, 1]">
|
<TresGroup :position-y="(lSize * -0.5)" :scale="[1, 0.5, 1]">
|
||||||
|
|
|
@ -1,80 +1,30 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {
|
import {
|
||||||
ReinhardToneMapping, PCFSoftShadowMap, RepeatWrapping,
|
ReinhardToneMapping, PCFSoftShadowMap,
|
||||||
Color, DataTexture,
|
|
||||||
PMREMGenerator, Euler,
|
PMREMGenerator, Euler,
|
||||||
FrontSide,
|
|
||||||
CanvasTexture
|
|
||||||
} from 'three';
|
} from 'three';
|
||||||
import { EXRLoader } from 'three/examples/jsm/Addons.js';
|
import { EXRLoader } from 'three/examples/jsm/Addons.js';
|
||||||
import { useTexture } from '@tresjs/core'
|
|
||||||
import { useGLTF, } from '@tresjs/cientos'
|
import { useGLTF, } from '@tresjs/cientos'
|
||||||
const section_count = useState('section_count')
|
|
||||||
|
const section_count = useState<number>('section_count')
|
||||||
|
|
||||||
const { scene, renderer, camera } = useTresContext()
|
const { scene, renderer, camera } = useTresContext()
|
||||||
renderer.value.toneMapping = ReinhardToneMapping
|
renderer.value.toneMapping = ReinhardToneMapping
|
||||||
|
|
||||||
renderer.value.shadowMap.enabled = true
|
renderer.value.shadowMap.enabled = true
|
||||||
// renderer.value.shadowMap.type = PCFSoftShadowMap
|
renderer.value.shadowMap.type = PCFSoftShadowMap
|
||||||
|
|
||||||
// const pbrTexture = await useTexture({
|
|
||||||
// map: '/texture/Grass01_MR_2K/Grass01_2K_BaseColor.png ',
|
|
||||||
// displacementMap: '/texture/Grass01_MR_2K/Grass01_2K_Height.png ',
|
|
||||||
// roughnessMap: '/texture/Grass01_MR_2K/Grass01_2K_Roughness.png',
|
|
||||||
// normalMap: '/texture/Grass01_MR_2K/Grass01_2K_Normal.png ',
|
|
||||||
// aoMap: '/texture/Grass01_MR_2K/Grass01_2K_AO.png ',
|
|
||||||
// // metalnessMap: '/texture/Ground039_4K-JPG_Color.jpg',
|
|
||||||
// // matcap: '/textures/Ground039_4K-JPG_Color.jpg',
|
|
||||||
// // alphaMap: '/textures/myAlphaMapTexture.jpg'
|
|
||||||
// })
|
|
||||||
const pbrTexture = await useTexture({
|
|
||||||
map: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_Color.png',
|
|
||||||
displacementMap: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_Displacement.png',
|
|
||||||
roughnessMap: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_Roughness.png',
|
|
||||||
normalMap: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_NormalDX.png',
|
|
||||||
aoMap: '/texture/Grass004_2K-PNG/Grass004_2K-PNG_AmbientOcclusion.png',
|
|
||||||
})
|
|
||||||
const groundMaterial = {
|
|
||||||
map: pbrTexture.map,
|
|
||||||
displacementMap: pbrTexture.displacementMap,
|
|
||||||
normalMap: pbrTexture.normalMap,
|
|
||||||
color: "#555",
|
|
||||||
roughness: 0.25,
|
|
||||||
metalness: 0,
|
|
||||||
side: FrontSide
|
|
||||||
}
|
|
||||||
const repeat = 10
|
|
||||||
for (const key in pbrTexture) {
|
|
||||||
if (Object.prototype.hasOwnProperty.call(pbrTexture, key)) {
|
|
||||||
const key_p = key as keyof typeof pbrTexture
|
|
||||||
const element = pbrTexture[key_p]
|
|
||||||
if (element && element.wrapS) {
|
|
||||||
element.wrapS = RepeatWrapping
|
|
||||||
element.wrapT = RepeatWrapping
|
|
||||||
element.repeat.x = repeat
|
|
||||||
element.repeat.y = repeat
|
|
||||||
element.flipY = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const { scene: top } = await useGLTF('/models_one/verh_100.glb')
|
const { scene: top } = await useGLTF('/models_one/verh_100.glb')
|
||||||
const { scene: fence } = await useGLTF('/models_one/fence.glb')
|
const { scene: fence } = await useGLTF('/models_one/fence.glb')
|
||||||
const { scene: fastening } = await useGLTF('/models_one/krepleniye_planok (1).glb')
|
const { scene: fastening } = await useGLTF('/models_one/krepleniye_planok (1).glb')
|
||||||
const { scene: lamelle } = await useGLTF('/models_one/lamel_100.glb')
|
const { scene: lamelle } = await useGLTF('/models_one/lamel_100.glb')
|
||||||
const { scene: light } = await useGLTF('/models_light/zabor_so_svetom.glb')
|
|
||||||
|
|
||||||
const { seek, seekAll } = useSeek()
|
const { seek } = useSeek()
|
||||||
watch(section_count, () => {
|
watch(section_count, () => {
|
||||||
const fences = seekAll(scene.value, 'name', 'fence')
|
|
||||||
const base = seek(scene.value, 'name', 'base')
|
const base = seek(scene.value, 'name', 'base')
|
||||||
const n = (section_count.value as number)
|
const n = (section_count.value as number)
|
||||||
if (fences.length > n) {
|
if (base?.children && n < base?.children.length) {
|
||||||
for (let i = fences.length; i > n; i--) {
|
base.children = [...base?.children.slice(0, n)]
|
||||||
const item = fences[i - 1]
|
|
||||||
if (item) {
|
|
||||||
base?.remove(item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -94,32 +44,9 @@ onMounted(() => {
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
const pointLight = light.children[2]
|
|
||||||
pointLight.color = '#f0dea9'
|
|
||||||
pointLight.shadow.camera.near = 50
|
|
||||||
pointLight.shadow.bias = -0.001
|
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<TresGroup :translate-y="-3.25" name="base">
|
<TresGroup name="base">
|
||||||
<TresMesh receive-shadow :position-y="-0.65" name="ground">
|
|
||||||
<TresCircleGeometry :args="[100, 32]" :rotate-x="-Math.PI * 0.5" />
|
|
||||||
<TresMeshStandardMaterial v-bind="groundMaterial" />
|
|
||||||
</TresMesh>
|
|
||||||
<TresMesh :position="Object.values(pointLight.position).map((el: any) => el * 2.5)" cast-shadow receive-shadow>
|
|
||||||
<TresBoxGeometry :args="[1, 1, 1]" />
|
|
||||||
<TresMeshStandardMaterial />
|
|
||||||
</TresMesh>
|
|
||||||
|
|
||||||
<TresPointLight v-bind="pointLight" :intensity="pointLight.intensity * 0.5"
|
|
||||||
:position="Object.values(pointLight.position).map((el: any) => el * 3)" cast-shadow />
|
|
||||||
|
|
||||||
<TresAmbientLight color="rgb(191,231,255)" :intensity="5" />
|
|
||||||
<template v-if="false">
|
|
||||||
<template v-for="i in light.children[1].children">
|
|
||||||
<TresDirectionalLight :position="i.position" :intensity="5" color="rgb(191,231,255)" cast-shadow />
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template v-for="i in section_count">
|
<template v-for="i in section_count">
|
||||||
<template v-if="i <= 20">
|
<template v-if="i <= 20">
|
||||||
<ModelFence :index="i" :models="{ top, fence, fastening, lamelle }" />
|
<ModelFence :index="i" :models="{ top, fence, fastening, lamelle }" />
|
||||||
|
|
Loading…
Reference in New Issue