three.js场景最大化 模型加载初始化 最大化 模型中心 场景中心

首先,获得一个包围盒,three.js 的 geometry 对象都有生成包围盒的方法,有包围球和(矩形)包围盒两种,包围球的属性默认已经生成了可以直接访问,包围盒访问前则需要先调用mesh.geometry.computeBoundingBox()。这里有一种情况要考虑:物体是个group或有很多子物体,那么最简单的方法是使用辅助类:" var boxHelper = new THREE.BoxHelper(); boxHelper.setFromObject(mod);",后面举例都使用boxHelper来进行。

接着,访问包围盒属性,矩形:boxHelper.geometry.boundingBox,球形:boxHelper.geometry.boundingSphere。包围球通过半径能获知物体在空间中的大小和中心点;包围盒则是通过最大最小3轴确定物体大小通过geometry.center()获取中心点,任选一种即可。

最后,调整Object3D(所有3d物体的基类)对象位置和缩放比例来达到目标,这时可以这么做:

第一种方法,改变物体属性:

1.缩小物体比例,比例值根据包围球半径或包围盒最大x、z轴计算得到;

2.改变物体的位置,根据包围球或包围盒的大小缩放到合适比例后,position的xyz都设为0即可。

第二种方法,改变相机位置:

这里只根据包围球属性进行描述,包围盒类似。

z轴: 要想看到全景就得把相机往后退,根据半径改变z轴,这个地方大多数情况下camera.position.z = geometry.boundingSphere.radius * 2.2 + geometry.boundingSphere.center.z 就够了。

x轴:camera.position.x = center.x;

y轴:camera.position.y = center.y。

var boxHelper = new THREE.BoxHelper();

boxHelper.setFromObject(object);

boxHelper.geometry.computeBoundingSphere();//一定要先调用计算包围盒后再生成

var center = boxHelper.geometry.boundingSphere.center;//包围球中心

var radius = boxHelper.geometry.boundingSphere.radius;//包围球半径

var cameraPos = new THREE.Vector3(-object.position.x + radius * 1, object.position.y + radius, object.position.z + radius * 2);//相机自适应的位置

var lookPos = new THREE.Vector3(center.x + object.position.x, center.y + object.position.y, center.z + object.position.z);//相机及控制器自适应的目标

camera.position.copy(cameraPos);//初始化场景时,相机自适应的位置

orbitControls.target = lookPos;//初始化场景时,相机控制器的目标

camera.lookAt(lookPos);//初始化场景时,相机的目标,要在OrbitControls实例化之后

这里有个需要注意的地方:如果使用了THREE.OrbitControls进行鼠标控制,那么一定要加上controls.target = lookPos;并在OrbitControls创建了之后加上camera.lookAt(lookPos);

var controls = new THREE.OrbitControls( camera, domElement );
controls.target = lookPos;
camera.lookAt(lookPos);

如此,就能实现了。

附上效果图:

“小车”比“工人”大,通过包围球半径计算后不管大小都能最佳适配。

下面分别依次是:小车,有工人的小车,没有皮肤的工人,工人。

放入多个物体到场景中并且物体位置随机的情况下,想看到整体场景最佳适配到合适位置,如果是这样上面的方法依然有效,只需要把boxHelper的目标object改成场景scene即可:

boxHelper.setFromObject(scene);

只需要得到包围球(或包围盒),group跟scene类似,这里用group举例附包围盒效果图:

three.js中,可以通过修改相机的fov属性来实现鼠标滚轮缩放模型大小的效果。具体来说,当鼠标滚轮向前滚动时,fov需减小,模型大小才会变大;当鼠标滚轮向后滚动时,fov需增大,模型大小才会变小。 为了限制模型大小的缩放范围,可以设置fov的最大值和最小值,当fov达到最大值或最小值时,停止缩放。在Vue3中,可以在组件中添加一个事件监听器来监听鼠标滚轮事件,并在事件处理函数中修改相机的fov属性。 下面是一个示例代码: ``` <template> <div ref="container"></div> </template> <script> import * as THREE from 'three'; export default { mounted() { this.init(); }, methods: { init() { // 创建场景、相机和渲染器 this.scene = new THREE.Scene(); this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); this.renderer = new THREE.WebGLRenderer({ antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.renderer.setClearColor("#222222"); this.$refs.container.appendChild(this.renderer.domElement); // 添加一个立方体模型 const geometry = new THREE.BoxGeometry(); const material = new THREE.MeshBasicMaterial({ color: "#ffffff" }); this.cube = new THREE.Mesh(geometry, material); this.scene.add(this.cube); // 初始化fov值和缩放范围 this.camera.fov = 75; this.minFov = 30; this.maxFov = 120; // 监听鼠标滚轮事件 window.addEventListener('wheel', this.onMouseWheel, false); // 渲染场景 this.renderScene(); }, onMouseWheel(event) { // 根据滚轮滚动方向修改fov值 if (event.deltaY < 0) { this.camera.fov = Math.max(this.camera.fov - 5, this.minFov); } else { this.camera.fov = Math.min(this.camera.fov + 5, this.maxFov); } // 更新相机投影矩阵以实现缩放效果 this.camera.updateProjectionMatrix(); // 重新渲染场景 this.renderScene(); }, renderScene() { this.renderer.render(this.scene, this.camera); } } } ``` 在上面的代码中,我们在mounted钩子函数中调用了init方法来初始化场景、相机和渲染器,并在该方法中添加了一个立方体模型。我们还初始化了相机的fov值和缩放范围,并监听了window对象的wheel事件来实现鼠标滚轮缩放效果。 在onMouseWheel方法中,我们根据鼠标滚轮滚动方向修改相机的fov值,并在fov值达到最大值或最小值时停止缩放。然后,我们调用相机的updateProjectionMatrix方法来更新相机的投影矩阵,以实现缩放效果。最后,我们调用renderScene方法来重新渲染场景。 在Vue3中,我们可以将上述代码封装成一个组件,然后在需要使用的地方使用该组件即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值