UV, OpenGL vs DirectX

텍스쳐의 좌표에 해당하는 UV에 대한 OpenGL과 DirectX의 비교

먼저 OpenGL에 대한 UV 내역

다음은 DirectX에 대한 UV 내역

babylon.js와 three.js는 WebGL 기반이고 WebGL은 OpenGL 기반이므로 OpenGL의 UV를 따름

위 이미지에 대한 출처 : https://www.puredevsoftware.com/blog/2018/03/17/texture-coordinates-d3d-vs-opengl/

바닐라 JS의 동적 스크립트 임포팅

바닐라 JS로 어떤 라이브러리를 동적으로 포함하고 해당 라이브러리가 완전히 로딩되었을때 코드를 실행하는 방식

const url = "https://~.min.js";
const htmlMeshScript = document.createElement("script");

htmlMeshScript.type = "module";
htmlMeshScript.src = url;

document.body.appendChild(htmlMeshScrip);

htmlMeshScript.onload = (event) => {
  console.log("loaded");
};

TypeScript의 배열로 Union Type 정의하기

다음과 같은 배열이 있다.

const SideTypes = [ "FRONT", "BACK", "DOUBLE" ] as const;

위의 배열 객체를 가지고 FRONT와 BACK 또는 DOUBLE 문자열을 갖는 Union Type을 정의하는 코드는 다음과 같다. (as const를 반드시 붙여야 한다.)

type OptionType = {
  side: typeof SideTypes[number];
};

즉, 위의 코드는 아래와 코드와 동일하다. 하지만 아래처럼하면 배열 객체의 값과 유니온 타입을 정의하기 위한 값에 대한 코드가 중복되는 문제가 있다. 이는 반드시 고쳐야 하는 아주 나쁜 리펙토링 대상이다.

type OptionType = {
  side: "FRONT" | "BACK" | "DOUBLE";
};

이제 OptionType은 다음처럼 사용될 수 있다.

const options: OptionType = {
  side: "FRONT"
};

이제 lil-gui 라이브러리에서 다음처럼 효과적인 코드로 작성될 수 있다.

const gui = new GUI();
gui.add(options, "side", SideTypes).onChange(v => {
  if(v === "FRONT") {
    material.side = THREE.FrontSide;
  } else if(v === "BACK") {
    material.side = THREE.BackSide;
  } else if(v === "DOUBLE") {
    material.side = THREE.DoubleSide;
  }
});

위의 코드가 적용된 실행 화면인데, 화면의 우측 상단의 GUI를 위해 적용된 코드다.