panhui 4 лет назад
Родитель
Сommit
a832218b02

+ 4 - 2
src/main/nine-space/src/components/product/ProductBanner.vue

@@ -37,7 +37,7 @@
                     <span>分享</span>
                 </div>
             </div>
-            <!-- <three-mode></three-mode> -->
+            <three-mode></three-mode>
         </div>
 
         <post ref="post" :info="info" noButton :pageUrl="pageUrl" />
@@ -53,6 +53,7 @@ import 'swiper/swiper-bundle.min.css';
 import product from '../../mixins/product';
 import Post from '../Post.vue';
 import { ImagePreview } from 'vant';
+import ThreeMode from './ThreeMode.vue';
 // import ThreeMode from './ThreeMode.vue';
 
 export default {
@@ -72,7 +73,8 @@ export default {
     components: {
         Swiper,
         SwiperSlide,
-        Post
+        Post,
+        ThreeMode
     },
     computed: {
         banners() {

+ 159 - 0
src/main/nine-space/src/components/product/ThreeMode.vue

@@ -0,0 +1,159 @@
+<template>
+    <div class="mode">
+        <canvas ref="three"></canvas>
+    </div>
+</template>
+
+<script>
+import * as THREE from 'three';
+import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
+import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';
+import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
+export default {
+    data() {
+        return {
+            scene: null,
+            light: null,
+            camera: null,
+            renderer: null,
+            controls: null,
+            mesh: null,
+            angularSpeed: 0.2,
+            lastTime: 0,
+            farmeCount: 0
+        };
+    },
+    mounted() {
+        this.init();
+    },
+    methods: {
+        init() {
+            const scene = new THREE.Scene();
+            scene.background = new THREE.Color('#181818');
+            const canvas = this.$refs.three;
+            const renderer = new THREE.WebGLRenderer({ canvas, antialias: true });
+            const camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.1, 1000);
+            camera.position.z = 90;
+            this.scene = scene;
+            this.camera = camera;
+            this.renderer = renderer;
+            const fbxLoader = new FBXLoader();
+            var mesh = null;
+            fbxLoader.load('https://zhirongip.oss-cn-hangzhou.aliyuncs.com/cs_xong.FBX', fbx => {
+                console.log(fbx);
+                mesh = fbx;
+                mesh.scale.multiplyScalar(0.3);
+                mesh.position.set(0, 0, 0);
+                // mesh.rotation.x = -45;
+                //添加这段代码
+                //遍历模型每部分
+                // mesh.traverse(o => {
+                //     //将图片作为纹理加载
+                //     let explosionTexture = new THREE.TextureLoader().load(
+                //         'https://zhirongip.oss-cn-hangzhou.aliyuncs.com/matilda/textures/color.2.1001.png'
+                //     );
+                //     //调整纹理图的方向
+                //     explosionTexture.flipY = true;
+                //     //将纹理图生成基础网格材质(MeshBasicMaterial)
+                //     const material = new THREE.MeshBasicMaterial({
+                //         map: explosionTexture
+                //     });
+                //     //给模型每部分上材质
+                //     o.material = material;
+                // });
+                scene.add(fbx);
+            });
+
+            const controls = new OrbitControls(camera, renderer.domElement);
+            controls.enableDamping = true;
+            const clock = new THREE.Clock();
+            function animate() {
+                controls.update();
+                renderer.render(scene, camera);
+                requestAnimationFrame(animate);
+
+                const time = Date.now() * 0.0005;
+                const delta = clock.getDelta();
+
+                if (mesh) mesh.rotation.y -= 0.5 * delta;
+
+                //添加下面代码
+                if (resizeRendererToDisplaySize(renderer)) {
+                    const canvas = renderer.domElement;
+                    camera.aspect = canvas.clientWidth / canvas.clientHeight;
+                    camera.updateProjectionMatrix();
+                }
+            }
+            animate();
+
+            function resizeRendererToDisplaySize(renderer) {
+                const canvas = renderer.domElement;
+                var width = window.innerWidth;
+                var height = window.innerHeight;
+                var canvasPixelWidth = canvas.width / window.devicePixelRatio;
+                var canvasPixelHeight = canvas.height / window.devicePixelRatio;
+
+                const needResize = canvasPixelWidth !== width || canvasPixelHeight !== height;
+                if (needResize) {
+                    renderer.setSize(width, height, false);
+                }
+                return needResize;
+            }
+        },
+        rorateAnimate() {}
+        // init() {
+        //     this.scene = new THREE.Scene();
+        //     this.scene.add(new THREE.AmbientLight(0x404040, 6)); //环境光
+        //     this.light = new THREE.DirectionalLight(0xdfebff, 0.45); //从正上方(不是位置)照射过来的平行光,0.45的强度
+        //     this.light.position.set(50, 200, 100);
+        //     this.light.position.multiplyScalar(0.3);
+        //     this.scene.add(this.light);
+        //     /**
+        //      * 相机设置
+        //      */
+        //     let container = this.$refs.three; //显示3D模型的容器
+        //     this.camera = new THREE.PerspectiveCamera(70, container.clientWidth / container.clientHeight, 0.01, 10);
+        //     this.camera.position.z = 1;
+        //     /**
+        //      * 创建渲染器对象
+        //      */
+        //     this.renderer = new THREE.WebGLRenderer({ alpha: true });
+        //     this.renderer.setSize(container.clientWidth, container.clientHeight);
+        //     container.appendChild(this.renderer.domElement);
+        //     //创建控件对象
+        //     this.controls = new OrbitControls(this.camera, this.renderer.domElement);
+        // },
+        // loadFbx() {
+        //     let self = this;
+        //     let fbxLoader = new FBXLoader();
+        //     //load一个测试模型路径:public/model/zhuozi2.gltf
+        //     fbxLoader.load('https://zhirongip.oss-cn-hangzhou.aliyuncs.com/cs_xong.FBX', function (fbx) {
+        //         self.isLoading = false; //关闭载入中效果
+        //         self.mesh = fbx;
+        //         // self.mesh.scale.set(0.4, 0.4, 0.4); //设置大小比例
+        //         // self.mesh.position.set(0, 0, 0); //设置位置
+        //         self.scene.add(self.mesh); // 将模型引入three、
+        //         self.animate();
+        //     });
+        // },
+        // animate() {
+        //     if (this.mesh) {
+        //         requestAnimationFrame(this.animate);
+
+        //         // this.mesh.rotation.x += 0.01;
+        //         this.mesh.rotation.y += 0.004;
+        //         this.renderer.render(this.scene, this.camera);
+        //     }
+        // }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.mode {
+    canvas {
+        width: 100vw;
+        height: 100vw;
+    }
+}
+</style>