【three.js】threejs学習ノート(一)

31181 ワード

前言
  • この技術は私が長い間狙っていたので、私は最初createjsとthreejsの中でどれを勉強すればいいか迷っていましたが、createjs 3 Dを作るのは珍しいと思いました.そして、ケースを見るとアニメ処理やanimateccに合わせて生成されているような気がしますが、現実には3 dを作る必要が多く、threejs生態が良いと思います.だからthreejsをやることにした.

  • 公式サイト
  • https://github.com/mrdoob/three.js/releases

  • インストール
  • 多くの中国語のチュートリアルがあなたにthreejsのjsあるいはcdnを導入させることを発見することができて、私は最初はこのようにthreeを使うしかないと思っていましたが、issueの中で多くのtsの問題を提起している人がいることを発見して、それからnpmの上で探してみると本当にあります.現在、最新の120バージョンにダウンロードできます.
  • ですが、コードは自分で別にしたほうがいいです.npmにはsrcの内容しか入っていないので、全量ダウンロードのエディタもdemoもいいツールなので、研究してみてください.
  • はオンラインのを使いたくありません:http://www.yanhuangxueyuan.com/threejs/editor/
  • tsと組み合わせて、私たちの学習速度は大幅に向上します.まずreactのtsプロジェクトを開き、three
  • をインストールします.
    npm i three
    

    使用
  • npmで与えられた最初の例に従ってreact-appに書いて動作するかどうかを見ます:
  • import React, {
          useRef, useEffect } from "react";
    import * as THREE from "three";
    
    var camera: THREE.Camera, scene: THREE.Object3D, renderer: THREE.WebGLRenderer;
    var geometry, material, mesh: THREE.Object3D;
    
    function animate() {
         
    	requestAnimationFrame(animate);
    
    	mesh.rotation.x += 0.01;
    	mesh.rotation.y += 0.02;
    
    	renderer.render(scene, camera);
    }
    function App() {
         
    	const ref = useRef<HTMLDivElement>(null);
    	useEffect(() => {
         
    		if (ref.current) {
         
    			camera = new THREE.PerspectiveCamera(
    				70,
    				window.innerWidth / window.innerHeight,
    				0.01,
    				10
    			);
    			camera.position.z = 1;
    
    			scene = new THREE.Scene();
    
    			geometry = new THREE.BoxGeometry(0.2, 0.2, 0.2);
    			material = new THREE.MeshNormalMaterial();
    
    			mesh = new THREE.Mesh(geometry, material);
    			scene.add(mesh);
    
    			renderer = new THREE.WebGLRenderer({
          antialias: true });
    			renderer.setSize(window.innerWidth, window.innerHeight);
    			ref.current.appendChild(renderer.domElement);
    		}
    
    		animate();
    	}, []);
    
    	return <div ref={
         ref}></div>;
    }
    
    export default App;
    
  • 回転しているカラー正方形を表示できれば成功します.
  • 上記の例から、6つのグローバル変数、1つのカメラ、1つのシーン、1つのbox、1つのマテリアル、もう1つのmeshを行い、その後、meshパラメータはboxとマテリアルであり、シーンパラメータはmeshであり、最後にrendererを介してシーンとカメラレンダリングに転送されることがわかります.

  • パースビューカメラPerspectiveCamera
  • この後の2つの値はよく理解できません.
  • 	/**
    	 * @param [fov=50] Camera frustum vertical field of view. Default value is 50.
    	 * @param [aspect=1] Camera frustum aspect ratio. Default value is 1.
    	 * @param [near=0.1] Camera frustum near plane. Default value is 0.1.
    	 * @param [far=2000] Camera frustum far plane. Default value is 2000.
    	 */
    

    1つ目の属性は視野角(FOV)です.視野角度とは、いつでもディスプレイに表示されるシーンの範囲であり、その値は角度です.
    2番目の値はアスペクト比(aspect ratio)です.つまり、物体の幅をその高い比で割ったのです.例えば、ワイドスクリーンテレビで古い映画を再生すると、画像が潰されているように見えます.
    次の2つの値は、遠剪断面と近剪断面です.すなわち、カメラの遠方のカット面よりも物体の位置が遠い場合や、近接のカット面よりも物体の位置が近い場合、その物体が超えた部分はシーンにレンダリングされません.
    BoxGeometry
  • これは立方体で、実はパラメータを書くことがあって、どうせ3つの値をあげるだけで長幅の高さでいいです.
  • /**
    	 * @param [width=1] — Width of the sides on the X axis.
    	 * @param [height=1] — Height of the sides on the Y axis.
    	 * @param [depth=1] — Depth of the sides on the Z axis.
    	 * @param [widthSegments=1] — Number of segmented faces along the width of the sides.
    	 * @param [heightSegments=1] — Number of segmented faces along the height of the sides.
    	 * @param [depthSegments=1] — Number of segmented faces along the depth of the sides.
    	 */
    

    MeshNormalMaterial
  • 法ベクトルをRGB色にマッピングするマテリアルです.mesh = new THREE.Mesh(geometry, material)は、マテリアルをジオメトリに適用します.
  • は、scene.add(mesh)を呼び出し、このジオメトリをシーン000の位置
  • にレンダリングする.
    静的例
  • 次の例を見て、いくつかの一般的なジオメトリを分解して設定し、カメラを調整し、テストツールを追加し、最後にレンダリングし、注釈を書きました.
  • 影の部分は少し面白いですが、地面に影を受信し、物体を指定して影を作る必要があります.
  • import React, {
          useRef, useEffect } from "react";
    import * as THREE from "three";
    
    var camera: THREE.Camera, scene: THREE.Object3D, renderer: THREE.WebGLRenderer;
    var geometry, material, mesh: THREE.Object3D;
    let gPlane;
    let axes;
    let mGeometry;
    let gmesh;
    let ball;
    let mball;
    let meshball;
    let light;
    function animate() {
         
    	requestAnimationFrame(animate);
    
    	mesh.rotation.x += 0.01;
    	mesh.rotation.y += 0.02;
    
    	renderer.render(scene, camera);
    }
    function App() {
         
    	const ref = useRef<HTMLDivElement>(null);
    	useEffect(() => {
         
    		if (ref.current) {
         
    			//  ,        
    			//------------
    			renderer = new THREE.WebGLRenderer({
          antialias: true });
    			//     
    			renderer.setClearColor(new THREE.Color(0xeeeeee));
    			//      
    			renderer.setSize(window.innerWidth, window.innerHeight);
    			//    ,    
    			renderer.shadowMapEnabled = true;
    			scene = new THREE.Scene();
    			//      
    			axes = new THREE.AxesHelper(255);
    			scene.add(axes); //      
    			//    
    			camera = new THREE.PerspectiveCamera(
    				50,
    				window.innerWidth / window.innerHeight,
    				0.1,
    				1000
    			);
    			camera.position.set(-30, 40, 30);
    			camera.lookAt(0, 0, 0); //      
    
    			//-----------
    
    			//     
    			gPlane = new THREE.PlaneGeometry(70, 50, 1, 1);
    			material = new THREE.MeshLambertMaterial({
          color: 0xeeeeee });
    			mesh = new THREE.Mesh(gPlane, material);
    			mesh.rotation.x = -0.5 * Math.PI;
    			mesh.position.x = 15;
    			mesh.position.y = 0;
    			mesh.position.z = 0;
    			mesh.receiveShadow = true; //  render         
    			scene.add(mesh);
    
    			//     
    			geometry = new THREE.BoxGeometry(4, 4, 4);
    			// mGeometry = new THREE.MeshBasicMaterial({
         
    			// 	color: 0xff0000, //basic          lamber phong       
    			// 	wireframe: true,//    
    			// });
    			mGeometry = new THREE.MeshLambertMaterial({
         
    				color: 0xff0000,
    			});
    			gmesh = new THREE.Mesh(geometry, mGeometry);
    			gmesh.position.x = -4;
    			gmesh.position.y = 2;
    			gmesh.position.z = 0;
    			gmesh.castShadow = true; //  render         
    			scene.add(gmesh);
    
    			//    
    			ball = new THREE.SphereGeometry(4, 20, 20);
    			mball = new THREE.MeshPhongMaterial({
         
    				//  phong    lamber   
    				color: 0x7777ff,
    			});
    			meshball = new THREE.Mesh(ball, mball);
    			meshball.position.x = 25;
    			meshball.position.y = 10;
    			meshball.position.z = 10;
    			meshball.castShadow = true; //  render         
    			scene.add(meshball);
    
    			//    
    			light = new THREE.SpotLight(0xffffff);
    			light.position.set(-40, 60, -10);
    			light.castShadow = true; //  render         
    			scene.add(light);
    
    			ref.current.appendChild(renderer.domElement);
    			renderer.render(scene, camera);
    		}
    
    		//		animate();
    	}, []);
    
    	return <div ref={
         ref}></div>;
    }
    
    export default App;
    
  • 残りの次のノートを書きます.