vue使用three.js实现外部加载模型的自动缩放的效果(进一步优化)

一、vue使用three.js加载外部模型自适应渲染区域大小

1、实现效果

当在http://localhost:8080/#/scale?name=tree2.glb 中name参数中输入不同名字的.glb模型时,都可以自动进行缩放来适用所定义页面的大小。

但需要注意的是:模型需要为.glb格式。若不是glb格式,可以通过blender软件进行导入后再导出为glb格式。

在这里插入图片描述

2、实现思路

(1)定义一个Scene、PerspectiveCamera、WebGLRenderer以及包含AmbientLight和DirectionalLight的混合光。

(2)设置渲染区域大小:this.renderer.setSize(this.width,this.height);

(3)加载外部模型。使用GLTFLoader加载器加载获取到的外部的.glb模型,并把mesh放在group组中,对group进行操作。

(4)因为模型是不规则的,为了更好的计算模型的大小,我们引入了Box3。使用THREE.Box3().setFromObject(group)计算gruop的包围盒的大小,并放group在原点位置。然后根据公式计算得到3d模型对应的画布上group的大小(2D宽度和高度)。

计算过程:

// 计算相机到物体正面的距离。
let dist =Math.abs(self.camera.position.z - group.position.z- (mdwid/2));

// 将垂直fov转换为弧度 。
let vFov = self.camera.fov * Math.PI/180;

// 可见高度。
let vheight = 2 * Math.tan(vFov * 0.5) *dist;

// 可见高度的分数。
let fraction = mdhei / vheight;

// 立方体的高度(以像素为单位)是画布的高度(以像素为单位)的fraction倍。
let finalHeight = self.height * fraction ; 

// 包围盒计算的高/finalHeight = 包围盒计算的宽/finalWidth 。   
let finalWidth = (finalHeight*mdlen) /mdhei;  

(5)通过该2D宽度和高度分别与设置的渲染区域的宽和高相比得到两个不同的缩放比例value1和value1。选取两者较小的值,设置为group的缩放比例。

    let value1 = self.width/finalWidth;
    console.log('value1缩放比例值为:' + value1);
    let value2 = self.height/finalHeight;
    console.log('value2缩放比例值为:' + value2);

    if(value1 >= value2){
        group.scale.set(value2,value2,value2);
    }
    else{
        group.scale.set(value1,value1,value1);
    } 

(6)再一次使用使用THREE.Box3().setFromObject(group)计算gruop的包围盒的大小(这个是缩放后的group

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值