inspired by computer graphic courses and practice webgl (three.js)