feat: detail texture

This commit is contained in:
monoid 2025-04-12 21:03:07 +09:00
parent 6c13ce3373
commit 9eb1719aca
3 changed files with 31 additions and 10 deletions

View file

@ -142,6 +142,9 @@ const Globe: FC<GlobeProps> = ({ radius }) => {
useEffect(() => { useEffect(() => {
// 웹 워커를 사용하여 텍스처 생성 // 웹 워커를 사용하여 텍스처 생성
workerRef.current = new Worker(new URL('./textureWorker.ts', import.meta.url), { type: 'module' }); workerRef.current = new Worker(new URL('./textureWorker.ts', import.meta.url), { type: 'module' });
console.time('Texture generation time'); // 성능 측정 시작
// 워커에서 텍스처 생성 완료 시 호출되는 이벤트 핸들러
workerRef.current.onmessage = (event) => { workerRef.current.onmessage = (event) => {
const { data, width, height } = event.data; const { data, width, height } = event.data;
const texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat); const texture = new THREE.DataTexture(data, width, height, THREE.RGBAFormat);
@ -151,6 +154,8 @@ const Globe: FC<GlobeProps> = ({ radius }) => {
texture.wrapS = THREE.ClampToEdgeWrapping; texture.wrapS = THREE.ClampToEdgeWrapping;
texture.wrapT = THREE.ClampToEdgeWrapping; texture.wrapT = THREE.ClampToEdgeWrapping;
texture.generateMipmaps = true; texture.generateMipmaps = true;
console.timeEnd('Texture generation time'); // 성능 측정 종료
// 텍스처 생성 완료 후 상태 업데이트
console.log('Texture generated in worker:', texture); console.log('Texture generated in worker:', texture);
setGlobeTexture(texture); setGlobeTexture(texture);
}; };

View file

@ -15,9 +15,25 @@ export const generateGlobeTextureData = (width: number, height: number, seed?: n
seed += 1; // 시드 증가 seed += 1; // 시드 증가
return x - Math.floor(x); // 0 ~ 1 사이 값 반환 return x - Math.floor(x); // 0 ~ 1 사이 값 반환
} // 시드가 주어지면 고정된 랜덤 생성기 사용 (선택 사항) } // 시드가 주어지면 고정된 랜덤 생성기 사용 (선택 사항)
const noise3D = createNoise3D(getRandom(seed)); // 3D 노이즈 생성 함수
const noise3D2 = createNoise3D(getRandom(seed ^ 12)); // 3D 노이즈 생성 함수 (다른 스케일을 위해) const noise3DGen = (scale: number) => {
const noise3D3 = createNoise3D(getRandom(seed ^ 224)); // 3D 노이즈 생성 함수 (다른 스케일을 위해) const noise3D = createNoise3D(getRandom(seed)); // 3D 노이즈 생성 함수
return (x: number, y: number, z: number) => {
return noise3D(x * scale, y * scale, z * scale); // 노이즈 값 반환
};
}
const scales = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]; // 스케일 배열 (2^0 ~ 2^9)
const functions = scales.map((x) => noise3DGen(x)); // 10단계로 나누어 노이즈 생성
const complexNoise = (x: number, y: number, z: number) => {
let noiseValue = 0; // 노이즈 값 초기화
// 3D Simplex Noise 값 계산 (-1 ~ 1)
for (let j = 0; j < 10; j++) {
const scale = scales[j]; // 스케일
const noise = functions[j](x, y, z); // 노이즈 값 계산
noiseValue += noise / scale; // 가중치 적용
}
return noiseValue;
}
const noiseScale = 2; // 노이즈 스케일 (값이 클수록 지형이 작아짐) const noiseScale = 2; // 노이즈 스케일 (값이 클수록 지형이 작아짐)
const waterLevel = 0.05; // 해수면 높이 (-1 ~ 1 사이 값) const waterLevel = 0.05; // 해수면 높이 (-1 ~ 1 사이 값)
@ -39,10 +55,7 @@ export const generateGlobeTextureData = (width: number, height: number, seed?: n
const z = Math.sin(phi) * Math.sin(theta); const z = Math.sin(phi) * Math.sin(theta);
const y = Math.cos(phi); const y = Math.cos(phi);
// 3D Simplex Noise 값 계산 (-1 ~ 1) const noiseValue = complexNoise(x * noiseScale, y * noiseScale, z * noiseScale); // 노이즈 값 계산
const noiseValue = noise3D(x * noiseScale, y * noiseScale, z * noiseScale)
+ noise3D2(x * noiseScale * 0.5, y * noiseScale * 0.5, z * noiseScale * 0.5) * 0.5
+ noise3D3(x * noiseScale * 0.25, y * noiseScale * 0.25, z * noiseScale * 0.25) * 0.25; // 노이즈 조합
let r = 50; // 바다 기본 R let r = 50; // 바다 기본 R
let g = 100; // 바다 기본 G let g = 100; // 바다 기본 G
@ -77,7 +90,7 @@ export const generateGlobeTextureData = (width: number, height: number, seed?: n
} }
} else { } else {
// 바다 (깊이에 따라 색상 변화) // 바다 (깊이에 따라 색상 변화)
const depthFactor = Math.abs((noiseValue - waterLevel) / ( 1 + waterLevel)); // 0 ~ 1 정규화 (깊이 비율) const depthFactor = Math.abs((noiseValue - waterLevel) / (1 + waterLevel)); // 0 ~ 1 정규화 (깊이 비율)
r = 50 - 30 * depthFactor; r = 50 - 30 * depthFactor;
g = 100 - 50 * depthFactor; g = 100 - 50 * depthFactor;
b = 200 - 40 * depthFactor; b = 200 - 40 * depthFactor;
@ -102,6 +115,6 @@ export const generateGlobeTextureData = (width: number, height: number, seed?: n
data[stride + 3] = a; // Alpha 값 설정 data[stride + 3] = a; // Alpha 값 설정
} }
// 데이터 배열과 크기를 반환 // 데이터 배열과 크기를 반환
return { data, width, height }; return { data, width, height };
}; };

View file

@ -5,4 +5,7 @@ import tailwindcss from '@tailwindcss/vite'
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [tailwindcss(), react()], plugins: [tailwindcss(), react()],
server: {
allowedHosts: ['monoid.top']
}
}) })