Python 가상환경 만들고 VS.Code에서 사용하기

가상환경 생성하고 VS.Code에서 원하는 가상환경을 선택하도록 하는 과정을 정리해 둡니다.

일단 콘설창을 실행하고, 생성하고자 하는 가상환경 가상환경이 저장될 폴더로 이동한 뒤 아래의 명령을 입력합니다.

python -m venv python_virtualenv

그러면 python_virtualenv 폴더가 생성된 것을 확인할 수 있습니다. 여기까지가 파이선에서 가상환경 생성의 전부입니다.

이제 VS.Code에서 이 가성환경을 통해 코드를 실행하기 위한 설정입니다.

VS.Code를 실행하고 단축키 F1를 누르면 Python에 대한 인터프리터를 선택할 수 있는 항목이 표시됩니다. 이 항목을 클릭합니다.

“+ 인터프리터 경로 입력…”을 클릭하고 “찾기…”에서 이전에 생성한 가상환경 폴더에 위치한 Scripts/python.exe 파일을 선택합니다.

이제 새로운 터미널이 표시될때마다 다음처럼 가상환경 이름 표시와 함께 명령 프롬프트가 표시됩니다.

그리고 GDAL 설치는 다음과 같습니다.

먼저 WHL 파일을 다운로드(https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal) 받고 다음 명령으로 설치하면 됩니다.

pip install .\GDAL-3.4.3-cp311-cp311-win_amd64.whl

GDAL API를 JAVA에서 사용하기 (Windows 환경)

#1 컴파일된 GDAL 다운로드

다음 사이트를 통해 미리 컴파일된 GDAL을 내려 받는다. MSVC2022로 컴파일된 x64를 선택한 뒤 release-1930-x64-gdal-3-5-3-mapserver-8-0-0.zip를 다운로드 받았음 : https://www.gisinternals.com/release.php

#2 GDAL dll의 PATH 지정

내려받은 파일의 압축을 풀면 bin 폴더에 gdal에 대해 컴파일된 dll 파일이 존재하는데, 이 bin 폴더를 path에 지정한다. (gdalalljni.dll에서 이 폴더의 dll을 참조함)

#3 이클립스에서 라이브러리 참조 및 glue dll 참조 설정

bin/gdal/java 폴더에는 gdal.jar와 gdal에 대한 glue dll인 gdalalljni.dll이 존재하는 것을 확인할 수 있다. 이클립스에서 프로젝트를 생성하고 라이브러리로 gdal.jar를 참조한다. 그리고 gdal.jar가 참조하는 gdalalljni.dll 파일을 JRE가 파악할 수 있도록 이 파일의 경로(d:/path1/path2 라고 하자)를 VM arguments에 -Djava.library.path=d:/path1/path2 를 입력한다. (만약 path에 이 경로가 지정되어 있다면 생략해도 됨)

#4 코드 테스트

테스트 코드는 다음과 같다.

package tstGDAL;

import org.gdal.gdal.Dataset;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;

public class MainEntry {
    Dataset hDataset;
    int numBands;
	 
    public MainEntry(String filename) {
        gdal.AllRegister();
        hDataset = gdal.Open(filename, gdalconstConstants.GA_ReadOnly);
        this.numBands = hDataset.getRasterCount();
    }
	 
    public static void main(String[] args) {
        String path = "d:/sample.tif";
        MainEntry instance = new MainEntry(path);
        System.out.println(instance.numBands);
    }
}

복잡한 계단 난간 모델링 최적화하기

아래와 같은 복잡한 계단 난간을 모델링할때 난간 벽면과 바닥에 대한 철재 부분의 세밀한 부분도 모두 모델링한다면 매우 많은 정점과 면으로 구성된 모델이 나올 것이고 이를 웹에서 인터렉티브하게 시각화할 경우 속도 측면에서 그 효율성은 매우 떨어질 것입니다.

위의 모델에 대한 최적화된 모델링을 위해서는 먼저 계단 난간의 벽면과 바닥에 대해 매우 세밀한 모델링을 다음처럼 구축합니다.

그리고 위의 벽면과 바닥에 대한 텍스쳐를 2개 베이킹하는데요. 하나는 노말맵 또 하나는 알파맵입니다.

그리고 다음과 같은 모델에 위의 텍스쳐를 맵핑 시킵니다.

맵핑은 다음과 같은 쉐이더 노드로 구성합니다.

위의 쉐이더 노드 구성 시에 Blend Mode를 Alpha Clip으로 지정해서 알파값에 대한 임계값(Clip Threshold)을 직접 지정할 수 있도록 해야 합니다.

간단하게 Eevee로 렌더링된 결과는 다음과 같습니다.

JSZip에서 파일명이 한글인 파일을 압축한 파일 읽기

JSZip은 웹에서 zip 압축 파일을 생성하거나 풀 때 사용하는 라이브러리인데, 기본적으로 압축 파일 안의 파일 명이 한글일 때 파일 명이 깨진다. 그런데 이 문제를 해결할 수 있다. iconv 라이브러리를 사용하면 되고 JSZip은 내부적으로 iconv 라이브러리와 연계하여 압축 파일 안의 파일 명이 한글일때 문제점을 해결해 주는 API를 지원한다. 코드는 다음과 같다.

const zip = new JSZip();
zip.loadAsync(aBuf, {
    decodeFileName: function (bytes) {
        return iconv.decode(bytes, "euc-kr");
    }
}).then((zip) => {
    for(let file of Object.values(zip.files)) {
        console.log(file.name);
    }
});

AO, Normal 맵을 이용한 건물 모델링 최적화

건물을 3차원으로 웹에서 시각화하기 위해 고려해야할 것 중 하나는 면(Face) 수를 최소화해야 한다는 것입니다. 그러나 면을 최소화시키면 건물에 대한 세밀한 부분이 소실되는 문제가 발생되므로 면 수의 최소화는 어느 정도 타협이 필요한 부분입니다. 여기서 면의 수를 최소화하면서 건물의 세밀한 부분까지도 효과적으로 표현하기 위한 방법은 먼저 건물의 세세한 부분까지 모델링을 하고 이 세세한 부분에 대해 텍스쳐 이미지로 만들어(Baking이라고 함) 적용하면 두마리의 토끼를 모두 잡을 수 있습니다.

위의 설명에 대한 아래의 예시를 보면 좀더 이해가 쉽습니다.

위의 이미지에서 창만 안쪽의 블라인더는 실제 모델링으로 시각화한게 아닌 이미지 텍스쳐를 통해 표현되고 있습니다. 원래 이 블러인더는 텍스쳐 이미지로 베이킹 하기 위해 먼저 다음처럼 모델링되었습니다.

그리고 위의 블라인더 모델을 통해 먼저 AO(Ambient Occlusion) 맵을 베이킹하고 다음에는 Normal 맵을 베이킹하여 텍스쳐 이미지로 사용해 최종 모델을 생성하였습니다. 아래가 두 이미지를 텍스쳐 맵핑으로 적용한 쉐이더 구성입니다.

먼저 AO 맵은 얻기 위한 블라인더 모델에 적용한 재질은 다음과 같습니다. 카메라는 정사투영 카메라를 사용하여 이미지의 왜곡이 나타나지 않도록 해야 합니다.

그리고 Normal 맵은 Workbench 렌더링 엔진을 이용하여 Normal 색상의 MapCap 재질을 이용하여 렌더링하여 생성합니다.

최종적으로 만들어진 AO와 Normal 맵은 다음과 같습니다.