three.js로 웹에서 멋진 3D 장면 연출하기

three.js를 이용하여 웹에서.. 몽환적인 장면을 만들어 보는 코드를 작성해 보았습니다. 결과는 다음 동영상과 같습니다.

복잡한 Shader를 사용하지 않았습니다. three.js의 기본적인 API만을 사용했습니다.

또 다른 한가지 예입니다. 피닉스 한마리가 날아오르는 장면을 연출한 것인데요. 처음엔 생기가 없지만 조금씩 높이 날아 오를수록 몸이 빛나기 시작합니다.

조만간 제 Youtube 채널(GIS DEVELOPER)에 위 2가지에 예제를 three.js로 어떻게 만드는지 그 내용을 업로드할 예정입니다.

Webpack, TypeScript를 이용한 웹페이지 개발 설정

기본 설정

# Node.js 설치

npm 명령 실행을 위함

# npm init -y

npm init는 package.json을 만들기 위한 명령이고 -y를 붙임으로써 별도의 입력 없이 기본 값으로 진행 시킴. package.json은 작성하고자 하는 프로젝트에 대한 설정 파일로 볼 수 있으며, 프로젝트 이름과 버전 등과 같은 설명과 프로젝트가 사용하는 라이브러리에 대한 정보 그리고 프로젝트 실행 등을 위한 명령에 대한 정보가 담겨있음. package.json 파일은 npm을 위한 파일임(VS.Code를 위한 것이 아님)

# npm install webpack webpack-cli --save-dev

# npm install typescript ts-loader --save-dev

# tsconfig.json 파일 생성 및 내용 작성

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": true,
        "noImplicitAny": true,
        "module": "es6",
        "target": "es5",
        "allowJs": true
    }
}

# webpack.config.js 파일 생성 및 내용 작성

const path = require("path");

module.exports = {
    mode: "development",
    entry: "./src/index.ts",
    devtool: "inline-source-map",
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                use: "ts-loader",
                exclude: /node_modules/,
            },
        ],
    },
    resolve: {
        extensions: [".tsx", ".ts", ".js"],
    },
    output: {
        filename: "bundle.js",
        path: path.resolve(__dirname, "dist"),
    },
}

# src, dist 폴더 및 index.html(dist 폴더), index.ts(src 폴더) 파일 생성

# index.html 코드 입력

...

<script src="bundle.js"></script> 

...

# index.ts 코드 입력

console.log("Hello");

# package.json 파일의 “scripts” 파트에 “bundle”: “webpack” 입력

{
  ..
  "scripts": {
    ..
    "bundle": "webpack"
  },
  ..
}

# npm run bundle 실행

Typescript로 작성된 파일을 Javascript 파일로 트랜스파일링 시킴

자동 실행을 위한 설정

# package.json 파일의 “scripts” 파트에 “watch”: “webpack –watch” 및 “start”: “npm run bundle && npm run watch” 추가

{
  ..
  "scripts": {
    ..
    "bundle": "webpack",
    "watch": "webpack --watch",
    "start": "npm run bundle && npm run watch"
  },
  ..
}

# VS.Code에서 Live Server 확장 기능 설치

# npm start 실행

이제부터 Typescript로 작성된 파일을 수정하면 Javascript 파일로 지동으로 트랜스파일링 시킴

# index.html 열고 GO LIVE 활성화

브레이크 디버깅

# VS.Code의 “실행 및 디버그” 클릭을 통해 launch.json을 생성 (크롬 선택)

# launch.json 파일에서 “url”의 값을 “http://127.0.0.1:5500/dist”으로 수정

{
    ..
    "configurations": [
        {
            ..
            "url": "http://127.0.0.1:5500/dist",
            ..
        }
    ]
}

babylonjs 라이브러리 설치

# npm install @babylonjs/core

# tsconfig.json에 “moduleResolution”: “node” 추가

{
    "compilerOptions": {
       ..
       "moduleResolution": "node"
    }
}

위의 설정을 입력해야 babylonjs 모듈을 import할 때(예: import { Scene } from “@babylonjs/core”) 문제가 없음

최종 설정 파일 내용

# tsfonfig.json

{
    "compilerOptions": {
        "outDir": "./dist/",
        "sourceMap": true,
        "noImplicitAny": true,
        "module": "es6",
        "target": "es5",
        "allowJs": true,

        "moduleResolution": "node"
    }
}

# webpack.config.js

const path = require("path");

module.exports = {
    mode: "development",
    entry: "./src/index.ts",
    devtool: "inline-source-map",
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                use: "ts-loader",
                exclude: /node_modules/
            },
        ],
    },
    resolve: {
        extensions: [".tsx", ".ts", ".js"],
    },
    output: {
        filename: "bundle.js",
        path: path.resolve(__dirname, "dist"),
    },
}

# package.json

{
  "name": "tstbabylonjs_ts",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "bundle": "webpack",
    "watch": "webpack --watch",
    "start": "npm run bundle && npm run watch"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "ts-loader": "^9.4.1",
    "typescript": "^4.8.4",
    "webpack": "^5.74.0",
    "webpack-cli": "^4.10.0"
  },
  "dependencies": {
    "@babylonjs/core": "^5.26.1"
  }
}

# launch.json

