使用Three.JS以及A*寻路算法制作自动寻路场景(五)使用多view绘图实现小地图功能

本文介绍了如何使用Three.js结合A*寻路算法创建一个自动寻路的3D场景,并通过多视图渲染技术实现小地图功能。参照three.js官方示例,定义多个视图并初始化相机,调整渲染函数以同时处理主场景和小地图的渲染,最终达成在右上角显示小地图的效果。
摘要由CSDN通过智能技术生成

本节内容:

  1. 使用多view渲染同一场景方法简介
  2. 套用此方法,实现小地图功能,完成本DEMO

本节最终效果图:

使用多view渲染同一场景方法简介

主要参考的three.js官方案例(https://threejs.org/examples/?q=orb#webgl_multiple_views),效果如下:

查看本案例源代码,要实现多view渲染,需要定义一个views数组,存放每个view的camera相关属性,并对每个camera分别进行初始化,并在渲染函数render()中对每个camera分别进行渲染,节选关键代码如下:

var views = [
				{
					left: 0,
					top: 0,
					width: 0.5,
					height: 1.0,
					background: new THREE.Color( 0.5, 0.5, 0.7 ),
					eye: [ 0, 300, 1800 ],
					up: [ 0, 1, 0 ],
					fov: 30,
					updateCamera: function ( camera, scene, mouseX, mouseY ) {
					  camera.position.x += mouseX * 0.05;
					  camera.position.x = Math.max( Math.min( camera.position.x, 2000 ), -2000 );
					  camera.lookAt( scene.position );
					}
				},
				{
					left: 0.5,
					top: 0.5,
					width: 0.5,
					height: 0.5,
					background: new THREE.Color( 0.7, 0.5, 0.5 ),
					eye: [ 0, 1800, 0 ],
					up: [ 0, 0, 1 ],
					fov: 45,
					updateCamera: function ( camera, scene, mouseX, mouseY ) {
					  camera.position.x -= mouseX * 0.05;
					  camera.position.x = Math.max( Math.min( camera.position.x, 2000 ), -2000 );
					  camera.lookAt( camera.position.clone().setY( 0 ) );
					}
				},
				{
					left: 0.5,
					top: 0,
					width: 0.5,
					height: 0.5,
					background: new THREE.Color( 0.5, 0.7, 0.7 ),
					eye: [ 1400, 800, 1400 ],
					up: [ 0, 1, 0 ],
					fov: 60,
					updateCamera: function ( camera, scene, mouseX, mouseY ) {
					  camera.position.y -= mouseX * 0.05;
					  camera.position.y = Math.max( Math.min( camera.position.y, 1600 ), -1600 );
					  camera.lookAt( scene.position );
					}
				}
			];
for (var ii =  0; ii < views.length; ++ii ) {
					var view = views[ii];
					var camera = new THREE.PerspectiveCamera( view.fov, window.innerWidth / window.innerHeight, 1, 10000 );
					camera.position.fromArray( view.eye );
					camera.up.fromArray( view.up );
					view.camera = camera;
				}
for ( var ii = 0; ii < views.length; ++ii ) {
					var view = views[ii];
					var camera = view.camera;
					view.updateCamera( camera, scene, mouseX, mouseY );
					var left   = Math.floor( windowWidth  * view.left );
					var top    = Math.floor( windowHeight * view.top );
					var width  = Math.floor( windowWidth  * view.width );
					var height = Math.floor( windowHeight * view.height );
					renderer.setViewport( left, top, width, height );
					renderer.setScissor( left, top, width, height );
					renderer.setScissorTest( true );
					renderer.setClearColor( view.background );
					camera.aspect = width / height;
					camera.updateProjectionMatrix();
					renderer.render( scene, camera );
				}

套用此方法,实现小地图功能,完成本DEMO

首先,我们需要定义一个Views数组,用来存放本demo需要用到的两个view:

var views = [
				{
					left: 0,
					top: 0,
					width: 1,
					eye: [ 0, 200, 250 ],
					up: [ 0, 1, 0 ],
					fov: 45,
					updateCamera: function ( camera, scene ) {
					  camera.lookAt( scene.position );
					}
				},
				{
					left: 0.75,
					top: 0.7,
					width: 0.3,
					height: 0.3,
					background: new THREE.Color( 0.7, 0.5, 0.5 ),
					eye: [ 0, 200, 0 ],
					up: [ 0, 1, 0 ],
					fov: 60,
					updateCamera: function ( camera, scene) {
					  camera.lookAt( camera.position.clone().setY( 0 ) );
					}
				},
			];

其中views[0]代表主场景,而v

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
threejs是一个用于创建和显示3D图形的JavaScript库。它可以帮助开发人员在网页上实现逼真的3D效果。 A*寻路算法是一种常用的路径规划算法,用于找到从起点到终点的最短路径。它基于图的搜索,并使用启发式函数来评估节点的优先级。在threejs中,A*寻路算法可以应用于3D场景中的对象移动和导航。 使用A*寻路算法,我们可以在threejs实现以下步骤: 1. 创建一个网格地图:将3D场景划分为一个个网格,其中每个网格可以是可通过或不可通过的区域。这个网格地图可以是一个二维数组或者一个图数据结构。 2. 定义起点和终点:在网格地图上指定一个起点和一个终点。起点表示对象当前的位置,终点表示对象希望到达的位置。 3. 计算邻居节点:对于当前节点,计算周围可通过的邻居节点。这些节点将成为A*算法的候选节点。 4. 计算启发式函数:为每个候选节点计算启发式函数的值。启发式函数评估从该节点到目标的预测距离。常用的启发式函数是曼哈顿距离或欧几里得距离。 5. 选择最佳节点:从候选节点中选择具有最低启发式函数值的节点作为下一个节点。将其标记为已访问。 6. 更新路径和开放列表:将选择的节点添加到路径中,并将其邻居节点添加到开放列表中。 7. 重复步骤4至步骤6,直到到达终点或开放列表为空。 8. 生成最短路径:回溯从起点到终点的节点,形成最短路径。 在threejs中,我们可以使用A*寻路算法实现对象的智能导航,让对象能够自动寻找并移动到目标位置。这对于创建逼真的游戏角色、机器人或虚拟导航员非常有用。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值