├── .gitignore
├── lesson_1
├── index.html
└── script.js
├── lesson_2
├── index.html
└── script.js
├── three.min.js
└── threejs_main
├── .gitignore
├── bundler
├── webpack.common.js
├── webpack.dev.js
└── webpack.prod.js
├── package-lock.json
├── package.json
├── src
├── index.html
├── script.js
└── style.css
└── static
├── models
├── Duck
│ ├── Duck.gltf
│ ├── Duck0.bin
│ └── DuckCM.png
└── fox
│ ├── Fox.bin
│ ├── Fox.gltf
│ └── Texture.png
└── textures
├── checkerboard-1024x1024.png
├── checkerboard-8x8.png
├── door
├── alpha.jpg
├── ambientOcclusion.jpg
├── color.jpg
├── height.jpg
├── metalness.jpg
├── normal.jpg
└── roughness.jpg
├── lava
├── ambientOcclusion.jpg
├── basecolor.jpg
├── emissive.jpg
├── height.png
├── normal.jpg
└── roughness.jpg
└── minecraft.png
/.gitignore:
--------------------------------------------------------------------------------
1 | # ---- VisualStudioCode ----
2 | .vscode/*
3 | .vscode
4 | !.vscode/settings.json
5 | !.vscode/tasks.json
6 | !.vscode/launch.json
7 | !.vscode/extensions.json
8 | !.vscode/*.code-snippets
9 |
10 | # Local History for Visual Studio Code
11 | .history/
12 |
13 | # Built Visual Studio Code Extensions
14 | *.vsix
15 |
16 | # ---- macOS ----
17 | # General
18 | .DS_Store
19 | .AppleDouble
20 | .LSOverride
21 |
22 | # Icon must end with two \r
23 | Icon
24 |
25 |
26 | # Thumbnails
27 | ._*
28 |
29 | # Files that might appear in the root of a volume
30 | .DocumentRevisions-V100
31 | .fseventsd
32 | .Spotlight-V100
33 | .TemporaryItems
34 | .Trashes
35 | .VolumeIcon.icns
36 | .com.apple.timemachine.donotpresent
37 |
38 | # Directories potentially created on remote AFP share
39 | .AppleDB
40 | .AppleDesktop
41 | Network Trash Folder
42 | Temporary Items
43 | .apdisk
44 |
45 | # ---- Node ----
46 | # Logs
47 | logs
48 | *.log
49 | npm-debug.log*
50 | yarn-debug.log*
51 | yarn-error.log*
52 | lerna-debug.log*
53 | .pnpm-debug.log*
54 |
55 | # Diagnostic reports (https://nodejs.org/api/report.html)
56 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
57 |
58 | # Runtime data
59 | pids
60 | *.pid
61 | *.seed
62 | *.pid.lock
63 |
64 | # Directory for instrumented libs generated by jscoverage/JSCover
65 | lib-cov
66 |
67 | # Coverage directory used by tools like istanbul
68 | coverage
69 | *.lcov
70 |
71 | # nyc test coverage
72 | .nyc_output
73 |
74 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
75 | .grunt
76 |
77 | # Bower dependency directory (https://bower.io/)
78 | bower_components
79 |
80 | # node-waf configuration
81 | .lock-wscript
82 |
83 | # Compiled binary addons (https://nodejs.org/api/addons.html)
84 | build/Release
85 |
86 | # Dependency directories
87 | node_modules/
88 | jspm_packages/
89 |
90 | # Snowpack dependency directory (https://snowpack.dev/)
91 | web_modules/
92 |
93 | # TypeScript cache
94 | *.tsbuildinfo
95 |
96 | # Optional npm cache directory
97 | .npm
98 |
99 | # Optional eslint cache
100 | .eslintcache
101 |
102 | # Optional stylelint cache
103 | .stylelintcache
104 |
105 | # Microbundle cache
106 | .rpt2_cache/
107 | .rts2_cache_cjs/
108 | .rts2_cache_es/
109 | .rts2_cache_umd/
110 |
111 | # Optional REPL history
112 | .node_repl_history
113 |
114 | # Output of 'npm pack'
115 | *.tgz
116 |
117 | # Yarn Integrity file
118 | .yarn-integrity
119 |
120 | # dotenv environment variable files
121 | .env
122 | .env.development.local
123 | .env.test.local
124 | .env.production.local
125 | .env.local
126 |
127 | # parcel-bundler cache (https://parceljs.org/)
128 | .cache
129 | .parcel-cache
130 |
131 | # Next.js build output
132 | .next
133 | out
134 |
135 | # Nuxt.js build / generate output
136 | .nuxt
137 | dist
138 |
139 | # Gatsby files
140 | .cache/
141 | # Comment in the public line in if your project uses Gatsby and not Next.js
142 | # https://nextjs.org/blog/next-9-1#public-directory-support
143 | # public
144 |
145 | # vuepress build output
146 | .vuepress/dist
147 |
148 | # vuepress v2.x temp and cache directory
149 | .temp
150 | .cache
151 |
152 | # Docusaurus cache and generated files
153 | .docusaurus
154 |
155 | # Serverless directories
156 | .serverless/
157 |
158 | # FuseBox cache
159 | .fusebox/
160 |
161 | # DynamoDB Local files
162 | .dynamodb/
163 |
164 | # TernJS port file
165 | .tern-port
166 |
167 | # Stores VSCode versions used for testing VSCode extensions
168 | .vscode-test
169 |
170 | # yarn v2
171 | .yarn/cache
172 | .yarn/unplugged
173 | .yarn/build-state.yml
174 | .yarn/install-state.gz
175 | .pnp.*
176 |
--------------------------------------------------------------------------------
/lesson_1/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Курс three.js
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/lesson_1/script.js:
--------------------------------------------------------------------------------
1 | const camera = new THREE.PerspectiveCamera(
2 | 70,
3 | window.innerWidth / window.innerHeight,
4 | 0.01,
5 | 10
6 | );
7 | camera.position.z = 1;
8 |
9 | const scene = new THREE.Scene();
10 |
11 | const geometry = new THREE.BoxGeometry(0.2, 0.2, 0.2);
12 | const material = new THREE.MeshNormalMaterial();
13 |
14 | const mesh = new THREE.Mesh(geometry, material);
15 | scene.add(mesh);
16 |
17 | const renderer = new THREE.WebGLRenderer({ antialias: true });
18 | renderer.setSize(window.innerWidth, window.innerHeight);
19 | renderer.setAnimationLoop(animation);
20 | document.body.appendChild(renderer.domElement);
21 |
22 | // animation
23 |
24 | function animation(time) {
25 | mesh.rotation.x = time / 2000;
26 | mesh.rotation.y = time / 1000;
27 |
28 | renderer.render(scene, camera);
29 | }
30 |
31 | console.log(THREE);
32 |
--------------------------------------------------------------------------------
/lesson_2/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Курс three.js
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/lesson_2/script.js:
--------------------------------------------------------------------------------
1 | // Сцена
2 | const scene = new THREE.Scene();
3 |
4 | // Объект
5 | const geometry = new THREE.BoxGeometry(1, 1, 1);
6 | const material = new THREE.MeshBasicMaterial({ color: 'purple' });
7 | const mesh = new THREE.Mesh(geometry, material);
8 |
9 | scene.add(mesh);
10 |
11 | // Камера
12 | const sizes = {
13 | width: 600,
14 | height: 600,
15 | };
16 | const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height);
17 | camera.position.z = 3;
18 | camera.position.y = 1;
19 |
20 | scene.add(camera);
21 |
22 | const canvas = document.querySelector('.canvas');
23 |
24 | const renderer = new THREE.WebGLRenderer({ canvas });
25 |
26 | renderer.setSize(sizes.width, sizes.height);
27 |
28 | renderer.render(scene, camera);
29 |
--------------------------------------------------------------------------------
/threejs_main/.gitignore:
--------------------------------------------------------------------------------
1 | # ---- macOS ----
2 | # General
3 | .DS_Store
4 | .AppleDouble
5 | .LSOverride
6 |
7 | # Icon must end with two \r
8 | Icon
9 |
10 |
11 | # Thumbnails
12 | ._*
13 |
14 | # Files that might appear in the root of a volume
15 | .DocumentRevisions-V100
16 | .fseventsd
17 | .Spotlight-V100
18 | .TemporaryItems
19 | .Trashes
20 | .VolumeIcon.icns
21 | .com.apple.timemachine.donotpresent
22 |
23 | # Directories potentially created on remote AFP share
24 | .AppleDB
25 | .AppleDesktop
26 | Network Trash Folder
27 | Temporary Items
28 | .apdisk
29 |
30 | # ---- Node ----
31 | # Logs
32 | logs
33 | *.log
34 | npm-debug.log*
35 | yarn-debug.log*
36 | yarn-error.log*
37 | lerna-debug.log*
38 | .pnpm-debug.log*
39 |
40 | # Diagnostic reports (https://nodejs.org/api/report.html)
41 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
42 |
43 | # Runtime data
44 | pids
45 | *.pid
46 | *.seed
47 | *.pid.lock
48 |
49 | # Directory for instrumented libs generated by jscoverage/JSCover
50 | lib-cov
51 |
52 | # Coverage directory used by tools like istanbul
53 | coverage
54 | *.lcov
55 |
56 | # nyc test coverage
57 | .nyc_output
58 |
59 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
60 | .grunt
61 |
62 | # Bower dependency directory (https://bower.io/)
63 | bower_components
64 |
65 | # node-waf configuration
66 | .lock-wscript
67 |
68 | # Compiled binary addons (https://nodejs.org/api/addons.html)
69 | build/Release
70 |
71 | # Dependency directories
72 | node_modules/
73 | jspm_packages/
74 |
75 | # Snowpack dependency directory (https://snowpack.dev/)
76 | web_modules/
77 |
78 | # TypeScript cache
79 | *.tsbuildinfo
80 |
81 | # Optional npm cache directory
82 | .npm
83 |
84 | # Optional eslint cache
85 | .eslintcache
86 |
87 | # Optional stylelint cache
88 | .stylelintcache
89 |
90 | # Microbundle cache
91 | .rpt2_cache/
92 | .rts2_cache_cjs/
93 | .rts2_cache_es/
94 | .rts2_cache_umd/
95 |
96 | # Optional REPL history
97 | .node_repl_history
98 |
99 | # Output of 'npm pack'
100 | *.tgz
101 |
102 | # Yarn Integrity file
103 | .yarn-integrity
104 |
105 | # dotenv environment variable files
106 | .env
107 | .env.development.local
108 | .env.test.local
109 | .env.production.local
110 | .env.local
111 |
112 | # parcel-bundler cache (https://parceljs.org/)
113 | .cache
114 | .parcel-cache
115 |
116 | # Next.js build output
117 | .next
118 | out
119 |
120 | # Nuxt.js build / generate output
121 | .nuxt
122 | dist
123 |
124 | # Gatsby files
125 | .cache/
126 | # Comment in the public line in if your project uses Gatsby and not Next.js
127 | # https://nextjs.org/blog/next-9-1#public-directory-support
128 | # public
129 |
130 | # vuepress build output
131 | .vuepress/dist
132 |
133 | # vuepress v2.x temp and cache directory
134 | .temp
135 | .cache
136 |
137 | # Docusaurus cache and generated files
138 | .docusaurus
139 |
140 | # Serverless directories
141 | .serverless/
142 |
143 | # FuseBox cache
144 | .fusebox/
145 |
146 | # DynamoDB Local files
147 | .dynamodb/
148 |
149 | # TernJS port file
150 | .tern-port
151 |
152 | # Stores VSCode versions used for testing VSCode extensions
153 | .vscode-test
154 |
155 | # yarn v2
156 | .yarn/cache
157 | .yarn/unplugged
158 | .yarn/build-state.yml
159 | .yarn/install-state.gz
160 | .pnp.*
161 |
--------------------------------------------------------------------------------
/threejs_main/bundler/webpack.common.js:
--------------------------------------------------------------------------------
1 | const CopyWebpackPlugin = require('copy-webpack-plugin');
2 | const HtmlWebpackPlugin = require('html-webpack-plugin');
3 | const MiniCSSExtractPlugin = require('mini-css-extract-plugin');
4 | const path = require('path');
5 |
6 | module.exports = {
7 | entry: path.resolve(__dirname, '../src/script.js'),
8 | output:
9 | {
10 | hashFunction: 'xxhash64',
11 | filename: 'bundle.[contenthash].js',
12 | path: path.resolve(__dirname, '../dist')
13 | },
14 | devtool: 'source-map',
15 | plugins:
16 | [
17 | new CopyWebpackPlugin({
18 | patterns: [
19 | {
20 | from: path.resolve(__dirname, '../static'),
21 | noErrorOnMissing: true
22 | }
23 | ]
24 | }),
25 | new HtmlWebpackPlugin({
26 | template: path.resolve(__dirname, '../src/index.html'),
27 | minify: true
28 | }),
29 | new MiniCSSExtractPlugin()
30 | ],
31 | module:
32 | {
33 | rules:
34 | [
35 | {
36 | test: /\.(html)$/,
37 | use:
38 | [
39 | 'html-loader'
40 | ]
41 | },
42 | {
43 | test: /\.js$/,
44 | exclude: /node_modules/,
45 | use:
46 | [
47 | 'babel-loader'
48 | ]
49 | },
50 | {
51 | test: /\.css$/,
52 | use:
53 | [
54 | MiniCSSExtractPlugin.loader,
55 | 'css-loader'
56 | ]
57 | },
58 | {
59 | test: /\.(jpg|png|gif|svg)$/,
60 | type: 'asset/resource',
61 | generator:
62 | {
63 | filename: 'assets/images/[hash][ext]'
64 | }
65 | },
66 | {
67 | test: /\.(ttf|eot|woff|woff2)$/,
68 | type: 'asset/resource',
69 | generator:
70 | {
71 | filename: 'assets/fonts/[hash][ext]'
72 | }
73 | }
74 | ]
75 | }
76 | };
--------------------------------------------------------------------------------
/threejs_main/bundler/webpack.dev.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const { merge } = require('webpack-merge');
3 | const commonConfiguration = require('./webpack.common.js');
4 | const ip = require('ip');
5 |
6 | const infoColor = (message) =>
7 | `\u001b[1m\u001b[34m${message}\u001b[39m\u001b[22m`;
8 |
9 | module.exports = merge(commonConfiguration, {
10 | stats: 'errors-warnings',
11 | mode: 'development',
12 | infrastructureLogging: {
13 | level: 'warn',
14 | },
15 | devServer: {
16 | host: 'localhost',
17 | port: 3000,
18 | open: true,
19 | https: false,
20 | allowedHosts: 'all',
21 | hot: true,
22 | watchFiles: ['src/**', 'static/**'],
23 | static: {
24 | watch: true,
25 | directory: path.join(__dirname, '../static'),
26 | },
27 | client: {
28 | logging: 'none',
29 | overlay: true,
30 | progress: false,
31 | },
32 | onAfterSetupMiddleware: function (devServer) {
33 | const port = devServer.options.port;
34 | const https = devServer.options.https ? 's' : '';
35 | const localIp = ip.address();
36 | const domain1 = `http${https}://${localIp}:${port}`;
37 | const domain2 = `http${https}://localhost:${port}`;
38 |
39 | console.log(
40 | `Проект запущен на:\n - ${infoColor(domain1)}\n - ${infoColor(
41 | domain2
42 | )}`
43 | );
44 | },
45 | },
46 | });
47 |
--------------------------------------------------------------------------------
/threejs_main/bundler/webpack.prod.js:
--------------------------------------------------------------------------------
1 | const { merge } = require('webpack-merge');
2 | const commonConfiguration = require('./webpack.common.js');
3 | const { CleanWebpackPlugin } = require('clean-webpack-plugin');
4 |
5 | module.exports = merge(commonConfiguration, {
6 | mode: 'production',
7 | plugins: [new CleanWebpackPlugin()],
8 | });
9 |
--------------------------------------------------------------------------------
/threejs_main/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "threejs_main",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --config ./bundler/webpack.prod.js",
8 | "start": "webpack serve --config ./bundler/webpack.dev.js",
9 | "test": "echo \"Error: no test specified\" && exit 1"
10 | },
11 | "keywords": [],
12 | "author": "",
13 | "license": "ISC",
14 | "devDependencies": {
15 | "@babel/core": "^7.22.1",
16 | "@babel/preset-env": "^7.22.4",
17 | "babel-loader": "^9.1.2",
18 | "clean-webpack-plugin": "^4.0.0",
19 | "copy-webpack-plugin": "^11.0.0",
20 | "css-loader": "^6.8.1",
21 | "file-loader": "^6.2.0",
22 | "html-loader": "^4.2.0",
23 | "html-webpack-plugin": "^5.5.1",
24 | "ip": "^1.1.8",
25 | "mini-css-extract-plugin": "^2.7.6",
26 | "portfinder-sync": "^0.0.2",
27 | "raw-loader": "^4.0.2",
28 | "style-loader": "^3.3.3",
29 | "webpack": "^5.86.0",
30 | "webpack-cli": "^5.1.4",
31 | "webpack-dev-server": "^4.15.0",
32 | "webpack-merge": "^5.9.0"
33 | },
34 | "dependencies": {
35 | "lil-gui": "^0.18.2",
36 | "stats.js": "^0.17.0",
37 | "three": "^0.153.0"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/threejs_main/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Курс three.js
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/threejs_main/src/script.js:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three';
2 | import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
3 | import Stats from 'stats.js';
4 | import * as dat from 'lil-gui';
5 | import './style.css';
6 |
7 | const scene = new THREE.Scene();
8 | const canvas = document.querySelector('.canvas');
9 |
10 | const stats = new Stats();
11 | stats.showPanel(0);
12 | document.body.appendChild(stats.dom);
13 |
14 | const sizes = {
15 | width: window.innerWidth,
16 | height: window.innerHeight,
17 | };
18 |
19 | const cursor = {
20 | x: 0,
21 | y: 0,
22 | };
23 |
24 | const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height);
25 | camera.position.z = 5;
26 | camera.position.y = 0.8;
27 |
28 | const controls = new OrbitControls(camera, canvas);
29 | controls.enableDamping = true;
30 |
31 | scene.add(camera);
32 |
33 | const gui = new dat.GUI({ closeFolders: true, width: 200 });
34 |
35 | const textureLoader = new THREE.TextureLoader();
36 | const color = textureLoader.load('/textures/lava/basecolor.jpg');
37 | const roughness = textureLoader.load('/textures/lava/roughness.jpg');
38 | const norm = textureLoader.load('/textures/lava/normal.jpg');
39 | const ao = textureLoader.load('/textures/lava/ambientOcclusion.jpg');
40 | const emissive = textureLoader.load('/textures/lava/emissive.jpg');
41 | const height = textureLoader.load('/textures/lava/height.png');
42 |
43 | const geometry = new THREE.SphereGeometry(2, 100, 100);
44 | const material = new THREE.MeshStandardMaterial({
45 | map: color,
46 | roughnessMap: roughness,
47 | normalMap: norm,
48 | aoMap: ao,
49 | emissive: emissive,
50 | displacementMap: height,
51 | displacementScale: 0.3
52 | });
53 | const mesh = new THREE.Mesh(geometry, material);
54 | scene.add(mesh);
55 |
56 | gui.add(mesh.material, 'roughness').min(0).max(1);
57 | gui.add(mesh.material, 'aoMapIntensity').min(0).max(1);
58 | gui.add(mesh.material, 'displacementScale').min(0).max(1.5);
59 | gui.add(mesh.material.normalScale, 'x').min(0).max(5);
60 | gui.add(mesh.material.normalScale, 'y').min(0).max(5);
61 |
62 |
63 | const light = new THREE.AmbientLight(0xefefef, 1.5);
64 | const pointLight = new THREE.PointLight(0xff9000, 3);
65 | pointLight.position.set(3, 3, 3);
66 | const pointLight2 = new THREE.PointLight(0x000000, 6);
67 | pointLight2.position.set(-3, -3, 3);
68 |
69 | scene.add(light);
70 | scene.add(pointLight);
71 | scene.add(pointLight2)
72 |
73 | const renderer = new THREE.WebGLRenderer({ canvas });
74 | renderer.setSize(sizes.width, sizes.height);
75 | renderer.render(scene, camera);
76 |
77 | const clock = new THREE.Clock();
78 | const tick = () => {
79 | stats.begin();
80 | const delta = clock.getDelta();
81 | mesh.rotation.y += delta * 0.2;
82 |
83 | controls.update();
84 | renderer.render(scene, camera);
85 |
86 | stats.end();
87 | window.requestAnimationFrame(tick);
88 | };
89 |
90 | tick();
91 |
92 | window.addEventListener('resize', () => {
93 | // Обновляем размеры
94 | sizes.width = window.innerWidth;
95 | sizes.height = window.innerHeight;
96 |
97 | // Обновляем соотношение сторон камеры
98 | camera.aspect = sizes.width / sizes.height;
99 | camera.updateProjectionMatrix();
100 |
101 | // Обновляем renderer
102 | renderer.setSize(sizes.width, sizes.height);
103 | renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
104 | renderer.render(scene, camera);
105 | });
106 |
107 |
--------------------------------------------------------------------------------
/threejs_main/src/style.css:
--------------------------------------------------------------------------------
1 | * {
2 | margin: 0;
3 | padding: 0;
4 | }
5 |
6 | html,
7 | body {
8 | overflow: hidden;
9 | }
10 |
11 | .canvas {
12 | position: fixed;
13 | top: 0;
14 | left: 0;
15 | outline: none;
16 | }
17 |
--------------------------------------------------------------------------------
/threejs_main/static/models/Duck/Duck.gltf:
--------------------------------------------------------------------------------
1 | {
2 | "asset": {
3 | "generator": "COLLADA2GLTF",
4 | "version": "2.0"
5 | },
6 | "scene": 0,
7 | "scenes": [
8 | {
9 | "nodes": [
10 | 0
11 | ]
12 | }
13 | ],
14 | "nodes": [
15 | {
16 | "children": [
17 | 2,
18 | 1
19 | ],
20 | "matrix": [
21 | 0.009999999776482582,
22 | 0.0,
23 | 0.0,
24 | 0.0,
25 | 0.0,
26 | 0.009999999776482582,
27 | 0.0,
28 | 0.0,
29 | 0.0,
30 | 0.0,
31 | 0.009999999776482582,
32 | 0.0,
33 | 0.0,
34 | 0.0,
35 | 0.0,
36 | 1.0
37 | ]
38 | },
39 | {
40 | "matrix": [
41 | -0.7289686799049377,
42 | 0.0,
43 | -0.6845470666885376,
44 | 0.0,
45 | -0.4252049028873444,
46 | 0.7836934328079224,
47 | 0.4527972936630249,
48 | 0.0,
49 | 0.5364750623703003,
50 | 0.6211478114128113,
51 | -0.571287989616394,
52 | 0.0,
53 | 400.1130065917969,
54 | 463.2640075683594,
55 | -431.0780334472656,
56 | 1.0
57 | ],
58 | "camera": 0
59 | },
60 | {
61 | "mesh": 0
62 | }
63 | ],
64 | "cameras": [
65 | {
66 | "perspective": {
67 | "aspectRatio": 1.5,
68 | "yfov": 0.6605925559997559,
69 | "zfar": 10000.0,
70 | "znear": 1.0
71 | },
72 | "type": "perspective"
73 | }
74 | ],
75 | "meshes": [
76 | {
77 | "primitives": [
78 | {
79 | "attributes": {
80 | "NORMAL": 1,
81 | "POSITION": 2,
82 | "TEXCOORD_0": 3
83 | },
84 | "indices": 0,
85 | "mode": 4,
86 | "material": 0
87 | }
88 | ],
89 | "name": "LOD3spShape"
90 | }
91 | ],
92 | "accessors": [
93 | {
94 | "bufferView": 0,
95 | "byteOffset": 0,
96 | "componentType": 5123,
97 | "count": 12636,
98 | "max": [
99 | 2398
100 | ],
101 | "min": [
102 | 0
103 | ],
104 | "type": "SCALAR"
105 | },
106 | {
107 | "bufferView": 1,
108 | "byteOffset": 0,
109 | "componentType": 5126,
110 | "count": 2399,
111 | "max": [
112 | 0.9995989799499512,
113 | 0.999580979347229,
114 | 0.9984359741210938
115 | ],
116 | "min": [
117 | -0.9990839958190918,
118 | -1.0,
119 | -0.9998319745063782
120 | ],
121 | "type": "VEC3"
122 | },
123 | {
124 | "bufferView": 1,
125 | "byteOffset": 28788,
126 | "componentType": 5126,
127 | "count": 2399,
128 | "max": [
129 | 96.17990112304688,
130 | 163.97000122070313,
131 | 53.92519760131836
132 | ],
133 | "min": [
134 | -69.29850006103516,
135 | 9.929369926452637,
136 | -61.32819747924805
137 | ],
138 | "type": "VEC3"
139 | },
140 | {
141 | "bufferView": 2,
142 | "byteOffset": 0,
143 | "componentType": 5126,
144 | "count": 2399,
145 | "max": [
146 | 0.9833459854125976,
147 | 0.9800369739532472
148 | ],
149 | "min": [
150 | 0.026409000158309938,
151 | 0.01996302604675293
152 | ],
153 | "type": "VEC2"
154 | }
155 | ],
156 | "materials": [
157 | {
158 | "pbrMetallicRoughness": {
159 | "baseColorTexture": {
160 | "index": 0
161 | },
162 | "metallicFactor": 0.0
163 | },
164 | "emissiveFactor": [
165 | 0.0,
166 | 0.0,
167 | 0.0
168 | ],
169 | "name": "blinn3-fx"
170 | }
171 | ],
172 | "textures": [
173 | {
174 | "sampler": 0,
175 | "source": 0
176 | }
177 | ],
178 | "images": [
179 | {
180 | "uri": "DuckCM.png"
181 | }
182 | ],
183 | "samplers": [
184 | {
185 | "magFilter": 9729,
186 | "minFilter": 9986,
187 | "wrapS": 10497,
188 | "wrapT": 10497
189 | }
190 | ],
191 | "bufferViews": [
192 | {
193 | "buffer": 0,
194 | "byteOffset": 76768,
195 | "byteLength": 25272,
196 | "target": 34963
197 | },
198 | {
199 | "buffer": 0,
200 | "byteOffset": 0,
201 | "byteLength": 57576,
202 | "byteStride": 12,
203 | "target": 34962
204 | },
205 | {
206 | "buffer": 0,
207 | "byteOffset": 57576,
208 | "byteLength": 19192,
209 | "byteStride": 8,
210 | "target": 34962
211 | }
212 | ],
213 | "buffers": [
214 | {
215 | "byteLength": 102040,
216 | "uri": "Duck0.bin"
217 | }
218 | ]
219 | }
220 |
--------------------------------------------------------------------------------
/threejs_main/static/models/Duck/Duck0.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/models/Duck/Duck0.bin
--------------------------------------------------------------------------------
/threejs_main/static/models/Duck/DuckCM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/models/Duck/DuckCM.png
--------------------------------------------------------------------------------
/threejs_main/static/models/fox/Fox.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/models/fox/Fox.bin
--------------------------------------------------------------------------------
/threejs_main/static/models/fox/Fox.gltf:
--------------------------------------------------------------------------------
1 | {
2 | "asset": {
3 | "copyright": "CC-BY 4.0 Model by PixelMannen https://opengameart.org/content/fox-and-shiba and @tomkranis https://sketchfab.com/3d-models/low-poly-fox-by-pixelmannen-animated-371dea88d7e04a76af5763f2a36866bc and @AsoboStudio with @scurest https://github.com/KhronosGroup/glTF-Sample-Models/pull/150#issuecomment-406300118",
4 | "version": "2.0"
5 | },
6 | "accessors": [
7 | {
8 | "bufferView": 0,
9 | "componentType": 5126,
10 | "count": 1728,
11 | "type": "VEC3",
12 | "byteOffset": 0,
13 | "min": [
14 | -12.592718124389648,
15 | -0.12174476683139801,
16 | -88.09500122070312
17 | ],
18 | "max": [
19 | 12.592718124389648,
20 | 78.90718841552734,
21 | 66.62486267089844
22 | ]
23 | },
24 | {
25 | "bufferView": 1,
26 | "componentType": 5126,
27 | "count": 1728,
28 | "type": "VEC2",
29 | "byteOffset": 0
30 | },
31 | {
32 | "bufferView": 1,
33 | "componentType": 5123,
34 | "count": 1728,
35 | "type": "VEC4",
36 | "byteOffset": 13824
37 | },
38 | {
39 | "bufferView": 2,
40 | "byteOffset": 0,
41 | "componentType": 5126,
42 | "count": 1728,
43 | "type": "VEC4"
44 | },
45 | {
46 | "bufferView": 3,
47 | "byteOffset": 0,
48 | "componentType": 5126,
49 | "count": 24,
50 | "type": "MAT4"
51 | },
52 | {
53 | "bufferView": 4,
54 | "byteOffset": 0,
55 | "componentType": 5126,
56 | "count": 83,
57 | "type": "SCALAR",
58 | "min": [
59 | 0.0
60 | ],
61 | "max": [
62 | 3.4166667461395264
63 | ]
64 | },
65 | {
66 | "bufferView": 5,
67 | "byteOffset": 0,
68 | "componentType": 5126,
69 | "count": 83,
70 | "type": "VEC4"
71 | },
72 | {
73 | "bufferView": 5,
74 | "byteOffset": 1328,
75 | "componentType": 5126,
76 | "count": 83,
77 | "type": "VEC4"
78 | },
79 | {
80 | "bufferView": 5,
81 | "byteOffset": 2656,
82 | "componentType": 5126,
83 | "count": 83,
84 | "type": "VEC4"
85 | },
86 | {
87 | "bufferView": 5,
88 | "byteOffset": 3984,
89 | "componentType": 5126,
90 | "count": 83,
91 | "type": "VEC4"
92 | },
93 | {
94 | "bufferView": 5,
95 | "byteOffset": 5312,
96 | "componentType": 5126,
97 | "count": 83,
98 | "type": "VEC4"
99 | },
100 | {
101 | "bufferView": 5,
102 | "byteOffset": 6640,
103 | "componentType": 5126,
104 | "count": 83,
105 | "type": "VEC4"
106 | },
107 | {
108 | "bufferView": 5,
109 | "byteOffset": 7968,
110 | "componentType": 5126,
111 | "count": 83,
112 | "type": "VEC4"
113 | },
114 | {
115 | "bufferView": 5,
116 | "byteOffset": 9296,
117 | "componentType": 5126,
118 | "count": 83,
119 | "type": "VEC4"
120 | },
121 | {
122 | "bufferView": 5,
123 | "byteOffset": 10624,
124 | "componentType": 5126,
125 | "count": 83,
126 | "type": "VEC4"
127 | },
128 | {
129 | "bufferView": 5,
130 | "byteOffset": 11952,
131 | "componentType": 5126,
132 | "count": 83,
133 | "type": "VEC4"
134 | },
135 | {
136 | "bufferView": 5,
137 | "byteOffset": 13280,
138 | "componentType": 5126,
139 | "count": 83,
140 | "type": "VEC4"
141 | },
142 | {
143 | "bufferView": 5,
144 | "byteOffset": 14608,
145 | "componentType": 5126,
146 | "count": 83,
147 | "type": "VEC4"
148 | },
149 | {
150 | "bufferView": 5,
151 | "byteOffset": 15936,
152 | "componentType": 5126,
153 | "count": 83,
154 | "type": "VEC4"
155 | },
156 | {
157 | "bufferView": 5,
158 | "byteOffset": 17264,
159 | "componentType": 5126,
160 | "count": 83,
161 | "type": "VEC4"
162 | },
163 | {
164 | "bufferView": 5,
165 | "byteOffset": 18592,
166 | "componentType": 5126,
167 | "count": 83,
168 | "type": "VEC4"
169 | },
170 | {
171 | "bufferView": 5,
172 | "byteOffset": 19920,
173 | "componentType": 5126,
174 | "count": 83,
175 | "type": "VEC4"
176 | },
177 | {
178 | "bufferView": 5,
179 | "byteOffset": 21248,
180 | "componentType": 5126,
181 | "count": 83,
182 | "type": "VEC4"
183 | },
184 | {
185 | "bufferView": 5,
186 | "byteOffset": 22576,
187 | "componentType": 5126,
188 | "count": 83,
189 | "type": "VEC4"
190 | },
191 | {
192 | "bufferView": 5,
193 | "byteOffset": 23904,
194 | "componentType": 5126,
195 | "count": 83,
196 | "type": "VEC4"
197 | },
198 | {
199 | "bufferView": 6,
200 | "byteOffset": 0,
201 | "componentType": 5126,
202 | "count": 83,
203 | "type": "VEC3"
204 | },
205 | {
206 | "bufferView": 5,
207 | "byteOffset": 25232,
208 | "componentType": 5126,
209 | "count": 83,
210 | "type": "VEC4"
211 | },
212 | {
213 | "bufferView": 4,
214 | "byteOffset": 332,
215 | "componentType": 5126,
216 | "count": 18,
217 | "type": "SCALAR",
218 | "min": [
219 | 0.0
220 | ],
221 | "max": [
222 | 0.7083333134651184
223 | ]
224 | },
225 | {
226 | "bufferView": 5,
227 | "byteOffset": 26560,
228 | "componentType": 5126,
229 | "count": 18,
230 | "type": "VEC4"
231 | },
232 | {
233 | "bufferView": 5,
234 | "byteOffset": 26848,
235 | "componentType": 5126,
236 | "count": 18,
237 | "type": "VEC4"
238 | },
239 | {
240 | "bufferView": 5,
241 | "byteOffset": 27136,
242 | "componentType": 5126,
243 | "count": 18,
244 | "type": "VEC4"
245 | },
246 | {
247 | "bufferView": 5,
248 | "byteOffset": 27424,
249 | "componentType": 5126,
250 | "count": 18,
251 | "type": "VEC4"
252 | },
253 | {
254 | "bufferView": 5,
255 | "byteOffset": 27712,
256 | "componentType": 5126,
257 | "count": 18,
258 | "type": "VEC4"
259 | },
260 | {
261 | "bufferView": 5,
262 | "byteOffset": 28000,
263 | "componentType": 5126,
264 | "count": 18,
265 | "type": "VEC4"
266 | },
267 | {
268 | "bufferView": 5,
269 | "byteOffset": 28288,
270 | "componentType": 5126,
271 | "count": 18,
272 | "type": "VEC4"
273 | },
274 | {
275 | "bufferView": 5,
276 | "byteOffset": 28576,
277 | "componentType": 5126,
278 | "count": 18,
279 | "type": "VEC4"
280 | },
281 | {
282 | "bufferView": 5,
283 | "byteOffset": 28864,
284 | "componentType": 5126,
285 | "count": 18,
286 | "type": "VEC4"
287 | },
288 | {
289 | "bufferView": 5,
290 | "byteOffset": 29152,
291 | "componentType": 5126,
292 | "count": 18,
293 | "type": "VEC4"
294 | },
295 | {
296 | "bufferView": 5,
297 | "byteOffset": 29440,
298 | "componentType": 5126,
299 | "count": 18,
300 | "type": "VEC4"
301 | },
302 | {
303 | "bufferView": 5,
304 | "byteOffset": 29728,
305 | "componentType": 5126,
306 | "count": 18,
307 | "type": "VEC4"
308 | },
309 | {
310 | "bufferView": 5,
311 | "byteOffset": 30016,
312 | "componentType": 5126,
313 | "count": 18,
314 | "type": "VEC4"
315 | },
316 | {
317 | "bufferView": 5,
318 | "byteOffset": 30304,
319 | "componentType": 5126,
320 | "count": 18,
321 | "type": "VEC4"
322 | },
323 | {
324 | "bufferView": 5,
325 | "byteOffset": 30592,
326 | "componentType": 5126,
327 | "count": 18,
328 | "type": "VEC4"
329 | },
330 | {
331 | "bufferView": 5,
332 | "byteOffset": 30880,
333 | "componentType": 5126,
334 | "count": 18,
335 | "type": "VEC4"
336 | },
337 | {
338 | "bufferView": 5,
339 | "byteOffset": 31168,
340 | "componentType": 5126,
341 | "count": 18,
342 | "type": "VEC4"
343 | },
344 | {
345 | "bufferView": 5,
346 | "byteOffset": 31456,
347 | "componentType": 5126,
348 | "count": 18,
349 | "type": "VEC4"
350 | },
351 | {
352 | "bufferView": 5,
353 | "byteOffset": 31744,
354 | "componentType": 5126,
355 | "count": 18,
356 | "type": "VEC4"
357 | },
358 | {
359 | "bufferView": 6,
360 | "byteOffset": 996,
361 | "componentType": 5126,
362 | "count": 18,
363 | "type": "VEC3"
364 | },
365 | {
366 | "bufferView": 5,
367 | "byteOffset": 32032,
368 | "componentType": 5126,
369 | "count": 18,
370 | "type": "VEC4"
371 | },
372 | {
373 | "bufferView": 4,
374 | "byteOffset": 404,
375 | "componentType": 5126,
376 | "count": 25,
377 | "type": "SCALAR",
378 | "min": [
379 | 0.0
380 | ],
381 | "max": [
382 | 1.1583333015441895
383 | ]
384 | },
385 | {
386 | "bufferView": 5,
387 | "byteOffset": 32320,
388 | "componentType": 5126,
389 | "count": 25,
390 | "type": "VEC4"
391 | },
392 | {
393 | "bufferView": 5,
394 | "byteOffset": 32720,
395 | "componentType": 5126,
396 | "count": 25,
397 | "type": "VEC4"
398 | },
399 | {
400 | "bufferView": 5,
401 | "byteOffset": 33120,
402 | "componentType": 5126,
403 | "count": 25,
404 | "type": "VEC4"
405 | },
406 | {
407 | "bufferView": 5,
408 | "byteOffset": 33520,
409 | "componentType": 5126,
410 | "count": 25,
411 | "type": "VEC4"
412 | },
413 | {
414 | "bufferView": 5,
415 | "byteOffset": 33920,
416 | "componentType": 5126,
417 | "count": 25,
418 | "type": "VEC4"
419 | },
420 | {
421 | "bufferView": 5,
422 | "byteOffset": 34320,
423 | "componentType": 5126,
424 | "count": 25,
425 | "type": "VEC4"
426 | },
427 | {
428 | "bufferView": 5,
429 | "byteOffset": 34720,
430 | "componentType": 5126,
431 | "count": 25,
432 | "type": "VEC4"
433 | },
434 | {
435 | "bufferView": 5,
436 | "byteOffset": 35120,
437 | "componentType": 5126,
438 | "count": 25,
439 | "type": "VEC4"
440 | },
441 | {
442 | "bufferView": 5,
443 | "byteOffset": 35520,
444 | "componentType": 5126,
445 | "count": 25,
446 | "type": "VEC4"
447 | },
448 | {
449 | "bufferView": 5,
450 | "byteOffset": 35920,
451 | "componentType": 5126,
452 | "count": 25,
453 | "type": "VEC4"
454 | },
455 | {
456 | "bufferView": 5,
457 | "byteOffset": 36320,
458 | "componentType": 5126,
459 | "count": 25,
460 | "type": "VEC4"
461 | },
462 | {
463 | "bufferView": 5,
464 | "byteOffset": 36720,
465 | "componentType": 5126,
466 | "count": 25,
467 | "type": "VEC4"
468 | },
469 | {
470 | "bufferView": 5,
471 | "byteOffset": 37120,
472 | "componentType": 5126,
473 | "count": 25,
474 | "type": "VEC4"
475 | },
476 | {
477 | "bufferView": 5,
478 | "byteOffset": 37520,
479 | "componentType": 5126,
480 | "count": 25,
481 | "type": "VEC4"
482 | },
483 | {
484 | "bufferView": 5,
485 | "byteOffset": 37920,
486 | "componentType": 5126,
487 | "count": 25,
488 | "type": "VEC4"
489 | },
490 | {
491 | "bufferView": 5,
492 | "byteOffset": 38320,
493 | "componentType": 5126,
494 | "count": 25,
495 | "type": "VEC4"
496 | },
497 | {
498 | "bufferView": 5,
499 | "byteOffset": 38720,
500 | "componentType": 5126,
501 | "count": 25,
502 | "type": "VEC4"
503 | },
504 | {
505 | "bufferView": 5,
506 | "byteOffset": 39120,
507 | "componentType": 5126,
508 | "count": 25,
509 | "type": "VEC4"
510 | },
511 | {
512 | "bufferView": 5,
513 | "byteOffset": 39520,
514 | "componentType": 5126,
515 | "count": 25,
516 | "type": "VEC4"
517 | },
518 | {
519 | "bufferView": 6,
520 | "byteOffset": 1212,
521 | "componentType": 5126,
522 | "count": 25,
523 | "type": "VEC3"
524 | },
525 | {
526 | "bufferView": 5,
527 | "byteOffset": 39920,
528 | "componentType": 5126,
529 | "count": 25,
530 | "type": "VEC4"
531 | }
532 | ],
533 | "animations": [
534 | {
535 | "channels": [
536 | {
537 | "sampler": 0,
538 | "target": {
539 | "node": 8,
540 | "path": "rotation"
541 | }
542 | },
543 | {
544 | "sampler": 1,
545 | "target": {
546 | "node": 7,
547 | "path": "rotation"
548 | }
549 | },
550 | {
551 | "sampler": 2,
552 | "target": {
553 | "node": 11,
554 | "path": "rotation"
555 | }
556 | },
557 | {
558 | "sampler": 3,
559 | "target": {
560 | "node": 10,
561 | "path": "rotation"
562 | }
563 | },
564 | {
565 | "sampler": 4,
566 | "target": {
567 | "node": 9,
568 | "path": "rotation"
569 | }
570 | },
571 | {
572 | "sampler": 5,
573 | "target": {
574 | "node": 14,
575 | "path": "rotation"
576 | }
577 | },
578 | {
579 | "sampler": 6,
580 | "target": {
581 | "node": 13,
582 | "path": "rotation"
583 | }
584 | },
585 | {
586 | "sampler": 7,
587 | "target": {
588 | "node": 12,
589 | "path": "rotation"
590 | }
591 | },
592 | {
593 | "sampler": 8,
594 | "target": {
595 | "node": 6,
596 | "path": "rotation"
597 | }
598 | },
599 | {
600 | "sampler": 9,
601 | "target": {
602 | "node": 5,
603 | "path": "rotation"
604 | }
605 | },
606 | {
607 | "sampler": 10,
608 | "target": {
609 | "node": 17,
610 | "path": "rotation"
611 | }
612 | },
613 | {
614 | "sampler": 11,
615 | "target": {
616 | "node": 16,
617 | "path": "rotation"
618 | }
619 | },
620 | {
621 | "sampler": 12,
622 | "target": {
623 | "node": 15,
624 | "path": "rotation"
625 | }
626 | },
627 | {
628 | "sampler": 13,
629 | "target": {
630 | "node": 20,
631 | "path": "rotation"
632 | }
633 | },
634 | {
635 | "sampler": 14,
636 | "target": {
637 | "node": 19,
638 | "path": "rotation"
639 | }
640 | },
641 | {
642 | "sampler": 15,
643 | "target": {
644 | "node": 18,
645 | "path": "rotation"
646 | }
647 | },
648 | {
649 | "sampler": 16,
650 | "target": {
651 | "node": 24,
652 | "path": "rotation"
653 | }
654 | },
655 | {
656 | "sampler": 17,
657 | "target": {
658 | "node": 23,
659 | "path": "rotation"
660 | }
661 | },
662 | {
663 | "sampler": 18,
664 | "target": {
665 | "node": 22,
666 | "path": "rotation"
667 | }
668 | },
669 | {
670 | "sampler": 19,
671 | "target": {
672 | "node": 4,
673 | "path": "translation"
674 | }
675 | },
676 | {
677 | "sampler": 20,
678 | "target": {
679 | "node": 4,
680 | "path": "rotation"
681 | }
682 | }
683 | ],
684 | "samplers": [
685 | {
686 | "input": 5,
687 | "output": 6
688 | },
689 | {
690 | "input": 5,
691 | "output": 7
692 | },
693 | {
694 | "input": 5,
695 | "output": 8
696 | },
697 | {
698 | "input": 5,
699 | "output": 9
700 | },
701 | {
702 | "input": 5,
703 | "output": 10
704 | },
705 | {
706 | "input": 5,
707 | "output": 11
708 | },
709 | {
710 | "input": 5,
711 | "output": 12
712 | },
713 | {
714 | "input": 5,
715 | "output": 13
716 | },
717 | {
718 | "input": 5,
719 | "output": 14
720 | },
721 | {
722 | "input": 5,
723 | "output": 15
724 | },
725 | {
726 | "input": 5,
727 | "output": 16
728 | },
729 | {
730 | "input": 5,
731 | "output": 17
732 | },
733 | {
734 | "input": 5,
735 | "output": 18
736 | },
737 | {
738 | "input": 5,
739 | "output": 19
740 | },
741 | {
742 | "input": 5,
743 | "output": 20
744 | },
745 | {
746 | "input": 5,
747 | "output": 21
748 | },
749 | {
750 | "input": 5,
751 | "output": 22
752 | },
753 | {
754 | "input": 5,
755 | "output": 23
756 | },
757 | {
758 | "input": 5,
759 | "output": 24
760 | },
761 | {
762 | "input": 5,
763 | "output": 25
764 | },
765 | {
766 | "input": 5,
767 | "output": 26
768 | }
769 | ],
770 | "name": "Survey"
771 | },
772 | {
773 | "channels": [
774 | {
775 | "sampler": 0,
776 | "target": {
777 | "node": 8,
778 | "path": "rotation"
779 | }
780 | },
781 | {
782 | "sampler": 1,
783 | "target": {
784 | "node": 7,
785 | "path": "rotation"
786 | }
787 | },
788 | {
789 | "sampler": 2,
790 | "target": {
791 | "node": 11,
792 | "path": "rotation"
793 | }
794 | },
795 | {
796 | "sampler": 3,
797 | "target": {
798 | "node": 10,
799 | "path": "rotation"
800 | }
801 | },
802 | {
803 | "sampler": 4,
804 | "target": {
805 | "node": 9,
806 | "path": "rotation"
807 | }
808 | },
809 | {
810 | "sampler": 5,
811 | "target": {
812 | "node": 14,
813 | "path": "rotation"
814 | }
815 | },
816 | {
817 | "sampler": 6,
818 | "target": {
819 | "node": 13,
820 | "path": "rotation"
821 | }
822 | },
823 | {
824 | "sampler": 7,
825 | "target": {
826 | "node": 12,
827 | "path": "rotation"
828 | }
829 | },
830 | {
831 | "sampler": 8,
832 | "target": {
833 | "node": 6,
834 | "path": "rotation"
835 | }
836 | },
837 | {
838 | "sampler": 9,
839 | "target": {
840 | "node": 5,
841 | "path": "rotation"
842 | }
843 | },
844 | {
845 | "sampler": 10,
846 | "target": {
847 | "node": 17,
848 | "path": "rotation"
849 | }
850 | },
851 | {
852 | "sampler": 11,
853 | "target": {
854 | "node": 16,
855 | "path": "rotation"
856 | }
857 | },
858 | {
859 | "sampler": 12,
860 | "target": {
861 | "node": 15,
862 | "path": "rotation"
863 | }
864 | },
865 | {
866 | "sampler": 13,
867 | "target": {
868 | "node": 20,
869 | "path": "rotation"
870 | }
871 | },
872 | {
873 | "sampler": 14,
874 | "target": {
875 | "node": 19,
876 | "path": "rotation"
877 | }
878 | },
879 | {
880 | "sampler": 15,
881 | "target": {
882 | "node": 18,
883 | "path": "rotation"
884 | }
885 | },
886 | {
887 | "sampler": 16,
888 | "target": {
889 | "node": 24,
890 | "path": "rotation"
891 | }
892 | },
893 | {
894 | "sampler": 17,
895 | "target": {
896 | "node": 23,
897 | "path": "rotation"
898 | }
899 | },
900 | {
901 | "sampler": 18,
902 | "target": {
903 | "node": 22,
904 | "path": "rotation"
905 | }
906 | },
907 | {
908 | "sampler": 19,
909 | "target": {
910 | "node": 4,
911 | "path": "translation"
912 | }
913 | },
914 | {
915 | "sampler": 20,
916 | "target": {
917 | "node": 4,
918 | "path": "rotation"
919 | }
920 | }
921 | ],
922 | "samplers": [
923 | {
924 | "input": 27,
925 | "output": 28
926 | },
927 | {
928 | "input": 27,
929 | "output": 29
930 | },
931 | {
932 | "input": 27,
933 | "output": 30
934 | },
935 | {
936 | "input": 27,
937 | "output": 31
938 | },
939 | {
940 | "input": 27,
941 | "output": 32
942 | },
943 | {
944 | "input": 27,
945 | "output": 33
946 | },
947 | {
948 | "input": 27,
949 | "output": 34
950 | },
951 | {
952 | "input": 27,
953 | "output": 35
954 | },
955 | {
956 | "input": 27,
957 | "output": 36
958 | },
959 | {
960 | "input": 27,
961 | "output": 37
962 | },
963 | {
964 | "input": 27,
965 | "output": 38
966 | },
967 | {
968 | "input": 27,
969 | "output": 39
970 | },
971 | {
972 | "input": 27,
973 | "output": 40
974 | },
975 | {
976 | "input": 27,
977 | "output": 41
978 | },
979 | {
980 | "input": 27,
981 | "output": 42
982 | },
983 | {
984 | "input": 27,
985 | "output": 43
986 | },
987 | {
988 | "input": 27,
989 | "output": 44
990 | },
991 | {
992 | "input": 27,
993 | "output": 45
994 | },
995 | {
996 | "input": 27,
997 | "output": 46
998 | },
999 | {
1000 | "input": 27,
1001 | "output": 47
1002 | },
1003 | {
1004 | "input": 27,
1005 | "output": 48
1006 | }
1007 | ],
1008 | "name": "Walk"
1009 | },
1010 | {
1011 | "channels": [
1012 | {
1013 | "sampler": 0,
1014 | "target": {
1015 | "node": 8,
1016 | "path": "rotation"
1017 | }
1018 | },
1019 | {
1020 | "sampler": 1,
1021 | "target": {
1022 | "node": 7,
1023 | "path": "rotation"
1024 | }
1025 | },
1026 | {
1027 | "sampler": 2,
1028 | "target": {
1029 | "node": 11,
1030 | "path": "rotation"
1031 | }
1032 | },
1033 | {
1034 | "sampler": 3,
1035 | "target": {
1036 | "node": 10,
1037 | "path": "rotation"
1038 | }
1039 | },
1040 | {
1041 | "sampler": 4,
1042 | "target": {
1043 | "node": 9,
1044 | "path": "rotation"
1045 | }
1046 | },
1047 | {
1048 | "sampler": 5,
1049 | "target": {
1050 | "node": 14,
1051 | "path": "rotation"
1052 | }
1053 | },
1054 | {
1055 | "sampler": 6,
1056 | "target": {
1057 | "node": 13,
1058 | "path": "rotation"
1059 | }
1060 | },
1061 | {
1062 | "sampler": 7,
1063 | "target": {
1064 | "node": 12,
1065 | "path": "rotation"
1066 | }
1067 | },
1068 | {
1069 | "sampler": 8,
1070 | "target": {
1071 | "node": 6,
1072 | "path": "rotation"
1073 | }
1074 | },
1075 | {
1076 | "sampler": 9,
1077 | "target": {
1078 | "node": 5,
1079 | "path": "rotation"
1080 | }
1081 | },
1082 | {
1083 | "sampler": 10,
1084 | "target": {
1085 | "node": 17,
1086 | "path": "rotation"
1087 | }
1088 | },
1089 | {
1090 | "sampler": 11,
1091 | "target": {
1092 | "node": 16,
1093 | "path": "rotation"
1094 | }
1095 | },
1096 | {
1097 | "sampler": 12,
1098 | "target": {
1099 | "node": 15,
1100 | "path": "rotation"
1101 | }
1102 | },
1103 | {
1104 | "sampler": 13,
1105 | "target": {
1106 | "node": 20,
1107 | "path": "rotation"
1108 | }
1109 | },
1110 | {
1111 | "sampler": 14,
1112 | "target": {
1113 | "node": 19,
1114 | "path": "rotation"
1115 | }
1116 | },
1117 | {
1118 | "sampler": 15,
1119 | "target": {
1120 | "node": 18,
1121 | "path": "rotation"
1122 | }
1123 | },
1124 | {
1125 | "sampler": 16,
1126 | "target": {
1127 | "node": 24,
1128 | "path": "rotation"
1129 | }
1130 | },
1131 | {
1132 | "sampler": 17,
1133 | "target": {
1134 | "node": 23,
1135 | "path": "rotation"
1136 | }
1137 | },
1138 | {
1139 | "sampler": 18,
1140 | "target": {
1141 | "node": 22,
1142 | "path": "rotation"
1143 | }
1144 | },
1145 | {
1146 | "sampler": 19,
1147 | "target": {
1148 | "node": 4,
1149 | "path": "translation"
1150 | }
1151 | },
1152 | {
1153 | "sampler": 20,
1154 | "target": {
1155 | "node": 4,
1156 | "path": "rotation"
1157 | }
1158 | }
1159 | ],
1160 | "samplers": [
1161 | {
1162 | "input": 49,
1163 | "output": 50
1164 | },
1165 | {
1166 | "input": 49,
1167 | "output": 51
1168 | },
1169 | {
1170 | "input": 49,
1171 | "output": 52
1172 | },
1173 | {
1174 | "input": 49,
1175 | "output": 53
1176 | },
1177 | {
1178 | "input": 49,
1179 | "output": 54
1180 | },
1181 | {
1182 | "input": 49,
1183 | "output": 55
1184 | },
1185 | {
1186 | "input": 49,
1187 | "output": 56
1188 | },
1189 | {
1190 | "input": 49,
1191 | "output": 57
1192 | },
1193 | {
1194 | "input": 49,
1195 | "output": 58
1196 | },
1197 | {
1198 | "input": 49,
1199 | "output": 59
1200 | },
1201 | {
1202 | "input": 49,
1203 | "output": 60
1204 | },
1205 | {
1206 | "input": 49,
1207 | "output": 61
1208 | },
1209 | {
1210 | "input": 49,
1211 | "output": 62
1212 | },
1213 | {
1214 | "input": 49,
1215 | "output": 63
1216 | },
1217 | {
1218 | "input": 49,
1219 | "output": 64
1220 | },
1221 | {
1222 | "input": 49,
1223 | "output": 65
1224 | },
1225 | {
1226 | "input": 49,
1227 | "output": 66
1228 | },
1229 | {
1230 | "input": 49,
1231 | "output": 67
1232 | },
1233 | {
1234 | "input": 49,
1235 | "output": 68
1236 | },
1237 | {
1238 | "input": 49,
1239 | "output": 69
1240 | },
1241 | {
1242 | "input": 49,
1243 | "output": 70
1244 | }
1245 | ],
1246 | "name": "Run"
1247 | }
1248 | ],
1249 | "bufferViews": [
1250 | {
1251 | "buffer": 0,
1252 | "byteOffset": 0,
1253 | "byteLength": 20736,
1254 | "byteStride": 12,
1255 | "target": 34962
1256 | },
1257 | {
1258 | "buffer": 0,
1259 | "byteOffset": 20736,
1260 | "byteLength": 27648,
1261 | "byteStride": 8,
1262 | "target": 34962
1263 | },
1264 | {
1265 | "buffer": 0,
1266 | "byteOffset": 48384,
1267 | "byteLength": 27648,
1268 | "byteStride": 16,
1269 | "target": 34962
1270 | },
1271 | {
1272 | "buffer": 0,
1273 | "byteOffset": 76032,
1274 | "byteLength": 1536
1275 | },
1276 | {
1277 | "buffer": 0,
1278 | "byteOffset": 77568,
1279 | "byteLength": 504
1280 | },
1281 | {
1282 | "buffer": 0,
1283 | "byteOffset": 78072,
1284 | "byteLength": 40320
1285 | },
1286 | {
1287 | "buffer": 0,
1288 | "byteOffset": 118392,
1289 | "byteLength": 1512
1290 | }
1291 | ],
1292 | "buffers": [
1293 | {
1294 | "uri": "Fox.bin",
1295 | "byteLength": 119904
1296 | }
1297 | ],
1298 | "images": [
1299 | {
1300 | "uri": "Texture.png",
1301 | "mimeType": "image/png"
1302 | }
1303 | ],
1304 | "materials": [
1305 | {
1306 | "name": "fox_material",
1307 | "pbrMetallicRoughness": {
1308 | "baseColorTexture": {
1309 | "index": 0
1310 | },
1311 | "metallicFactor": 0,
1312 | "roughnessFactor": 0.58
1313 | }
1314 | }
1315 | ],
1316 | "meshes": [
1317 | {
1318 | "name": "fox1",
1319 | "primitives": [
1320 | {
1321 | "attributes": {
1322 | "POSITION": 0,
1323 | "TEXCOORD_0": 1,
1324 | "JOINTS_0": 2,
1325 | "WEIGHTS_0": 3
1326 | },
1327 | "material": 0
1328 | }
1329 | ]
1330 | }
1331 | ],
1332 | "nodes": [
1333 | {
1334 | "children": [
1335 | 2
1336 | ],
1337 | "name": "root"
1338 | },
1339 | {
1340 | "name": "fox",
1341 | "mesh": 0,
1342 | "skin": 0
1343 | },
1344 | {
1345 | "children": [
1346 | 3
1347 | ],
1348 | "name": "_rootJoint"
1349 | },
1350 | {
1351 | "children": [
1352 | 4
1353 | ],
1354 | "name": "b_Root_00",
1355 | "rotation": [
1356 | -0.7071080924875391,
1357 | 0.0,
1358 | 0.0,
1359 | 0.7071054698831242
1360 | ]
1361 | },
1362 | {
1363 | "children": [
1364 | 5,
1365 | 15,
1366 | 18,
1367 | 22
1368 | ],
1369 | "name": "b_Hip_01",
1370 | "rotation": [
1371 | 0.12769094176175547,
1372 | -0.6954820192393762,
1373 | -0.12769022650601444,
1374 | 0.695481840425441
1375 | ],
1376 | "translation": [
1377 | 0,
1378 | 26.748403549194336,
1379 | 42.93817138671875
1380 | ]
1381 | },
1382 | {
1383 | "children": [
1384 | 6
1385 | ],
1386 | "name": "b_Spine01_02",
1387 | "rotation": [
1388 | 0.0,
1389 | 0.0,
1390 | -0.5904157638238317,
1391 | 0.8070992664030376
1392 | ],
1393 | "translation": [
1394 | 12.850601196289062,
1395 | 0,
1396 | 0
1397 | ]
1398 | },
1399 | {
1400 | "children": [
1401 | 7,
1402 | 9,
1403 | 12
1404 | ],
1405 | "name": "b_Spine02_03",
1406 | "rotation": [
1407 | 0.0,
1408 | 0.0,
1409 | 0.017411952404281082,
1410 | 0.9998484004655261
1411 | ],
1412 | "translation": [
1413 | 21.65575408935547,
1414 | -0.000118255615234375,
1415 | 0
1416 | ]
1417 | },
1418 | {
1419 | "children": [
1420 | 8
1421 | ],
1422 | "name": "b_Neck_04",
1423 | "rotation": [
1424 | 0.0,
1425 | 0.0,
1426 | 0.30337914028264346,
1427 | 0.9528699267168443
1428 | ],
1429 | "translation": [
1430 | 25.64914321899414,
1431 | 0,
1432 | 0
1433 | ]
1434 | },
1435 | {
1436 | "name": "b_Head_05",
1437 | "rotation": [
1438 | 0.0,
1439 | 0.0,
1440 | -0.4002854151487349,
1441 | 0.9163905206947555
1442 | ],
1443 | "translation": [
1444 | 13.376960754394531,
1445 | 0,
1446 | 0
1447 | ]
1448 | },
1449 | {
1450 | "children": [
1451 | 10
1452 | ],
1453 | "name": "b_RightUpperArm_06",
1454 | "rotation": [
1455 | 0.0004673273262011562,
1456 | -0.0004461484692255928,
1457 | -0.7121792881110691,
1458 | 0.7019973248825985
1459 | ],
1460 | "translation": [
1461 | 18.677913665771484,
1462 | -4.297340393066406,
1463 | 6.9675750732421875
1464 | ]
1465 | },
1466 | {
1467 | "children": [
1468 | 11
1469 | ],
1470 | "name": "b_RightForeArm_07",
1471 | "rotation": [
1472 | 0.0,
1473 | 0.0,
1474 | 0.03712589977348744,
1475 | 0.9993105961441663
1476 | ],
1477 | "translation": [
1478 | 23.04512596130371,
1479 | 0,
1480 | 0
1481 | ]
1482 | },
1483 | {
1484 | "name": "b_RightHand_08",
1485 | "rotation": [
1486 | -0.012037406914797018,
1487 | -0.00782221012465276,
1488 | 0.4605623277185148,
1489 | 0.8875112709988741
1490 | ],
1491 | "translation": [
1492 | 19.350055694580078,
1493 | -0.14598655700683594,
1494 | 0
1495 | ]
1496 | },
1497 | {
1498 | "children": [
1499 | 13
1500 | ],
1501 | "name": "b_LeftUpperArm_09",
1502 | "rotation": [
1503 | 0.0004972619220940174,
1504 | -0.0008821923166442875,
1505 | -0.7120874929914663,
1506 | 0.7020900061903927
1507 | ],
1508 | "translation": [
1509 | 18.67791748046875,
1510 | -4.297344207763672,
1511 | -6.967987060546875
1512 | ]
1513 | },
1514 | {
1515 | "children": [
1516 | 14
1517 | ],
1518 | "name": "b_LeftForeArm_010",
1519 | "rotation": [
1520 | 0.0,
1521 | 0.0,
1522 | 0.03712589977348744,
1523 | 0.9993105961441663
1524 | ],
1525 | "translation": [
1526 | 23.045124053955078,
1527 | 0,
1528 | 0
1529 | ]
1530 | },
1531 | {
1532 | "name": "b_LeftHand_011",
1533 | "rotation": [
1534 | 0.01651791440721507,
1535 | 0.014013739873997781,
1536 | 0.46007557521271,
1537 | 0.8876154790736099
1538 | ],
1539 | "translation": [
1540 | 19.350051879882812,
1541 | -0.14599037170410156,
1542 | 0
1543 | ]
1544 | },
1545 | {
1546 | "children": [
1547 | 16
1548 | ],
1549 | "name": "b_Tail01_012",
1550 | "rotation": [
1551 | 0.0,
1552 | 0.0,
1553 | 0.9818928940656295,
1554 | 0.1894369145214904
1555 | ],
1556 | "translation": [
1557 | 4.2603759765625,
1558 | 15.958770751953125,
1559 | 0
1560 | ]
1561 | },
1562 | {
1563 | "children": [
1564 | 17
1565 | ],
1566 | "name": "b_Tail02_013",
1567 | "rotation": [
1568 | 0.0,
1569 | 0.0,
1570 | -0.0696171663387466,
1571 | 0.9975737818081244
1572 | ],
1573 | "translation": [
1574 | 12.411918640136719,
1575 | 0,
1576 | 0
1577 | ]
1578 | },
1579 | {
1580 | "name": "b_Tail03_014",
1581 | "rotation": [
1582 | 0.0,
1583 | 0.0,
1584 | -0.05383274484207684,
1585 | 0.9985499664927979
1586 | ],
1587 | "translation": [
1588 | 24.24032211303711,
1589 | 0,
1590 | 0
1591 | ]
1592 | },
1593 | {
1594 | "children": [
1595 | 19
1596 | ],
1597 | "name": "b_LeftLeg01_015",
1598 | "rotation": [
1599 | 0.0,
1600 | -0.0001717522536559936,
1601 | 0.9700158834020681,
1602 | -0.2430414706359161
1603 | ],
1604 | "translation": [
1605 | 4.813770294189453,
1606 | 5.154018402099609,
1607 | -6.968006134033203
1608 | ]
1609 | },
1610 | {
1611 | "children": [
1612 | 20
1613 | ],
1614 | "name": "b_LeftLeg02_016",
1615 | "rotation": [
1616 | 0.0,
1617 | 0.0,
1618 | -0.36804378855511655,
1619 | 0.9298084586117706
1620 | ],
1621 | "translation": [
1622 | 18.944175720214844,
1623 | 0,
1624 | 0
1625 | ]
1626 | },
1627 | {
1628 | "children": [
1629 | 21
1630 | ],
1631 | "name": "b_LeftFoot01_017",
1632 | "rotation": [
1633 | 0.0002484105929664666,
1634 | 0.0,
1635 | 0.4584841122585099,
1636 | 0.888702569535333
1637 | ],
1638 | "translation": [
1639 | 17.942811965942383,
1640 | 0,
1641 | 0
1642 | ]
1643 | },
1644 | {
1645 | "name": "b_LeftFoot02_018",
1646 | "rotation": [
1647 | 0.0,
1648 | 0.0,
1649 | 0.5472882949090243,
1650 | 0.8369441571906533
1651 | ],
1652 | "translation": [
1653 | 15.779938697814941,
1654 | 0,
1655 | 0
1656 | ]
1657 | },
1658 | {
1659 | "children": [
1660 | 23
1661 | ],
1662 | "name": "b_RightLeg01_019",
1663 | "rotation": [
1664 | 0.0,
1665 | 0.0,
1666 | 0.9699585942054535,
1667 | -0.24327006705918533
1668 | ],
1669 | "translation": [
1670 | 4.813777923583984,
1671 | 5.154026031494141,
1672 | 6.967563629150391
1673 | ]
1674 | },
1675 | {
1676 | "children": [
1677 | 24
1678 | ],
1679 | "name": "b_RightLeg02_020",
1680 | "rotation": [
1681 | 0.0,
1682 | 0.0,
1683 | -0.36804381432052885,
1684 | 0.9298084484131106
1685 | ],
1686 | "translation": [
1687 | 18.944183349609375,
1688 | 0,
1689 | 0
1690 | ]
1691 | },
1692 | {
1693 | "children": [
1694 | 25
1695 | ],
1696 | "name": "b_RightFoot01_021",
1697 | "rotation": [
1698 | -0.00015345455876803163,
1699 | 0.0,
1700 | 0.4579093746168346,
1701 | 0.888998864504178
1702 | ],
1703 | "translation": [
1704 | 17.94281005859375,
1705 | 0,
1706 | 0
1707 | ]
1708 | },
1709 | {
1710 | "name": "b_RightFoot02_022",
1711 | "rotation": [
1712 | 0.0,
1713 | 0.0,
1714 | 0.5472882949090243,
1715 | 0.8369441571906533
1716 | ],
1717 | "translation": [
1718 | 15.779935836791992,
1719 | 0,
1720 | 0
1721 | ]
1722 | }
1723 | ],
1724 | "samplers": [
1725 | {
1726 | "magFilter": 9729,
1727 | "minFilter": 9987
1728 | }
1729 | ],
1730 | "scene": 0,
1731 | "scenes": [
1732 | {
1733 | "nodes": [
1734 | 0,
1735 | 1
1736 | ]
1737 | }
1738 | ],
1739 | "skins": [
1740 | {
1741 | "inverseBindMatrices": 4,
1742 | "joints": [
1743 | 2,
1744 | 3,
1745 | 4,
1746 | 5,
1747 | 6,
1748 | 7,
1749 | 8,
1750 | 9,
1751 | 10,
1752 | 11,
1753 | 12,
1754 | 13,
1755 | 14,
1756 | 15,
1757 | 16,
1758 | 17,
1759 | 18,
1760 | 19,
1761 | 20,
1762 | 21,
1763 | 22,
1764 | 23,
1765 | 24,
1766 | 25
1767 | ],
1768 | "skeleton": 2
1769 | }
1770 | ],
1771 | "textures": [
1772 | {
1773 | "sampler": 0,
1774 | "source": 0
1775 | }
1776 | ]
1777 | }
1778 |
--------------------------------------------------------------------------------
/threejs_main/static/models/fox/Texture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/models/fox/Texture.png
--------------------------------------------------------------------------------
/threejs_main/static/textures/checkerboard-1024x1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/checkerboard-1024x1024.png
--------------------------------------------------------------------------------
/threejs_main/static/textures/checkerboard-8x8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/checkerboard-8x8.png
--------------------------------------------------------------------------------
/threejs_main/static/textures/door/alpha.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/door/alpha.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/door/ambientOcclusion.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/door/ambientOcclusion.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/door/color.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/door/color.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/door/height.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/door/height.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/door/metalness.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/door/metalness.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/door/normal.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/door/normal.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/door/roughness.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/door/roughness.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/lava/ambientOcclusion.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/lava/ambientOcclusion.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/lava/basecolor.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/lava/basecolor.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/lava/emissive.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/lava/emissive.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/lava/height.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/lava/height.png
--------------------------------------------------------------------------------
/threejs_main/static/textures/lava/normal.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/lava/normal.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/lava/roughness.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/lava/roughness.jpg
--------------------------------------------------------------------------------
/threejs_main/static/textures/minecraft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GuVictory/threejs-course/ecf68db82f06f28e845ba210d7361886ac2b2c4f/threejs_main/static/textures/minecraft.png
--------------------------------------------------------------------------------