From 72b715e2eadafedad6408e6e1dcf0e1e7d3397af Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期五, 19 四月 2024 10:19:09 +0800
Subject: [PATCH] #

---
 public/models/tree/textures/twig_baseColor.png                 |    0 
 public/models/tree/textures/twig_normal.png                    |    0 
 src/components/tree.jsx                                        |   33 ++++
 src/components/tree-group.jsx                                  |   34 ++++
 public/models/tree/license.txt                                 |   11 +
 public/models/tree/scene.gltf                                  |  305 ++++++++++++++++++++++++++++++++++++++
 public/models/tree/scene.bin                                   |    0 
 src/components/buidings.jsx                                    |   36 ++++
 src/pages/base.jsx                                             |    4 
 public/models/tree/textures/Material.003_normal.png            |    0 
 public/models/tree/textures/Material.003_baseColor.png         |    0 
 public/models/tree/textures/Material.003_metallicRoughness.png |    0 
 12 files changed, 423 insertions(+), 0 deletions(-)

diff --git a/public/models/tree/license.txt b/public/models/tree/license.txt
new file mode 100644
index 0000000..385ca83
--- /dev/null
+++ b/public/models/tree/license.txt
@@ -0,0 +1,11 @@
+Model Information:
+* title:	Tree For Games
+* source:	https://sketchfab.com/3d-models/tree-for-games-f91d3c3c527d47fdb217c291e4c7df4b
+* author:	Daniel Gryningstjerna (https://sketchfab.com/dangry)
+
+Model License:
+* license type:	CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
+* requirements:	Author must be credited. Commercial use is allowed.
+
+If you use this 3D model in your project be sure to copy paste this credit wherever you share it:
+This work is based on "Tree For Games" (https://sketchfab.com/3d-models/tree-for-games-f91d3c3c527d47fdb217c291e4c7df4b) by Daniel Gryningstjerna (https://sketchfab.com/dangry) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)
\ No newline at end of file
diff --git a/public/models/tree/scene.bin b/public/models/tree/scene.bin
new file mode 100644
index 0000000..0ce0e2a
--- /dev/null
+++ b/public/models/tree/scene.bin
Binary files differ
diff --git a/public/models/tree/scene.gltf b/public/models/tree/scene.gltf
new file mode 100644
index 0000000..8fa2d8e
--- /dev/null
+++ b/public/models/tree/scene.gltf
@@ -0,0 +1,305 @@
+{
+  "accessors": [
+    {
+      "bufferView": 2,
+      "componentType": 5126,
+      "count": 24000,
+      "max": [5.400895595550537, 7.487784385681152, 18.686132431030273],
+      "min": [-9.135818481445313, -5.771036148071289, 2.366610050201416],
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 2,
+      "byteOffset": 288000,
+      "componentType": 5126,
+      "count": 24000,
+      "max": [0.9998490214347839, 0.9998508095741272, 0.9999715685844421],
+      "min": [-0.9998549222946167, -0.999925434589386, -0.7359607815742493],
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 3,
+      "componentType": 5126,
+      "count": 24000,
+      "max": [0.999908447265625, 0.9999664425849915, 0.9999536871910095, 1.0],
+      "min": [-0.9999274611473083, -0.9999757409095764, -0.9997327923774719, 1.0],
+      "type": "VEC4"
+    },
+    {
+      "bufferView": 1,
+      "componentType": 5126,
+      "count": 24000,
+      "max": [1.0, 1.0],
+      "min": [0.08360499888658524, 0.0],
+      "type": "VEC2"
+    },
+    {
+      "bufferView": 0,
+      "componentType": 5125,
+      "count": 66000,
+      "type": "SCALAR"
+    },
+    {
+      "bufferView": 2,
+      "byteOffset": 576000,
+      "componentType": 5126,
+      "count": 8183,
+      "max": [3.571387767791748, 6.172538757324219, 17.16339683532715],
+      "min": [-7.341711521148682, -4.2624993324279785, -0.06279468536376953],
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 2,
+      "byteOffset": 674196,
+      "componentType": 5126,
+      "count": 8183,
+      "max": [0.9991750717163086, 0.9992162585258484, 0.9997866153717041],
+      "min": [-0.9998805522918701, -0.9994327425956726, -0.9999834299087524],
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 3,
+      "byteOffset": 384000,
+      "componentType": 5126,
+      "count": 8183,
+      "max": [0.9995247721672058, 0.9998559355735779, 0.9999619126319885, 1.0],
+      "min": [-0.9989302754402161, -0.9997038841247559, -0.9998242259025574, -1.0],
+      "type": "VEC4"
+    },
+    {
+      "bufferView": 1,
+      "byteOffset": 192000,
+      "componentType": 5126,
+      "count": 8183,
+      "max": [1.0, 210.26849365234375],
+      "min": [0.0, 0.0],
+      "type": "VEC2"
+    },
+    {
+      "bufferView": 1,
+      "byteOffset": 257464,
+      "componentType": 5126,
+      "count": 8183,
+      "max": [1.0, 210.26849365234375],
+      "min": [0.0, 0.0],
+      "type": "VEC2"
+    },
+    {
+      "bufferView": 0,
+      "byteOffset": 264000,
+      "componentType": 5125,
+      "count": 33486,
+      "type": "SCALAR"
+    }
+  ],
+  "asset": {
+    "extras": {
+      "author": "Daniel Gryningstjerna (https://sketchfab.com/dangry)",
+      "license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)",
+      "source": "https://sketchfab.com/3d-models/tree-for-games-f91d3c3c527d47fdb217c291e4c7df4b",
+      "title": "Tree For Games"
+    },
+    "generator": "Sketchfab-12.65.0",
+    "version": "2.0"
+  },
+  "bufferViews": [
+    {
+      "buffer": 0,
+      "byteLength": 397944,
+      "name": "floatBufferViews",
+      "target": 34963
+    },
+    {
+      "buffer": 0,
+      "byteLength": 322928,
+      "byteOffset": 397944,
+      "byteStride": 8,
+      "name": "floatBufferViews",
+      "target": 34962
+    },
+    {
+      "buffer": 0,
+      "byteLength": 772392,
+      "byteOffset": 720872,
+      "byteStride": 12,
+      "name": "floatBufferViews",
+      "target": 34962
+    },
+    {
+      "buffer": 0,
+      "byteLength": 514928,
+      "byteOffset": 1493264,
+      "byteStride": 16,
+      "name": "floatBufferViews",
+      "target": 34962
+    }
+  ],
+  "buffers": [
+    {
+      "byteLength": 2008192,
+      "uri": "scene.bin"
+    }
+  ],
+  "images": [
+    {
+      "uri": "textures/Material.003_baseColor.png"
+    },
+    {
+      "uri": "textures/Material.003_metallicRoughness.png"
+    },
+    {
+      "uri": "textures/Material.003_normal.png"
+    },
+    {
+      "uri": "textures/twig_baseColor.png"
+    },
+    {
+      "uri": "textures/twig_normal.png"
+    }
+  ],
+  "materials": [
+    {
+      "alphaCutoff": 0.513910061,
+      "alphaMode": "MASK",
+      "doubleSided": true,
+      "name": "Material.003",
+      "normalTexture": {
+        "index": 2
+      },
+      "occlusionTexture": {
+        "index": 1
+      },
+      "pbrMetallicRoughness": {
+        "baseColorTexture": {
+          "index": 0
+        },
+        "metallicFactor": 0.0,
+        "metallicRoughnessTexture": {
+          "index": 1
+        }
+      }
+    },
+    {
+      "doubleSided": true,
+      "name": "twig",
+      "normalTexture": {
+        "index": 4
+      },
+      "pbrMetallicRoughness": {
+        "baseColorTexture": {
+          "index": 3
+        },
+        "metallicFactor": 0.0,
+        "roughnessFactor": 0.8614710366
+      }
+    }
+  ],
+  "meshes": [
+    {
+      "name": "Plane.197_Material.003_0",
+      "primitives": [
+        {
+          "attributes": {
+            "NORMAL": 1,
+            "POSITION": 0,
+            "TANGENT": 2,
+            "TEXCOORD_0": 3
+          },
+          "indices": 4,
+          "material": 0,
+          "mode": 4
+        }
+      ]
+    },
+    {
+      "name": "Plane.197_twig_0",
+      "primitives": [
+        {
+          "attributes": {
+            "NORMAL": 6,
+            "POSITION": 5,
+            "TANGENT": 7,
+            "TEXCOORD_0": 8,
+            "TEXCOORD_1": 9
+          },
+          "indices": 10,
+          "material": 1,
+          "mode": 4
+        }
+      ]
+    }
+  ],
+  "nodes": [
+    {
+      "children": [1],
+      "matrix": [
+        1.0, 0.0, 0.0, 0.0, 0.0, 2.220446049250313e-16, -1.0, 0.0, 0.0, 1.0, 2.220446049250313e-16,
+        0.0, 0.0, 0.0, 0.0, 1.0
+      ],
+      "name": "Sketchfab_model"
+    },
+    {
+      "children": [2],
+      "matrix": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
+      "name": "306efb0fa3a749b9949c2d453c8b1996.fbx"
+    },
+    {
+      "children": [3],
+      "name": "RootNode"
+    },
+    {
+      "children": [4, 5],
+      "matrix": [
+        107.69481487779977, -13.92748808083238, 24.568147443357724, 0.0, 26.623339536963893,
+        17.75615160642657, -106.63795628231195, 0.0, 9.421586570876043, 109.02516209968464,
+        20.50584502596355, 0.0, 0.0, 0.0, 5.9604644775390625e-6, 1.0
+      ],
+      "name": "Plane.197"
+    },
+    {
+      "mesh": 0,
+      "name": "Plane.197_Material.003_0"
+    },
+    {
+      "mesh": 1,
+      "name": "Plane.197_twig_0"
+    }
+  ],
+  "samplers": [
+    {
+      "magFilter": 9729,
+      "minFilter": 9987,
+      "wrapS": 10497,
+      "wrapT": 10497
+    }
+  ],
+  "scene": 0,
+  "scenes": [
+    {
+      "name": "Sketchfab_Scene",
+      "nodes": [0]
+    }
+  ],
+  "textures": [
+    {
+      "sampler": 0,
+      "source": 0
+    },
+    {
+      "sampler": 0,
+      "source": 1
+    },
+    {
+      "sampler": 0,
+      "source": 2
+    },
+    {
+      "sampler": 0,
+      "source": 3
+    },
+    {
+      "sampler": 0,
+      "source": 4
+    }
+  ]
+}
diff --git a/public/models/tree/textures/Material.003_baseColor.png b/public/models/tree/textures/Material.003_baseColor.png
new file mode 100644
index 0000000..04407fc
--- /dev/null
+++ b/public/models/tree/textures/Material.003_baseColor.png
Binary files differ
diff --git a/public/models/tree/textures/Material.003_metallicRoughness.png b/public/models/tree/textures/Material.003_metallicRoughness.png
new file mode 100644
index 0000000..1c7e17f
--- /dev/null
+++ b/public/models/tree/textures/Material.003_metallicRoughness.png
Binary files differ
diff --git a/public/models/tree/textures/Material.003_normal.png b/public/models/tree/textures/Material.003_normal.png
new file mode 100644
index 0000000..2a04c62
--- /dev/null
+++ b/public/models/tree/textures/Material.003_normal.png
Binary files differ
diff --git a/public/models/tree/textures/twig_baseColor.png b/public/models/tree/textures/twig_baseColor.png
new file mode 100644
index 0000000..cee74ce
--- /dev/null
+++ b/public/models/tree/textures/twig_baseColor.png
Binary files differ
diff --git a/public/models/tree/textures/twig_normal.png b/public/models/tree/textures/twig_normal.png
new file mode 100644
index 0000000..b4398da
--- /dev/null
+++ b/public/models/tree/textures/twig_normal.png
Binary files differ
diff --git a/src/components/buidings.jsx b/src/components/buidings.jsx
new file mode 100644
index 0000000..87544dd
--- /dev/null
+++ b/src/components/buidings.jsx
@@ -0,0 +1,36 @@
+// 鏂板缓妤肩兢
+import React from 'react';
+import { useThree } from '@react-three/fiber';
+import * as THREE from 'three';
+
+const Buildings = () => {
+  const { scene } = useThree();
+  const group = new THREE.Group();
+  const geometry = new THREE.BoxGeometry(10, 10, 10);
+  const material = new THREE.MeshStandardMaterial({ color: 0xeeeeee, flatShading: true });
+  for (let i = 0; i < 300; i++) {
+    const mesh = new THREE.Mesh(geometry, material);
+    // 璁剧疆mesh閫忔槑搴�
+    // mesh.material.opacity = 0.5;
+    const randomValue = Math.random() < 0.5 ? -1 : 1;
+    const randomValue1 = Math.random() < 0.5 ? -1 : 1;
+    // mesh鎺ユ敹鎶曞奖
+    mesh.receiveShadow = true;
+    mesh.position.x = Math.random() * 8000 * randomValue1 + randomValue1 * 2000;
+    mesh.position.y = 0;
+    mesh.position.z = Math.random() * 8000 * randomValue + randomValue * 2000;
+    mesh.scale.x = 10;
+    mesh.scale.y = Math.random() * 80 + 10;
+    mesh.scale.z = 10;
+    // 璁剧疆鏀惧ぇ鍩虹偣浣嶇疆
+    mesh.updateMatrix();
+    mesh.matrixAutoUpdate = false;
+    group.add(mesh);
+  }
+  // group.add(cube);
+  scene.add(group);
+  // 闆炬坊鍔犳ā绯婃晥鏋�
+  scene.fog = new THREE.FogExp2(0x000000, 0.000085);
+  return <group>{/* <fog attach="fog" args={['#ff0000', 100, 10000]} /> */}</group>;
+};
+export default Buildings;
diff --git a/src/components/tree-group.jsx b/src/components/tree-group.jsx
new file mode 100644
index 0000000..058a342
--- /dev/null
+++ b/src/components/tree-group.jsx
@@ -0,0 +1,34 @@
+import React from "react";
+import * as THREE from "three";
+import TreeModel from "./tree";
+
+const trees = [
+	{
+		position: new THREE.Vector3(1600, 0, 0),
+		scale: new THREE.Vector3(0.06, 0.06, 0.06)
+	},
+	{
+		position: new THREE.Vector3(0, 0, 1500),
+		scale: new THREE.Vector3(0.1, 0.1, 0.1)
+	},
+	{
+		position: new THREE.Vector3(100, 0, 1500),
+		scale: new THREE.Vector3(0.1, 0.1, 0.1)
+	},
+	{
+		position: new THREE.Vector3(310, 0, 1500),
+		scale: new THREE.Vector3(0.13, 0.13, 0.13)
+	}
+];
+
+function TreeGroup() {
+	return (
+		<group>
+			{trees.map((tree, index) => (
+				<TreeModel key={index} position={tree.position} scale={tree.scale} />
+			))}
+		</group>
+	);
+}
+
+export default TreeGroup;
diff --git a/src/components/tree.jsx b/src/components/tree.jsx
new file mode 100644
index 0000000..f675592
--- /dev/null
+++ b/src/components/tree.jsx
@@ -0,0 +1,33 @@
+import React, { useEffect, useRef } from 'react';
+import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
+import { useLoader } from '@react-three/fiber';
+
+const TreeModel = ({ position, scale }) => {
+  const gltfRef = useRef(null);
+  const gltf = useLoader(
+    GLTFLoader,
+    '/models/tree/scene.gltf'
+  );
+
+  const setShadow = (obj) => {
+    if (obj.children) {
+      obj.children.forEach((child) => {
+        child.castShadow = true;
+        child.receiveShadow = true;
+        setShadow(child);
+      });
+    }
+  };
+  if (gltf.scene) {
+    setShadow(gltf.scene);
+    gltfRef.current = gltf.scene.clone();
+  }
+
+  return (
+    <>
+      <primitive position={position} object={gltfRef.current} castShadow scale={scale} />
+    </>
+  );
+};
+
+export default TreeModel;
diff --git a/src/pages/base.jsx b/src/pages/base.jsx
index e59411c..c36017f 100644
--- a/src/pages/base.jsx
+++ b/src/pages/base.jsx
@@ -5,6 +5,8 @@
 import Help from '@/components/help'
 import Lights from '@/components/light'
 import Camera from '@/components/camera'
+import Buildings from '@/components/buidings'
+import TreeGroup from '../components/tree-group'
 
 const Base = (props) => {
     return (
@@ -18,6 +20,8 @@
                 <Lights />
                 <Camera />
                 <Sky distance={450000} sunPosition={[0, 1, 0]} inclination={0} azimuth={0.25} />
+                <Buildings />
+                <TreeGroup />
                 <Box position={[0, 0, 0]} />
                 <OrbitControls />
                 <Environment background preset="warehouse" />

--
Gitblit v1.9.1