【VUE2中THREE.JS——将模型转换图片(获取封面)】

来说一个这个里面遇到的问题:
当封面加载完成的时候,本地测试是正常的,不过在测试环境就报错:
Mixed Content: The page at 'https的这是一个url地址' was loaded over HTTPS, but requested an insecure resource '这是一个http的url'. This request has been blocked; the content must be served over HTTPS.
最后的解决办法:
在index.html加一个标签就解决了
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"/>
好了,,接下来就看代码吧!(模型转图片)

import * as THREE from 'three'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
const loader = new GLTFLoader()
const dirLight = new THREE.DirectionalLight(0xffffff, 1)
 loader.load(‘模型的下载地址(我得是https地址)’, function(gltf) {
   // 灯光
   dirLight.color.setHSL(55, 95, 57)
   // eslint-disable-next-line no-undef
   dirLight.position.set(0, 1.75, 0.5)
   dirLight.position.multiplyScalar(20)
   gltf.scene.add(dirLight)
   const hemiLight = new THREE.HemisphereLight(0xffffff, 0x444444)
   hemiLight.position.set(0, 100, 0)
   gltf.scene.add(hemiLight)
   const mixer = new THREE.AnimationMixer(gltf.scene)
   for (var i = 0; i < gltf.animations.length; i++) {
     mixer.clipAction(gltf.animations[i]).play()
   }
   const mesh = gltf.scene.children[0]

   // 创建材质对象
   const material = new THREE.MeshStandardMaterial({ color: 0x7777ff })
   // 将材质应用到网格对象上
   mesh.material = material
   // 创建渲染器
   const renderer = new THREE.WebGLRenderer({
     antialias: true,
     preserveDrawingBuffer: true,
     alpha: true
   })
   renderer.setSize(800, 700)
   renderer.shadowMap.enabled = true
   renderer.setPixelRatio(devicePixelRatio)
   renderer.toneMapping = THREE.LinearToneMapping
   renderer.toneMappingExposure = 0.9 // 曝光系数
   // 创建相机
   const camera = new THREE.PerspectiveCamera(60, 4 / 3, 0.01, 20000)
   camera.position.set(10, 0, 30)
   camera.lookAt(0, 0, 0)
   camera.updateProjectionMatrix()
   // 创建场景
   const scene = new THREE.Scene()
   // const loaders = new THREE.TextureLoader()
   // 设置背景图--不好使
   // scene.background = loaders.load('textures/bg.png')
   // console.log(scene)
   // // 有背景色,但是图片不可以
   // scene.background = new THREE.Color(0xd3d3d3)
   const group = new THREE.Group()
   group.add(gltf.scene)
   // 设置大模型小
   const bbox = new THREE.Box3().setFromObject(group)
   const mdlen = bbox.max.x - bbox.min.x // 边界的最小坐标值 边界的最大坐标值
   const mdhei = bbox.max.y - bbox.min.y
   const mdwid = bbox.max.z - bbox.min.z
   const dist = Math.abs(
     camera.position.z - group.position.z - mdwid / 2
   )
   const vFov = (camera.fov * Math.PI) / 180
   const vheight = 2 * Math.tan(vFov * 0.5) * dist
   const fraction = mdhei / vheight
   const finalHeight = 1000 * fraction
   const finalWidth = (finalHeight * mdhei) / mdlen // 这个地方不对
   const value1 = 600 / finalWidth
   const value2 = 400 / finalHeight
   if (value1 >= value2) {
     scene.scale.set(value2, value2, value2)
   } else {
     scene.scale.set(value1, value1, value1)
   }
   function animate() {
     requestAnimationFrame(animate)
     renderer.render(scene, camera)
   }
   animate()
   scene.add(gltf.scene)
   // 渲染场景
   renderer.render(scene, camera)
   // 将渲染结果转换成图片
   const imgData = renderer.domElement.toDataURL()
   // 将背景图和模型合并一张图片(直接在模型上设置背景图不生效)
   var canvas = document.createElement('canvas')
   canvas.width = 700
   canvas.height = 700
   var context = canvas.getContext('2d')
   context.rect(0, 0, canvas.width, canvas.height)
   context.fill()
   var myImage = new Image()
   myImage.src = 'textures/bg.png'// 背景图片 你自己本地的图片或者在线图片
   myImage.crossOrigin = 'Anonymous'
   myImage.onload = function() {
     context.drawImage(myImage, 0, 0, 700, 700)
     var myImage2 = new Image()
     myImage2.src = imgData // 这是模型图片
     myImage2.crossOrigin = 'Anonymous'
     myImage2.onload = function() {
       context.drawImage(myImage2, 175, 175, 400, 400)
       // base64 就是最后的模型加背景图的base64图片,后续可以根据需求将其转换成https的形式
       var base64 = canvas.toDataURL('image/png')
       //这是我又通过上传接口将其转为https的图片
       const imageData = new FormData()
       imageData.append('file', blobToFile(base64ToBlob(base64), 'thumbnail.png'))
       dispatch('uploadFile', {
         data: imageData
       }).then((uploadImageResult) => {
         resource.thumbnail = uploadImageResult.file.downloadUrl
       }).catch(() => {
         resolve()
       })
     }
   }
 })
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Vue加载3D模型需要使用Three.js库。首先,需要在Vue项目安装Three.js库。然后,可以使用Three.js提供的Loader加载3D模型文件,例如OBJ、FBX、GLTF等格式。加载完成后,可以将模型添加到场景进行渲染。具体的实现可以参考Three.js的官方文档和示例代码。 ### 回答2: 使用vue实现three.js的3D模型加载需要以下步骤: 1. 安装three.js库 在vue项目使用three.js需要先安装three.js库。可以通过npm安装: ```npm install three --save``` 安装后,可以通过需要使用three.js的组件引入库: ```import * as THREE from 'three'``` 2. 创建场景、相机、渲染器 在vue组件内部需要先创建基本的场景、相机和渲染器组件: ```javascript mounted() { //创建场景 this.scene = new THREE.Scene(); //创建相机 this.camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000); //创建渲染器 this.renderer = new THREE.WebGLRenderer({ antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.renderer.setClearColor('#F5F5F5', 1.0); //将渲染器添加到页面 this.$refs.box.appendChild(this.renderer.domElement); } ``` 其,mounted()生命周期函数是在vue组件加载完毕后需要去执行的函数。 3. 加载模型 加载模型需要借助于GLTFLoader库,可以通过npm安装依赖: ```npm install three-gltf-loader --save``` 加载gltf格式的模型需要加载器: ```javascript import { GLTFLoader } from 'three-gltf-loader'; mounted() { //创建GLTFloader对象 this.loader = new GLTFLoader(); //加载模型 this.loader.load(url, object => { this.scene.add(object.scene); this.animate(); }); } ``` 其,url是需要加载的模型地址,object是加载完成后的对象。 4. 更新场景 ```javascript methods: { animate() { this.renderer.render(this.scene, this.camera); //转动,可以忽略 window.requestAnimationFrame(this.animate); this.scene.rotation.y += 0.01; } } ``` 其,animate()方法是更新场景的方法。在该方法需要更新场景的内容,并进行渲染。 5. 完整代码展示 ```javascript <template> <div ref="box"></div> </template> <script> import * as THREE from 'three'; import { GLTFLoader } from 'three-gltf-loader'; export default { data() { return { scene: null, camera: null, renderer: null, loader: null } }, mounted() { //创建场景 this.scene = new THREE.Scene(); //创建相机 this.camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000); //创建渲染器 this.renderer = new THREE.WebGLRenderer({ antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.renderer.setClearColor('#F5F5F5', 1.0); //将渲染器添加到页面 this.$refs.box.appendChild(this.renderer.domElement); //创建GLTFloader对象 this.loader = new GLTFLoader(); //加载模型 this.loader.load(url, object => { this.scene.add(object.scene); this.animate(); }); }, methods: { animate() { this.renderer.render(this.scene, this.camera); //转动,可以忽略 window.requestAnimationFrame(this.animate); this.scene.rotation.y += 0.01; } } } </script> ``` 这就是vuethree.js加载3D模型的完整教程,希望对你有所帮助。 ### 回答3: Vue是一种流行的JavaScript框架,而three.js是一个强大的WebGL库,用于创建和呈现3D图形。将Vuethree.js结合使用,可以在Vue应用程序轻松加载和处理3D模型。 要在Vue加载3D模型,首先需要安装three.js库。可以使用npm或yarn等包管理工具安装它。然后在Vue应用程序导入该库并创建一个Scene对象。场景是three.js用于呈现所有3D对象的容器。 然后需要定义一个渲染器,将场景渲染到屏幕上。在Vue,可以在组件的mounted钩子函数定义渲染器。需要将渲染器的DOM元素设置为Vue组件的$el属性。 现在就可以加载3D模型了。可以使用three.js的Loader方法加载3D模型文件。three.js支持多种3D模型格式,如OBJ、STL和GLTF。加载完成后,将3D对象添加到场景即可。 由于Vue具有响应式数据绑定的特性,可以在Vue组件轻松地控制3D模型的属性,比如位置、旋转和缩放。只需在Vue组件定义数据模型,并在模板使用数据绑定即可。 在Vue使用three.js创建3D场景需要一些基本的知识,但很容易上手。可以使用Vuethree.js创建漂亮的3D场景和模型,从而增强Vue应用程序的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值