{
    // IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.
    // 기존 특성에 대한 설명을 보려면 가리킵니다.
    // 자세한 내용을 보려면 https://go.microsoft.com/fwlink/?linkid=830387을(를) 방문하세요.
    "version": "0.2.0",
    "configurations": [
        {
            "type": "chrome",
            "request": "launch",
            "name": "Launch Chrome against localhost",
            "url": "http://127.0.0.1:5500/dist",
            "webRoot": "${workspaceFolder}"
        }
    ]
}

물리(Physics) 계수

반발계수(coefficient of restitution, COR)

반발 계수는 물체의 충돌 전후 속도의 비율을 나타내는 분수값이다. 반발 계수가 1인 물체는 탄성 충돌을 하며, 반발 계수가 1보다 작은 물체는 비탄성 충돌을 한다. 반발 계수가 0이면 완전 비탄성 충돌을 하며, 충돌한 물체와 붙어서 튀지 않는다. (출처: 위키백과)

마찰력(friction)

마찰력은 두 물체의 접촉면 사이에서 물체의 운동을 방해하는 힘이다. 마찰력의 계수는 물질의 고유 성질이 아닌, 어떤 물체의 어떤 표면 상태에서 어떤 물질과 접촉하는가 등에 관계있으며 실험을 통해 결정되는 현상론적인 양이다. 교과서는 일반적으로 마찰력은 접촉면의 넓이에는 무관하다고 서술하나 이것은 접촉면이 이상적으로 매끄러운 경우에만 성립한다. 실제로는 접촉면의 매끄러운 정도 등에 따라 영향을 받는다. (출처: 위키백과)

질량(mass)

질량은 물리학에서 물질이 가지고 있는 고유한 양을 일컫는 말이다. 질량의 SI 단위는 킬로그램(kg)이다. (출처: 위키백과)

[20220925] 지오서비스웹 업데이트

지오서비스웹이 업데이트 되었습니다.

  • 지오코딩 결과(SHP)을 CSV로 변환할 수 있는 기능이 추가되었습니다.
  • 경위도 좌표 데이터를 포한한 CSV 파일을 SHP 파일로 변환할 수 있는 기능이 추가되었습니다.
  • 필드명이 한글 또는 10자보다 길 경우 자동으로 영문으로 변경하도록 하였습니다.
  • 지오코딩 등의 입력 데이터의 한글이 깨질 경우 이를 자동으로 해결할 수 있도록 하였습니다.
  • 이외에도 소소하고 다양한 편의성이 개선되었습니다.

이번 업데이트가 반영된 것을 확인하기 위해서는 로그인 화면에서 GEOSERVICE-WEB v1.0.1가 표시됩니다.

지오서비스웹의 지오코딩 기능이 개선되었습니다.

지오서비스웹을 이용하는 분들의 피드백과 사용한 지오코딩의 결과를 항상 분석하고 있습니다. 지오코딩 정확도와 사용자 편의성 개선을 위해서인데요. 보다 더 정확한 지오코딩 결과와 개선된 UI가 공개될 예정이며 그 중 개선된 UI에 대한 내용을 배포 전에 미리 공유합니다.

먼저 아래는 주소 데이터가 저장된 CSV 파일을 지오코딩을 하기 위해 표시한 화면입니다.

변경된 부분은 크게 3가지입니다. 첫째는 용어 변경이며 “인근좌표”가 “유사주소좌표”로 변경되었습니다. 둘째는 정제된 주소를 저장할 수 있는 선택 기능이 추가되었습니다. 셋째는 매칭코드 저장 기능입니다. 둘째와 셋째 기능은 지오코딩 결과를 검수하는데 매우 유용하게 사용될 수 있습니다.

위의 화면처럼 “정제된 주소”와 “매칭코드”를 체크하여 지오코딩 결과에 저장될 수 있도록 하였고 이 선택 사항으로 수행된 지오코딩 결과를 표시한 화면은 아래와 같습니다.

_GC_TYPE을 통해 지오코딩 결과 좌표가 정(정확한 좌표)인지, 유(유사한 주소의 좌표)인지, 대(대표좌표)인지를 파악할 수 있고, _CLEANADDR을 통해 사용자가 입력한 주소를 완전한 주소 체제에 맞게 정제된 주소를 확인할 수 있습니다. 그리고 _MATCH_CD 값이 있는데요.

_MATCH_CD는 사용자가 입력한 주소에서 명시적으로 입력된 주소 구성 요소(시도(C), 시군구(S), 읍면동(E), 리(L), 도로명(R), 산여부(S), 번지(N))로 사용된 요소를 나타냅니다.

예를들어 “중구 달성로 56″의 경우 _MATCH_CD가 _S__R_N인데요. 이는 시도(S), 도로명(R), 번지(N)이 입력주소에서 명시적으로 파악되어 지오코딩 처리시 사용되었다는 의미입니다.

아울러 입력 데이터인 CSV 파일을 UTF-8 형식으로 저장하지 않을 경우 한글깨짐 문제가 발생하는데, 이런 문제를 해결 하였습니다. 관련된 내용은 아래 영상 참조하시기 바랍니다.

지오서비스웹에서 제공하는 지오코딩 기능의 개선은 모두 이용자 분들의 피드백을 통해 이루어집니다. 지오서비스웹을 이용하시면서 느낀 경험 등을 피드백으로 제공해 주시면 참고해서 서비스 개선에 활용하도록 하겠습니다.