법선 벡터의 변환을 위한 법선 행렬

3차원에서, 광원에 의한 물체 표면의 표현을 위해 표면에 수직인 법선 벡터를 고려하게 됩니다. 쉽게 생각해 보면, 물체를 구성하는 좌표에 대한 모델뷰 행렬(M)을 이용해 법선 벡터를 변환하는 것으로 충분할듯하지만 아래처럼 어파인(Affine) 변환 중 y축에 대한 크기 변환을 수행했을 경우, 법선 벡터를 모델뷰 행렬로 변환하면, 표면 벡터(S)와 법선 벡터(N)이 더 이상 수직이 아님을 쉽게 알 수 있습니다.

그렇다면 물체에 대해서 어떠한 어파인 변환을 수행하더라도 법선 백터의 고유한 특성, 즉 표면 벡터와 수직인 성질을 유지할 수 있을까하는 것에 대해 정리를 해 봅니다.

먼저 법선 벡터와 표면 벡터는 수직이므로 이 두 벡터의 내적은 0입니다. 즉, 아래와 같습니다.

물체는 모델뷰 행렬에 의해 변환됩니다. 즉, 물체의 표면 역시 모델뷰 행렬에 의해 정확히 변환됩니다. 모델뷰 행렬이 M, 표면 벡터를 S, 변환된 표면 벡터를 S’라고 하면 다음과 같습니다.

위와 같은 맥락으로, 법선 벡터 N이 법선 벡터로써의 특성을 유지하면서 새롭게 변환된 법선 벡터를 N’라고 할때, 법선 벡터로써의 특성을 유지하면서 변환해 주는 행렬, 즉 법선 행렬을 K라고 하면 다음과 같습니다.

법선 벡터의 특성, 즉 변환된 후의 표면 벡터인 S’와 법선 벡터인 N’는 수직이여야 하므로 다음과 같습니다.

S’=MS 그리고 N’=KN이라고 했으므로 바로 위의 식에 각각 대입하면 다음과 같습니다.

벡터의 기본 성질 중, 벡터의 내적의 결과는 첫번째 벡터의 전치에 의한 벡터의 단순 곱과 같으므로 위의 식은 아래와 같습니다.

벡터 곱에 대한 전치는 각 벡터의 전치에 대한 역순의 곱과 같으므로 다음의 첫번째 식과 같습니다.

위의 첫째 식은 순차적으로 2번째와 세번째 식으로 변환이 가능합니다. 위의 식중 세번째 식을 “주식”이라고 하겠습니다. S와 N의 내적의 표현은 S의 전치와 N의 곱과 같고, S와 N의 내적의 결과는 0이므로 다음과 같습니다.

위의 식과 앞서 “주식”이라고 했던 식을 함께 살펴보면, 다음의 결과과 같은 식을 얻을 수 있습니다.

위의 식에서 양변에 M의 전치 행렬에 대한 역행렬을 곱해 주면 최종적으로 K 행렬을 다음처럼 얻을 수 있습니다.

위의 식은 행렬의 기본 성질에 의해 다음과 같습니다.

즉, 어떤 변환(M)에 의해 법선 벡터가 그 고유한 특성을 유지할 수 있는 변환을 위한 행렬인 법선행렬은 모델뷰 행렬의 역행렬에 대한 전치 행렬과 같다는 것을 알 수 있습니다.

[스마트그리드] IEC 61850 표준규격에서 정의된 SCL 예

IEC 61850은 변전소의 모니터링, 제어 등을 위한 표준화된 통신기술로써, 변전소에 대한 재원을 기술하는 언어인 SCL(Substation Configuration description Language)을 정의하고 있습니다. XML 기반이므로 쉽게 읽을 수 있고 쓸 수 있습니다.

아래는 SCL에 대한 코드 예인데요.


    
        
            
                
                
            
            
                
                
            
        
    

위의 SCL에 대해 기술된 변전소의 재원은 E1-Q1이라는 이름의 Bay에서 차단기 QA1과 단로기 QB1은 모두 L1이라는 노드에 연결되어 있다는 내용입니다. QA1이 차단기라는 것은 CBR Type 속성을 갖기 때문이고, QB1이 단로기라는 것은 DIS Type 속성을 갖기 때문입니다.

이 글은 차세대전력기술연구센터의 김태완님이 작성한 IEC 61850에 대한 소개에서 가져왔습니다.

[Java] File에 대한 Zip 압축

여러개의 파일들을 하나의 Zip 파일로 압축하는 자바 코드입니다.

String zipFileName = "c:/file.zip";

String[] files = new String[3];

files[0] = "c:/a.so";
files[1] = "c:/b.dat";
files[2] = "c:/c.cfg";
		
byte[] buf = new byte[4096];

try {
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));

    for (int i=0; i<files.length; i++) {
        FileInputStream in = new FileInputStream(files[i]);
        Path p = Paths.get(files[i]);
        String fileName = p.getFileName().toString();
	        	
        ZipEntry ze = new ZipEntry(fileName);
        out.putNextEntry(ze);
	      
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
	      
        out.closeEntry();
        in.close();

    }
	      
    out.close();
} catch (IOException e) {
    e.printStackTrace();
}

a.so, a.dat, c.cfg 파일 세개를 file.zip으로 압축합니다. 특히, 19번 코드의 ZipEntry의 생성자의 인자에 경로가 들어갈 경우 압축 파일 내부에도 동일한 경로가 형성됩니다. 코드 최저화는 각자의 몫으로 남겨 둡니다.

참고로 위의 클래스들을 위해 필요한 import 문의 삽입을 위해 이클립스에서는 ^~O (Ctrl+Shift+O)를 입력하시면 됩니다.

건축물 용도별 전국 건물 SHP 파일 다운로드

대한민국, 전국의 약 천만개 이상 건물축에 대해서 용도별로 분류된 SHP 파일입니다. 용도별 270 종류 이상이며, 데이터 용량은 비압축시 약 4GB 이상입니다.

용도별 종류에 대한 구체적인 내용은 SHP 파일의 이름으로 명시하였으므로 다운로드 받아 살펴 보시기 바랍니다. 아울러 건축물에 대한 속성 정보는 아래와 같습니다.

좌표계는 UTM-K GRS80 타원체이며 .prj 파일은 다음과 같습니다.

PROJCS["PCS_ITRF2000_TM",GEOGCS["GCS_ITRF_2000",DATUM["D_ITRF_2000",
SPHEROID["GRS_1980",6378137.0,298.257222101]], PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],
PARAMETER["False_Easting",1000000.0],PARAMETER["False_Northing",2000000.0],
PARAMETER["Central_Meridian",127.5],PARAMETER["Scale_Factor",0.9996],
PARAMETER["Latitude_Of_Origin",38.0],UNIT["Meter",1.0]]

자료의 출처는 안전행정부의 공개DB인 도로명주소 DB(2015년 6월자)입니다. 다운로드 URL은 아래와 같습니다.