dev #84
|
@ -183,5 +183,9 @@ watch([instanced_lamelle, lamelle_color], setLamellesColor)
|
||||||
<template v-for="item in fastening">
|
<template v-for="item in fastening">
|
||||||
<TresObject3D v-bind="item.clone()" />
|
<TresObject3D v-bind="item.clone()" />
|
||||||
</template>
|
</template>
|
||||||
|
<TresMesh :position="[0, 0, 0]">
|
||||||
|
<TresBoxGeometry :args="[0.1, 0.1, 0.1]" />
|
||||||
|
<TresMeshBasicMaterial color="violet" />
|
||||||
|
</TresMesh>
|
||||||
</TresGroup>
|
</TresGroup>
|
||||||
</template>
|
</template>
|
|
@ -2,12 +2,42 @@ import { Color, DataTexture, DoubleSide, MeshBasicMaterial, MeshStandardMaterial
|
||||||
import { useLoader, type TresLoader } from '@tresjs/core'
|
import { useLoader, type TresLoader } from '@tresjs/core'
|
||||||
import { getFilename, patterns, type patternTypes } from "~/components/pattern"
|
import { getFilename, patterns, type patternTypes } from "~/components/pattern"
|
||||||
|
|
||||||
|
|
||||||
const set_metaril_func = (scene: any, material: any) => {
|
const set_metaril_func = (scene: any, material: any) => {
|
||||||
scene.children.forEach((el: any) => {
|
scene.children.forEach((el: any) => {
|
||||||
if (el.isMesh && !el.isInstancedMesh) {
|
if (el.isMesh && !el.isInstancedMesh) {
|
||||||
el.castShadow = true
|
el.castShadow = true
|
||||||
el.receiveShadow = true
|
el.receiveShadow = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (el.material) {
|
||||||
|
// Получите UV-координаты
|
||||||
|
const uvAttribute = el.geometry.getAttribute('uv');
|
||||||
|
const uvs = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < uvAttribute.count; i++) {
|
||||||
|
uvs.push(uvAttribute.getX(i), uvAttribute.getY(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Вычисление минимальных и максимальных UV
|
||||||
|
const minU = Math.min(...uvs.filter((_, index) => index % 2 === 0)); // X координаты
|
||||||
|
const maxU = Math.max(...uvs.filter((_, index) => index % 2 === 0));
|
||||||
|
const minV = Math.min(...uvs.filter((_, index) => index % 2 === 1)); // Y координаты
|
||||||
|
const maxV = Math.max(...uvs.filter((_, index) => index % 2 === 1));
|
||||||
|
|
||||||
|
// Определите размеры текстуры на поверхности
|
||||||
|
const surfaceWidth = maxU - minU;
|
||||||
|
const surfaceHeight = (maxV - minV) * el.scale.y;
|
||||||
|
|
||||||
|
material.normalMap.wrapS = RepeatWrapping;
|
||||||
|
material.normalMap.wrapT = RepeatWrapping;
|
||||||
|
material.normalMap.repeat.set(surfaceWidth, surfaceHeight);
|
||||||
|
material.normalMap.needsUpdate = true
|
||||||
|
|
||||||
|
console.log(`Ширина текстуры на поверхности: ${surfaceWidth * 128}`);
|
||||||
|
console.log(`Высота текстуры на поверхности: ${surfaceHeight * 128}`);
|
||||||
|
}
|
||||||
|
|
||||||
if (el.material) el.material = material
|
if (el.material) el.material = material
|
||||||
set_metaril_func(el, material)
|
set_metaril_func(el, material)
|
||||||
})
|
})
|
||||||
|
@ -23,23 +53,23 @@ for (let index = 0; index < patterns.length; index++) {
|
||||||
}
|
}
|
||||||
function generateNoiseTexture(width: number, height: number) {
|
function generateNoiseTexture(width: number, height: number) {
|
||||||
const size = width * height;
|
const size = width * height;
|
||||||
const data = new Uint8Array( 4 * size );
|
const data = new Uint8Array(4 * size);
|
||||||
const color = new Color( 0xffffff );
|
const color = new Color(0xffffff);
|
||||||
|
|
||||||
for ( let i = 0; i < size; i ++ ) {
|
for (let i = 0; i < size; i++) {
|
||||||
const r = Math.floor( Math.random() * 255 );
|
const r = Math.floor(Math.random() * 255);
|
||||||
const g = 0;
|
const g = 0;
|
||||||
const b = Math.floor( Math.random() * 255 );
|
const b = Math.floor(Math.random() * 255);
|
||||||
|
|
||||||
const stride = i * 4;
|
const stride = i * 4;
|
||||||
data[ stride ] = r;
|
data[stride] = r;
|
||||||
data[ stride + 1 ] = g;
|
data[stride + 1] = g;
|
||||||
data[ stride + 2 ] = b;
|
data[stride + 2] = b;
|
||||||
data[ stride + 3 ] = 255;
|
data[stride + 3] = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
// used the buffer to create a DataTexture
|
// used the buffer to create a DataTexture
|
||||||
const texture = new DataTexture( data, width, height );
|
const texture = new DataTexture(data, width, height);
|
||||||
texture.needsUpdate = true;
|
texture.needsUpdate = true;
|
||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue