three.js의 보다 사실적인 유리 재질을 위한 dispersion 속성

어떤 유리를 보면 유리의 내부에서 마치 프리즘처럼 빛이 산란되어 보이는 경우가 있습니다. 유리를 마냥 투명하게만 표현하면 간혹 있는지 없는지스러운 느낌없는 느낌으로 표현되고 마는데요. 이때를 위해 재질의 속성 중 dispersion을 활용할 수 있습니다. 이 속성은 오직 MeshPhysicalMaterial에서만 제공된다는 안타까운 점은 있지만 유리와 같은 재질은 한두개만 만들어두고 재활용하는 경우가 대부분이므로 충분히 활용할만합니다.

아래 이미지는 dispersion에 대한 값 변화에 따른 표현입니다. (이미지 출처: three.js examples)

번외로 흔히 손쉽지만 매우 효과적인 광원으로 HDRi를 사용하는데요. 이는 정적인 데이터 파일을 이용하는 경우고 데이터 없이 이와 유사한 광원을 만들어 내는 방법이 있습니다. 바로 RoomEnvironment 확장 기능인데요. 이 클래스는 Scene을 상속받는 것으로 Scene으로 구성된 내용으로 PMREM 데이터(환경맵 데이터의 한 종류)를 생성할 수 있습니다. 이에 대해 관련된 코드는 다음과 같습니다. 즉, 아래의 코드가 있다면 별도의 광원이 필요하지 않습니다. 단, 그림자 표현을 위해서는 별도의 광원이 필요합니다.

const environment = new RoomEnvironment();
const pmremGenerator = new THREE.PMREMGenerator(this._renderer);
const env = pmremGenerator.fromScene(environment).texture;
this._scene.background = env;
this._scene.environment = env;
this._scene.backgroundBlurriness = 0.5;
environment.dispose();

값이 저장된 메모리 주소 얻기, 특정 메모리 주소에 저장된 값 얻기

요즘 같은 개발 환경에서 메모리의 주소를 직접 얻고 해당 메모리에 저장된 값을 읽는 코드를 …? 러스트 프로그래밍 언어에서 …

먼저 어떤 값에 대한 메모리 주소를 얻는 코드는 다음과 같습니다.

fn main() {
    let a = 3224;
    let mut memory_location = (&a as *const i32) as usize;
    
    println!("데이터 저장 메모리 주소 : {}", memory_location);

memory_location이 3224 값이 바인딩된 a의 주소값을 담고 있습니다. 이제 memory_location 값(주소)에 저장된 값을 읽는 코드는 다음과 같습니다.

    unsafe  {
        let v = *(memory_location as *const i32);
        println!("메모리 주소({memory_location})에 저장된 값: {}", v);

        memory_location += 4;
        let v = *(memory_location as *const i32);
        println!("메모리 주소({memory_location})에 저장된 값: {}", v);
    }
}

메모리 주소를 통한 값의 직접적 참조는 매우 매우 위험한 행위이므로 반드시 unsafe 코드임을 명시해야 합니다.

사용자 정의 데이터에 대한 println!의 출력

Rust에서 내가 정의한 데이터를 println!를 이용해 화면에 출력하기 위해서는 반드시 std::fmt::Display 트레이트를 구현해야 합니다. 먼저 다음과 같은 MyStruct라는 데이터를 정의합니다.

struct MyStruct {
    name: String,
    age: u16,
}

fn main() {
    let o = MyStruct {
        name: String::from("Ferris"),
        age: 17,
    };

    println!("{}", o);
}

위의 코드 12번은 에러를 발생하는데, 이는 MyStruct 타입의 o 객체를 콘솔에 출력하기 위해서는 MyStruct에 대해 std::fmt::Display 트레이트를 구현하지 않았기 때문입니다. 정상적으로 작동하기 위해서 위의 코드에 대해 다음처럼 보완하면 됩니다.

use std::fmt;

struct MyStruct { ... }

impl fmt::Display for MyStruct {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "name: {}, age: {}", self.name, self.age)
    }
}

fn main() {
    let ferris = ...

    println!("{}", ferris);
}

JavaScript, 객체의 프로퍼티 개수 얻기

Object 타입의 객체에 대한 프로퍼티의 개수를 얻기 위해서 다음처럼 접근할 수 있습니다.

const obj = { .... };

let result = 0;
for (let fid in rows) {
  result++;
}

느낌이 쎄합니다. 다행히 다음과 같은 매우 효과적인 방식이 있습니다.

Object.keys(obj).length